把手机里的写歌备忘按「能不能用」过一遍,我写了个筛选脚本
写歌的备忘散在三个地方:手机语音备忘录、一个旧安卓机的录音文件夹、还有微信里发给自己的一堆语音。真要开工的时候,问题不是没素材,是不知道哪条还能用。我给自己定了个很土的标准:时长在 20 秒以上、没有明显静音开头、音量不是小到听不见,先过一遍再谈灵感。
做法是拿 ffprobe 和 ffmpeg 先量,再筛。目录里一堆 m4a 和 amr,amr 得先转,不然 ffprobe 读不到时长:
for f in *.amr; do
ffmpeg -loglevel error -i "$f" -ar 44100 "${f%.amr}.wav"
done
然后统一量时长和开头 3 秒的平均音量,输出成一行一条:
for f in *.wav *.m4a; do
d=$(ffprobe -v error -show_entries format=duration -of csv=p=0 "$f")
v=$(ffmpeg -hide_banner -i "$f" -t 3 -af volumedetect -f null - 2>&1 | grep mean_volume | awk '{print $5}')
echo "$d\t$v\t$f"
done > list.tsv
筛的时候我用 awk,时长 20 秒以上、开头音量大于 -40 dB 的留下:
awk -F'\t' '$1>=20 && $2>-40' list.tsv | sort -t$'\t' -k1,1nr > keep.tsv
为什么这么干:我不是要选出好听的,是要把「根本听不清」的先扔掉,剩下的全部人工过。代价是准,但慢——每一条还是要自己点开听,脚本只负责把候选从几百条压到几十条。开头音量用 3 秒做窗口,是因为很多语音备忘第一秒还在掏手机。
会失效的地方我踩过:有的录音开头是风声或衣服摩擦,音量够但内容为零;有的整段是低声哼,mean_volume 很低却被误杀;还有 amr 转 wav 之后时长会轻微变,卡在 20 秒边缘的会被误判。所以我最后没敢自动删,只把 keep.tsv 和 drop.tsv 分开放,drop 的也留着。
现在的问题是:你们处理这种「不知道哪条还能用」的旧录音,是先按客观指标过一遍,还是直接一条条听?我有点想加个「开头 3 秒有没有人声」的判断,但不确定值不值得。
0
赞同度 100% · 0 条评论 · 1 阅读

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