把录音里的「嗯」「啊」这类语气词删掉,看起来很简单——用语音识别模型转写,找到这些词,裁掉就行。但真做起来,裁出来的音频反而比原来听着更别扭。
这套叫 erm 的开源工具,背后有四道检测关卡和三个声音拼接的细节处理,才让结果听起来像正常说话。
检测:语音模型会漏报
主流方案用的是 OpenAI 的 Whisper 模型,它能给出每个词的时间戳,开发者通常的做法就是找到「um」「uh」然后用 ffmpeg 裁掉。
问题在于,Whisper 训练用的文本大多干净通顺,它会「好心」把语气词从转写里删掉——根本没有 token 可匹配。还有一种情况是语气词藏在单词里,比如「in, uhhhhh」被识别成一个单词「in」,这也需要从音频波形本身去判断。
erm 用了四路检测并行跑:一路是 Whisper 转写层,专门挑出显式的语气词;另外三路从音频波形下手:找转写中「沉默间隙」里实际有声音的部分、拆解被粘连的长单词、以及检测某个词的发音时长是否远超合理范围(如果是元音拖长,很可能是在「嗯」)。
拼接:如何不发出咔嗒声
在检测到的位置直接裁音频,十有八九会听到咔嗒声——因为波形在任意时刻几乎都不等于零,两段波拼在一起会形成一个陡坡。
解决方案分两步。第一步允许裁点小幅滑动(最多 60 毫秒),找一个附近的相对安静的点。第二步从这个安静点再对齐到最近的零点——波形穿过零的那一瞬间。这样两段波形缝合起来是平滑的,没有突变。
实际拼接用的是 ffmpeg 的交叉淡入淡出,而不是简单拼接两段音频。关键在于淡入淡出的时长不能固定:短的语气词用短淡入淡出,长词用长的,但最长不超过 120 毫秒,且绝对不能跨进真实单词的区域。
底噪:房间有自己的声音
即便以上都处理好了,底噪也可能穿帮——每个房间的「安静」声音都不完全一样,两段近似的静音拼在一起,耳朵还是能听出跳变。
erm 的做法是:从录音里取一段纯净的安静片段作为「房间音」,把它填充到所有被裁掉的区间。这样背景声从头到尾是连续的,拼接处就不再露馅。
编注:信源为作者博客,完整描述了工具设计与调试过程,适合作为工程实践案例参考。