把写歌时的手机语音备忘转成可搜的文本,我用 whisper.cpp 跑了一晚上

手机里攒了两年多的语音备忘,一共 437 条,,全是随手哼的动机、几句词、一段和弦走向的口述。文件名是 iOS 默认的「新录音 12.m4a」这种,时间一长完全不知道哪条是什么。想找「那个下行的副歌旋律」只能一条条点开听,听到第十条就烦了。

我的做法很土:先把它们从手机导出来,转成 16k 单声道 wav,再用 whisper.cpp 的 small 模型批量转文字,最后把结果和文件名拼成一份 Markdown 索引。

# 批量转 wav,whisper.cpp 只吃 16k 单声道
for f in *.m4a; do
  ffmpeg -i "$f" -ar 16000 -ac 1 "${f%.m4a}.wav" -y
done

# 转文字,输出到同名 txt
for f in *.wav; do
  ./main -m models/ggml-small.bin -f "$f" -otxt -of "${f%.wav}"
done

437 条里有 300 多条是纯哼唱,没词。这部分转出来基本是空的或者一串乱码,但空文件本身就是信息——说明这条是纯旋律动机,得自己听。真正有词的 90 多条,转出来的文字质量参差,口齿清楚、离麦近的那些,能认出七八成。

为什么用 small 而不是 base:base 对中文口述的识别率掉得厉害,同一段词能错一半。small 在我的机器上跑 437 条大概一晚上,可以接受。代价是它会把哼唱硬翻译成一些莫名其妙的词,所以我没有直接把 txt 当内容用,而是只拿它当「这条大概在说什么」的检索钩子。

索引我是手工拼的,一条一行,格式是 日期 | 文件名 | 一句摘要 | 标签。摘要优先抄转出来的文字,没有文字的写「纯哼唱,疑似副歌下行」。这一步没自动化,因为自动摘要对哼唱无效,对词又容易抄错,我宁可慢。

失效的地方说清楚:环境噪音大的录音,比如在街上哼的,转出来全是幻觉词,比空文件更误导;另外 m4a 转 wav 时如果原文件是立体声且左右声道内容不同(我用两支麦录过几次),转单声道会抵消掉一部分,听起来像丢了高频。后来这几条我单独用 -ac 2 保留原样,没进批处理。

现在搜「副歌」「慢」「那个词」能在索引里定位到几条候选,再点开听。比全凭记忆强,但也仅此而已——它解决的是「找得到」,不是「找得准」。

你们对纯哼唱、没词的动机是怎么做检索的?我目前只能靠标签和记忆,感觉这块 whisper 帮不上忙。

0
Approval 100% · 0 comments · 3 Reads

0 comments

Markdown supported · replies push in real time

No comments yet — be the first.