做口播、课程讲解或产品演示视频时,经常会遇到一个重复劳动:找到说话中间的长停顿,再把对应的音频和画面一起剪掉。
手工操作不难,但视频一长,逐段试听、定位、裁切就很耗时间。因此,我在开源视频编辑器 Timeline Studio 中加入了“去除停顿”功能:在浏览器本地检测人声,找出长停顿,允许用户预览和选择,然后一次性完成音画同步裁切。
这篇文章分享它的实现思路,以及实际开发中遇到的几个问题。
一、先把问题拆开:检测人声,生成剪辑区间
这项功能不需要先把语音转换成文字。
我们真正需要知道的是:
- 哪些时间段有人说话;
- 哪些时间段没有检测到人声;
- 哪些停顿足够长,值得交给用户裁切。
这正是 VAD(Voice Activity Detection,语音活动检测)适合处理的问题。
本项目采用 Silero VAD,通过 ONNX Runtime Web 在浏览器中运行。当前使用的 ONNX 模型文件约为 2.24 MB,相比完整的语音识别模型,更适合承担这样一个目标明确的检测任务。
需要说明的是,VAD 判断的是“是否有人声”,不是“这段内容是否有价值”。背景音乐、演示操作和刻意留白,都可能出现在无人说话的区间。因此,检测结果会先展示给用户确认,而不是直接删除。
二、从视频到候选剪辑区间
整体流程如下:
读取选中的视频
↓
解码原始音轨
↓
转换为单声道、16 kHz 音频
↓
在 Worker 中运行 Silero VAD
↓
根据人声概率生成语音区间
↓
找出符合条件的长停顿
↓
用户预览、勾选
↓
同步裁切画面与原声
音频分块处理,避免一次性准备整段长视频的分析数据。模型推理放在独立 Worker 中,让主界面继续响应用户操作。
连续音频块之间会保留模型的递归状态,使检测能够利用前后文,而不是把每一块都当成全新的音频。
人声区间也不是简单地用一个阈值逐帧切分。实现中使用不同的开始与结束阈值,并加入短暂的静音确认时间,减少轻声、换气和短暂能量变化造成的碎片化判断。
三、“去除停顿”不是把所有空白剪光
全部删除停顿,容易让讲话变得急促,甚至影响词尾和下一句话开头的自然衔接。
因此,功能提供两个独立参数:
| 参数 | 作用 | 当前默认值 |
|---|---|---|
| 最短停顿 | 判断哪些停顿进入候选范围 | 0.8 秒 |
| 保留间隔 | 控制裁切后保留多长的停顿 | 0.5 秒 |
保留间隔可在 0.3~1 秒之间调整。
例如,检测到两句话之间有 3 秒停顿,保留间隔设为 0.5 秒,那么目标就是删除中间约 2.5 秒,让两侧保留少量自然衔接空间。
可以用下面的公式理解:
计划删除时长 = 检测到的停顿时长 − 设定的保留间隔
但这只是生成候选区间的基本思路。实际实现还要检查最小可裁切长度、保留片段长度等约束,避免产生过短的碎片。
原本较短的停顿不会被拉长;没有检测到人声的视频,也不会因此被整段自动删除。
四、一个实际踩坑:音轨不一定和视频一样长
最初测试时,有一个视频能够正常播放,却在分析时提示音轨无法完整解码。
排查后发现,视频约为 300.13 秒,而音频实际结束在约 298.68 秒。也就是说,视频最后还有一小段画面,但已经没有音频数据。
如果直接要求“解码得到的音频必须覆盖完整视频时长”,就会把这种正常素材误判为解码失败。
修复思路是区分两种情况:
- 音轨实际范围之外的时间:可以按静音补齐,保持音频分析和视频使用同一条时间轴。
- 音轨实际范围之内的缺失:仍需视为异常,不能随意补静音,否则可能把解码失败误当成停顿。
实现时依据音轨的实际起止时间计算有效覆盖范围,并避免重复数据被误计为完整覆盖。
这个问题也说明:媒体文件能正常播放,并不意味着音频时长、视频时长和容器标注时长完全一致。
五、真正复杂的是把结果接入编辑器
检测出静音区间,只完成了功能的一部分。
在编辑器中删除一段时间,还需要处理:
- 画面与原声使用相同的裁切边界;
- 源素材时间与时间线时间之间的映射;
- 普通倍速下的时间换算;
- 字幕、配音和其他轨道是否跟随移动;
- 锁定轨道的保护;
- 撤销以及原始媒体保留。
本项目把分析和应用分成两个阶段。
分析阶段只生成候选方案,用户可以试听、勾选或取消。真正点击应用后,再把选中的裁切作为一次可撤销编辑提交。
是否移动其他轨道,则遵循编辑器现有的波纹编辑规则。这样,智能功能可以融入原有的时间线操作,而不是形成另一套互相冲突的剪辑逻辑。
对于暂不支持的复杂时间映射或组合,也应明确限制,避免“按钮能点,但结果不可靠”。
六、本地推理与模型托管是两回事
模型文件需要下载,但视频不需要为了这项检测上传到推理服务器。
当前实现把模型托管在自有的 Hugging Face 和 ModelScope 镜像中,使用固定版本,并保留来源和许可证说明。两套下载来源映射到统一的缓存身份,避免切换来源后重复缓存同一个模型。
这里需要区分:
模型托管平台:提供模型文件下载
用户浏览器:解码音频、运行推理、生成剪辑结果
这种设计减少了对远程推理服务的依赖,也让长视频分析不必先等待素材上传。
七、让 AI 提建议,让用户保留剪辑决定权
这次实现中,我最看重的不是“自动删除多少秒”,而是让检测结果可以检查、可以选择、可以撤销。
对于口播视频,长停顿往往值得精简;但在课程演示、情绪表达或操作教学中,留白本身也可能是内容。
因此,这个功能的定位是:帮助用户快速发现可精简的区间,并完成繁琐的同步裁切,而不是替用户判断所有停顿都没有意义。
如果你也在开发浏览器音视频应用,这是一条可以参考的实现路径:用轻量 VAD 解决语音活动检测,再由编辑器的时间映射、轨道规则和撤销机制,完成可靠的剪辑操作。