长音频怎么切:切分点选错会吃掉哪些字

2026-08-24

**两小时的会议录音,不能整段丢给识别模型。它必须先被切成片段,逐段识别,再把结果拼回去。**这个”切—识别—拼”的过程里藏着好几个坑,最典型的一个是:切点落在某个字的中间,那个字两边都识别不全,最后谁也没写出来。

这篇讲三件事:为什么必须切、按什么切、切坏了会出现哪些症状。

为什么长音频必须切

有两个叠加的原因。

一是计算开销。 现代识别模型的主干是注意力机制,代价随输入长度增长——序列每变长一点,要计算的两两关系就更多。几分钟的音频尚可,一场跨越午休的会议直接送进去,开销会失控。

二是训练时的长度分布。 模型见过什么长度的输入,就擅长处理什么长度的输入。喂给它远超训练分布的超长序列,即使算力扛得住,输出质量也不可控。

这不是某个实现的怪癖。以 Whisper 为例,它的 README 写明:transcribe() 方法读入整个文件后,用一个 30 秒的滑动窗口处理音频,对每个窗口做自回归的序列到序列预测。你以为”整段丢进去”了,实际上库内部已经替你按定长窗口切过一轮。定长窗口切分是主流实现的内建行为,不是使用者额外发明的技巧。

所以你面对的选择不是”切还是不切”,而是”用谁的切法”。默认的定长硬切足够简单,但它对切点落在哪里毫无判断力。

切在语音中间,会吃掉哪些字

假设一个切点正好落在”合同金额”的”额”字发音过程中。前一片段的末尾拿到这个字的前半段声音,后一片段的开头拿到后半段。于是:

  • 前一段的识别器看到一个不完整的音节,没有足够证据判定这是”额”,声学上像噪声或气音,多半被当成句末拖音丢掉。
  • 后一段的识别器同样只拿到半个音节,而且没有前文语境,更倾向于忽略这个残片。

结果就是吞字:两边都识别不全,拼起来时这个字凭空消失。真实感受是”识别得挺好的,就是偶尔漏个字”,而且漏得毫无规律——切点按时长机械落下,落在哪儿全看运气。

反过来,为避免吞字而留了重叠,若合并时不去重,就会出现重复:重叠区被两个片段各识别一次,同一句话出现两遍。吞字和重复是同一问题的两个方向,光调整重叠长度解决不了,必须在合并环节处理。

按什么切:让 VAD 告诉你哪里没人说话

稳妥的做法不是按固定时长硬切,而是用 VAD(语音活动检测)找出静音段,把切点放在静音里

道理很直白:静音处本来就没有语音内容,从这里断开不会切碎任何一个字。VAD 的职责正是判断哪些段有人说话,它天然适合承担这个角色。参数取舍见VAD 是什么:ASR 前面为什么总要挂个断句器

要注意几点:

  • 静音时长阈值决定切得多碎。 太短,句中的自然停顿也被当成分界,完整句子被拆开;太长,则可能找不到合适切点,片段长度失控。
  • 切点前后要留 padding。 VAD 的边界判断本身有误差,前后各留余量能避免吃掉首尾音。
  • 找不到切点时要有兜底。 有人连续讲很久没停顿,就得允许在语音中硬切——这时更要靠重叠加去重补救。

长音频转写的切分流程

这是一份可以照着实现的步骤清单:

  1. 统一音频格式。 重采样、单声道化在切分之前做,避免各片段自行转换带来的不一致。见ASR 对音频格式有什么要求
  2. 跑一遍 VAD,拿到语音段与静音段的边界,输出一串带起止时间的区间。
  3. 按静音段规划切点。 在时长上限约束下优先选较长的静音;找不到就退回硬切。
  4. 给每个片段加重叠。 起点向前扩、终点向后扩,让相邻片段共享一小段音频,保证任何一个字至少在某一个片段里是完整的。
  5. 逐段送识别,记录每段的全局起始时间。 这是后面回加偏移的依据,必须在切分时存下来,不能事后靠片段顺序推算。
  6. 合并时按文本相似度对齐重叠区并去重。 重叠区两边都有转写结果,要做的是找出两串文本的重合部分再合并,而不是简单丢弃一侧——丢弃哪一侧,都可能丢掉对方识别对了而本侧识别错了的内容。
  7. 给每个片段内的时间戳回加全局偏移。 详见下一节。
  8. 拼接后统一做后处理。 标点恢复、ITN 这类依赖上下文的步骤,放在拼接之后效果更好。

时间戳偏移:漏了这一步,字幕会整体错位

这个坑非常常见。识别器返回的时间戳是相对于它拿到的那段音频的起点的。第二个片段从全局的某个时刻开始,但识别器不知道,它给出的时间戳依然从零起算。合并时若直接当成全局时间用,就会出错。

典型症状:字幕前面一切正常,从某一处开始整体提前,越往后偏得越多。 提前的量正好等于该片段的起始时间。看到这个现象,几乎可以直接断定是偏移没回加,不用怀疑模型。

两个常见变体:只给第一个片段加了偏移、后面忘了;或者用”片段序号乘固定时长”推算偏移——按 VAD 切分时片段长度并不相等,这样算必然错。偏移必须来自切分时实际记录的起始时间。

时间戳本身的生成方式与精度,见时间戳是怎么对齐的

切开之后,上下文就丢了

切分还有一个隐性代价:后一段看不到前一段说了什么。

一场技术评审会,开头反复出现某个产品代号,识别器已经”顺”过来了。切到下一段,它重新开始,对这个代号毫无记忆,很可能又写错。跨片段的指代与语义连贯判断也会变差。

有些实现支持把上一段的转写结果作为文本提示传入下一段。这确实有用,但要清楚风险:错误会累积。前一段把代号识别错了,这个错误作为提示喂给后一段,后一段更倾向于沿用同一个错法,一路错到底。

所以这个开关不是无脑打开就好。专名密集的场景值得开;音频质量差、前段本身不可靠时,开了反而放大问题。

切分故障对照表

故障症状修法
按固定时长硬切,切点落在语音中随机漏字,尤其在片段边界附近改用 VAD 静音段作为切点
有重叠但合并时不去重同一句话在结果里出现两遍合并时按文本相似度对齐重叠区再去重
去重时直接丢弃一侧偶发漏字或语义断裂对齐后取更完整的一侧
没有重叠边界处吞字,且无法补救相邻片段留少量重叠
时间戳没回加全局偏移字幕从某处起整体提前,越往后偏越多用切分时记录的实际起始时间回加
静音阈值太短片段过碎,句子被拦腰截断调大静音时长阈值
静音阈值太长找不到切点,片段过长拖累识别设时长上限,超限硬切加重叠兜底
未传前文提示跨片段的专名前后不一致视场景决定是否传入上一段转写
传了前文提示但前段有错同一个错误蔓延到后续片段音频质量差时关闭该机制

常见问题

问:为什么不直接把片段切得很短?

片段越短,上下文越少,识别质量越差,而且接缝变多,每个接缝都是一次出错机会。片段长度是计算开销与上下文完整性之间的权衡,不存在越小越好的方向。

问:重叠留多长合适?

原则是”足够覆盖一个完整的语言单元,又不至于让重复识别的开销变得可观”。具体值取决于去重算法有多可靠,要用自己的音频实测,别抄配置。

问:流式识别也有这些问题吗?

流式按到达顺序持续处理,切分逻辑不同,但边界处的上下文缺失与结果修订同样存在。见流式识别和整段识别,差别在哪

问:要转写几百个文件,还要注意什么?

批量场景的瓶颈通常不在切分本身,而在任务编排和资源分配,见并发与批处理怎么安排

相关阅读


本文讲的是长音频切分的通用工程原理,不绑定某一个具体实现。 文中 Whisper 的 30 秒滑动窗口,来自其官方 README 对 transcribe() 方法的说明,仅为结构描述。 各家系统的切分策略与合并逻辑差异很大,请以官方文档为准。 我们没有做过性能实测,因此不给准确率、速度一类的数字。

想系统学会用 AI?报名体系课或加入会员,照着学、照着用。