# Remove Breath Gaps

> 去气口——自动检测并压缩口播音频中句与句之间的气口/换气声/静音停顿，让节奏紧凑起来。当用户说"去气口""去掉气口""剪气口""把停顿剪掉""去掉呼吸声/换气声""句间空隙太长""节奏太拖/让节奏快起来""压缩口播的停顿"，或提供一个口播音频文件（mp3/wav/m4a等）要求加快节奏、剪紧凑时，务必使用本 skill。采用不对称保留策略（句尾留短、句首留长缓冲），保证下一句的起始音不被切掉。只处理纯音频，不处理视频文件。

- Skill: `wcy4213/remove-breath-gaps` (Agent Skill, multi-file: 5 files)
- Install (CLI): `npx skillmds@latest add wcy4213/remove-breath-gaps`
- Raw SKILL.md: https://api.skillmd.com/api/skills/wcy4213/remove-breath-gaps/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: wcy4213 (https://skillmd.com/u/wcy4213)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/wcy4213/remove-breath-gaps

---


# 去气口（remove-breath-gaps）

压缩口播音频句间的气口/静音，加快节奏。核心工具是 `scripts/degap.py`，一条命令完成检测+剪切+校验。

## 标准流程

1. **直接用默认参数跑**：

   ```bash
   python3 <skill目录>/scripts/degap.py "输入音频.mp3"
   ```

   输出默认为同目录下 `<原名>_去气口.<同后缀>`，脚本会打印：气口数量、剪除总秒数、前后时长对比。

2. **把脚本打印的结果转述给用户**（处理了多少气口、快了多少秒），提醒用户试听，并告诉他们哪个参数可以调（见下方"用户反馈 → 参数调节"）。

3. 如果想先看气口分布再决定，可加 `--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 检出的静音总长，差值应在每处剪切点几十毫秒的边缘衰减范围内），或直接建议用户试听开头几句。

