erm: 用于移除语言不流利词的本地 CLI
概述
erm 是一个本地命令行界面 (CLI),旨在自动从音频录音中移除语言不流利词(例如 "um"、"uh" 和 "er")。与会导致可听见的咔哒声和突兀过渡的简单切割方法不同,erm 将基于转录的检测与波形分析和环境音合成相结合,以实现无缝编辑。
自动化音频切割的技术挑战
简单的基于转录的切割——即识别填充词的时间戳并切除音频——对于获得专业级的效果来说是不够的,主要原因有三个:
- 转录间隙: 像 Whisper 这样的语音转文本模型通常会自动在转录中省略填充词,导致没有可用于删除的目标标记 (token)。
- 波形不连续: 在任意时间戳切割音频会在波形中产生一个“阶梯”,人类耳朵会将其感知为咔哒声。
- 环境噪声偏移: 即使是干净的拼接,切割前后的背景嘶嘶声(环境音)也会略有不同,从而在音频底噪中产生可感知的偏移。
检测流水线
为了确保填充词的高召回率,erm 采用了四阶段检测策略:
1. Whisper 转录
该工具使用 faster-whisper(默认使用 medium.en 模型)来生成词级时间戳。它向模型提供特定指令以避免清理转录内容,从而确保填充词作为检测标记被保留下来。
2. 间隙填充分析
如果两个转录词之间的停顿超过 350ms,erm 会分析该间隙内的音频。如果在 Whisper 报告为静音的地方检测到发声,该工具会将其标记为模型在转录中省略的填充词。
3. 词内填充词检测
当 Whisper 将填充词与相邻词粘连在一起时(例如,"in, uhhhhh" 变成单个 "in" 标记),erm 会识别异常长的单个标记。它会在短暂的音频跌落处拆分这些标记,并根据合理的发音长度判断哪个片段是实际的单词,从而将剩余部分标记为填充词。
4. 时长与音高测试
对于持续时间明显长于文本所暗示的词语,erm 会扫描尾部是否存在发声。它应用音高测试来区分说话者只是在说话慢(可变的声学形状)还是在发出类似 "uhhhhh" 的元音(稳定、简单的声学形状)。
实现无缝拼接
为了消除可听见的伪影,erm 在最终渲染之前实施了几个优化步骤:
波形对齐与过零点检测
切割端点允许滑动高达 60ms 以寻找最近的安静点。从该点开始,端点会吸附到最近的“过零点”——即波形穿过零点的精确时刻。将两个过零点拼接在一起可以防止产生导致咔哒声的波形阶梯。
动态交叉淡入淡出
使用 ffmpeg,erm 在两个音频片段重叠的地方应用交叉淡入淡出。交叉淡入淡出的长度不是固定的,而是根据切割的大小进行缩放(在 50ms 到 120ms 之间),以避免短片段被模糊化或长片段产生爆音。
动态交叉淡入淡出
使用 ffmpeg,erm 在两个音频片段重叠的地方应用应用交叉淡入淡出。交叉淡入淡出的长度不是固定的,而是根据切割的大小进行缩放(在 50ms 到 120ms 之间),以避免短片段被模糊化或长片段产生爆音。
环境音合成
为了掩盖切割产生的背景嘶嘶声偏移,erm 会自动识别原始录音中一段安静的片段。这段“环境音”会在整个输出音频的下方以低音量循环播放,从而创建一个一致的底噪,从而隐藏拼接过渡。
操作模式与验证
去噪策略
由于降噪可能会平滑掉用于检测的音高和音量线索,erm 提供四种模式。默认模式是 hybrid,即在原始音频上运行检测以保持准确性,但最终的切割是从去噪后的副本中提取的,以获得更好的音质。
验证
validate 子命令通过检查文件是否能打开、验证输出时长是否比输入时长短(约等于切割长度的总和),以及重新转录清理后的文件以确保填充词已消失,从而确保输出的完整性。
范围与局限性
erm 是严格限制在移除声音而非语言的。它不会移除:
- 填充短语: "like"、""you know" 或 "I mean" 会被保留,因为它们可能带有语义意义。
- 编辑错误: 重复的单词、错误的开头或长时间的思考停顿会被保留,因为移除它们需要根据哪次“take”更优进行编辑判断。
社区观点
虽然该工具为内容创作者节省了大量时间,但一些用户和语言学家认为,不流利词在人类语言中具有一定的作用。
"然而在说话时 [ums and ahs] 可以作为焦点,指示接下来的部分很重要。"
其他人也指出,对于非母语使用者,这些停顿通常表示一种认知转换,如果将其移除,可能会使说话者听起来断断续续,或者改变句子的预期含义。