把写歌时的哼唱备忘录按「情绪」分堆,我用了三个笨办法

我手机里有 217 条语音备忘录,全是写歌时随手哼的。文件名从「新建录音 1」到「新建录音 217」,内容大部分是 20 到 40 秒的一段人声,没有伴奏,偶尔夹着琴键声和楼道回音。这些文件的真正问题不是找不到调,而是我不知道哪一条适合做副歌、哪一条适合做前奏。上周我试着按情绪把它们分堆,用了三个不太聪明但能跑的办法。

第一步是做一组固定标签,不靠听感临时判断。我先用 Python 的 librosa 提了每条录音的 RMS 能量均值和频谱质心,这两项一个粗略对应「强弱」,一个粗略对应「明暗」。脚本很短:

import librosa, numpy as np, glob, csv

rows = []
for f in sorted(glob.glob("memos/*.m4a")):
    y, sr = librosa.load(f, sr=22050, mono=True)
    rms = float(np.mean(librosa.feature.rms(y=y)))
    centroid = float(np.mean(librosa.feature.spectral_centroid(y=y, sr=sr)))
    rows.append((f, rms, centroid))

with open("memos.csv", "w", newline="") as fh:
    w = csv.writer(fh)
    w.writerow(["file", "rms", "centroid"])
    w.writerows(rows)

第二步是把均值当坐标画散点,横轴 rms、纵轴 centroid,肉眼先把明显偏左上、偏右下、居中三团分开,再给每团起一个我能记住的名字,比如「低而暗」「高而亮」「中间稳」。第三步才是听:每团抽 10 条,边听边在文件名前加一个前缀,例如 [低暗]_新建录音 42.m4a。这一步我没有自动化,因为听感这件事我信不过聚类。

为什么用均值而不是更精细的特征:我试过用 MFCC 聚类,结果把同一段旋律的两个版本分到了不同堆,因为录音距离和房间混响差异太大。均值粗糙,但稳定,217 条录音里只有 9 条落在两团边界上,我手动归了类。代价是它无法区分「同一情绪的不同力度」,比如轻声哼和放声唱会被拆开,这在我这里是可接受的。

失效的地方也很明显。清唱录音的 RMS 受嘴离手机远近影响极大,我用 -16 LUFS 做过一次响度对齐再重算,结果有一半文件因为开头有静音段被拉高,反而更乱。另外,频谱质心对「嗯」「啊」这类元音特别敏感,同一段旋律换个元音,坐标能偏出好几格。所以这套方法只适合把「完全没头绪」变成「三堆里选一堆」,不能替代试听。

现在我的 217 条变成了三堆加一个「拿不准」文件夹。真正的问题是:你们会在写歌早期给动机贴情绪标签吗,还是等编曲方向定了再回头分类?我有点怀疑前者会把歌写窄。

0
赞同度 100% · 0 条评论 · 1 阅读

0 条评论

支持 Markdown · 回复会实时推送给对方

还没有评论,写下第一条。