去气口(remove-breath-gaps)
压缩口播音频句间的气口/静音,加快节奏。核心工具是 scripts/degap.py,一条命令完成检测+剪切+校验。
标准流程
直接用默认参数跑:
python3 <skill目录>/scripts/degap.py "输入音频.mp3"输出默认为同目录下
<原名>_去气口.<同后缀>,脚本会打印:气口数量、剪除总秒数、前后时长对比。把脚本打印的结果转述给用户(处理了多少气口、快了多少秒),提醒用户试听,并告诉他们哪个参数可以调(见下方"用户反馈 → 参数调节")。
如果想先看气口分布再决定,可加
--dry-run(只报告不生成文件)。
为什么这样剪(原理,遇到问题时回来看)
- 不用 ffmpeg 的 silenceremove 滤镜。它靠 RMS 窗口判断语音起点,反应滞后,切点整体偏后:气口挂在上一句尾部拖节奏,下一句开头(尤其轻声、气声开头的字)会被啃掉。这是实际踩过的坑。
- 正确做法是先用 silencedetect 精确定位每个气口的起止点,再不对称保留:
- 句尾后留
--tail(默认 0.08s)——人声结尾自然衰减,留一小截即可,不会显得突兀; - 下一句开口前留
--pre(默认 0.15s)——起始辅音(f/s/h/x 等气声)比阈值电平低、比主元音来得早,必须留足缓冲才不会切字。
- 句尾后留
- 剪切点全部落在静音区间内部(安静→安静拼接),不会产生爆音,无需交叉淡化。
用户反馈 → 参数调节
| 用户说 | 调整 |
|---|---|
| 下一句开头被切到字 | --pre 加大到 0.2(还不行就 0.25,并检查 --threshold 是否太高) |
| 还是有点拖 / 不够快 | --tail 0.05 --pre 0.12,或 --min-gap 0.15 连短停顿一起收 |
| 太赶了 / 像机器剪的 | --tail 0.12 --pre 0.2,或 --min-gap 0.3 只剪大气口 |
| 呼吸声还在 | --threshold 调高(如 -22)——呼吸声电平高于当前阈值,没被算进气口 |
| 安静的词尾被误剪 | --threshold 调低(如 -30) |
改参数重跑时输出文件直接覆盖即可;建议保留原始文件永远不动。
边界情况
- 视频文件:脚本会拒绝(只剪音频会导致音画不同步)。先用 ffmpeg 提取音轨处理,或改用视频剪辑工具(如 ChatCut)做基于转写的停顿剪辑。
- 背景有音乐/底噪的音频:silencedetect 找不到低于阈值的间隙,效果会很差。提醒用户此工具适合干声口播。
- 完成后校验:脚本已内置前后时长对比。如需进一步确认没切到字,可对比处理前后的"语音内容时长"(总长减去 silencedetect 检出的静音总长,差值应在每处剪切点几十毫秒的边缘衰减范围内),或直接建议用户试听开头几句。