Whisper 提前停下,却说已完成
Whisper 模型可能在一段录音中途停下,却仍报告成功:在我们的测试里,143 次运行中就有 10 次这样。把返回的逐字稿量与音频的时长对比,就能发现,不需要参考逐字稿。
macOS 13+(Apple Silicon)· 无订阅Windows 10 和 11 · 无订阅
最后审阅:
是什么
什么是静默截断
它写出的文字是对的。它只是停了,而处理流程说它已经做完了。
语音模型可能返回错误的词,也可能在中途停下,把前一部分的正确逐字稿当作完整的交了回来。在我们最差的一次运行挪威语中,经过 30 分钟的计算,它只返回了 521 个参考词中的 113 个,并在 9 个片段后停下。我们自己的流程把这次运行记为 COMPLETED:没有错误,没有警告,也没有部分结果的标记。
- 10/143次运行提前停下
- 22%的音频(最差那次运行中)
- 9/10出在两个 large-v3 文件上
哪些运行
哪些语言提前停下
10 次中有 9 次出在两个 large-v3 文件上。
覆盖率是逐字稿长度除以参考文本长度:1.00 表示逐字稿完整。每个条形是一次被截断的运行;虚线是 0.80 的界线。
Large V3:28 次运行中的 5 次
- 挪威语0.22
- 马来语0.32
- 越南语0.34
- 韩语0.40
- 荷兰语0.74
Large V3 Q5:28 次运行中的 4 次
- 捷克语0.22
- 葡萄牙语(巴西)0.35
- 越南语0.37
- 马来语0.75
Large V3 Turbo Q5:29 次运行中的 1 次
- 印地语†0.72
印地语:关于计分的提醒
† 这是默认模型的那次运行:886 个单位,而参考文本是 1,237 个,也就是 Whisper 在 29 种语言中的准确率的更正说明所指出的同一个偏高的数字(印地语:1,237 个单位对 683 个真实的词,原因是计分程序在组合标记处把词拆开了),所以绝对值 0.72 并不可靠。但两个 turbo 同系文件对同一份参考文本分别得到 1,288 和 1,242 个单位(覆盖率 1.04 和 1.00),所以默认模型的这次运行比它们短 29% 到 31%。最可能的解读是真的被截断了,该任务自己的结果说明里也是这样记录的。它是在矩阵中 12 GB 的那一部分里运行的(见下面的局限)。
只会短,不会长
这个矩阵中的每一个极端格子都是偏短,没有偏长。143 次运行中没有一次超出参考文本一半以上。这与重复循环故障的方向相反:在那种故障里,模型卡住,一连几分钟重复同一句话,覆盖率达到参考文本的五倍或更多。两者都是灾难性的,抽查时都看不出来,但从同一个数字偏高还是偏低就能区分它们,因此一个检查就能同时发现这两种情况。
发现它
没有参考文本也能发现
把返回的逐字稿量与音频的时长对比。
词错误率需要一份参考逐字稿,而生产环境里你从来没有。覆盖率不需要。在这个矩阵里,两类运行分得很清楚:
| 项目 | 运行次数 | 平均覆盖率 | 平均错误率 |
|---|---|---|---|
| 被截断 | 10 | 0.44 | 65.90% |
| 正常 | 133 | 1.01 | 12.10% |
0.80 的界线不是对数据拟合出来的:被截断的运行中最高的覆盖率是 0.75,正常的运行中最低的是 0.82,所以落在这个空档里的任何界线都会给出同样的答案。在生产环境中:在用户自己的电脑上,把最后一个返回片段的时间戳与文件时长对比,不需要任何可供比较的参考。
错误率
截断会推高错误率
Large V3 在 28 种语言上的平均错误率是 24.64%;去掉它被截断的 5 次运行后是 15.25%。
它的错误率中约有 9.4 个百分点并不是模型听错了什么,而是模型根本没有转写出那部分内容。
即使排除截断,Large V3 也追不上较小的 turbo 模型
即使排除截断,Large V3 也追不上 834 MB 的 turbo 量化模型,后者在全部 29 种语言上的平均错误率是 9.16%,且从未被截断。在三个 turbo 运行共有的 28 种语言上(排除印地语),平均值分别是 Q8 8.59%、默认 8.71% 和 1.6 GB 的 turbo 8.80%,彼此相差在 0.2 个百分点以内,所以表面上的大部分差距来自印地语这一行。在这里,大小既预测不了可靠性,也预测不了准确率。
在 Mac 上
这对 Lesskeys 提供的模型意味着什么
两个 large-v3 文件都出现在当前在售的 App Store 版本(3.1.4)的模型选择器里,它们占了 10 次截断运行中的 9 次。
那个版本里没有覆盖率检查。上面描述的检查是针对它提出的建议,不是已发布的功能。
截至 2026年10月15日的状态,针对在售的 App Store 版本(3.1.4)
直白地说,因为这正是本页值得发布、而不是归档的原因:
- 两个 large-v3 文件都出现在 Lesskeys 的模型选择器里,它们占了 10 次截断运行中的 9 次。一个按“下载越大,结果越好”来推理的用户,选到的是列表里最不可靠的选项。
- 834 MB 的量化模型平均错误率最低(与其他 turbo 运行的差距主要来自印地语一行),且零截断,但它不在那个版本的选择器里。它在这次测试中能用,只是因为应用启动时会扫描模型目录。
- 默认模型(547 MB)在 29 种语言中被截断了一次,是印地语(很可能是真的截断;见覆盖率列表下方的说明)。那次运行和捷克语的 Large V3 Q5 那次运行,都是在矩阵中 12 GB 的那一部分里运行的,剩余内存很少(见局限)。
- 那个版本没有覆盖率检查。上面描述的检查是针对它提出的建议,不是已发布的功能。等它发布时,这一节会被改写,而不是悄悄删掉。
在 Windows 上
这对 Windows 意味着什么
测试是在 Mac 应用里进行的。Windows 应用不在其中。
开启说话人标注时,Windows 版 Lesskeys 对一个明明有语音却返回空逐字稿的文件有一道保险:它会不带时间戳再解码一遍该文件。但对中途停下的逐字稿,也就是本页讲的情况,它没有检查。遇到较长的文件,请对照音频读逐字稿的最后几行,并确认逐字稿的结尾与录音的结尾相符。
数据
方法、表格和局限
这些运行是怎么做的,以及它们不能告诉你什么,已折叠。
截断是怎么测量的
large-v3 系列的 5 个 Whisper 文件,覆盖 29 种语言,145 个格子中的 143 个。音频是经过电平归一化的 FLEURS,文本中不含数字(有公开参考逐字稿的朗读语音),每种语言约 460 到 2,520 个单位。
每次运行都是通过正式发布的应用,在运行 macOS Sequoia 的虚拟机上进行的,而不是通过 whisper-cli。这很重要:语音活动检测、幻觉过滤、响度归一化和语言限定都在流程中,与用户实际使用时完全一样。每次运行都硬性限定了语言,143 个格子全部遵守;实际加载的模型在 143 个格子中全部与请求的模型一致。缺失的两个格子是两个 large-v3 文件上的印地语,它们根本没有完成。
五个模型:大小、平均错误率、被截断的运行
large-v3 系列的五个 Whisper 文件在 29 种语言中的表现(没有被截断的运行的行已高亮)
| 模型 | 大小 | 语言 | 平均错误率 | 中位数 | 被截断的运行 |
|---|---|---|---|---|---|
| Large V3 Turbo Q8 模型 ● 不在选择器里 | 834 MB | 29 | 9.16% | 6.80% | 无 |
| Large V3 Turbo | 1.6 GB | 29 | 9.52% | 7.23% | 无 |
| Large V3 Turbo Q5 模型 ● 应用默认 | 547 MB | 29 | 9.99% | 7.81% | 29 次中的 1 次 |
| Large V3 | 3 GB | 28 | 24.64% | 15.80% | 28 次中的 5 次 |
| Large V3 Q5 | 1.0 GB | 28 | 26.66% | 18.66% | 28 次中的 4 次 |
本测试的局限
- 朗读语音,而非会议。FLEURS 是干净的录制文章。对话和重叠的音频要难得多,这些错误率不应被当作你在真实通话上会得到的结果。
- 每个格子只跑一遍。143 个格子,各运行一次。截断在两个 large-v3 文件上,以及在两次独立的调查中都能重现,但这个矩阵并不能确定一个发生率;它只能确定这种情况会发生。
- 一台机器,两种内存大小。这些格子在同一台 Apple Silicon 虚拟机上运行,前 33 个格子的内存是 12 GB,其余是 24 GB;全部 29 个默认模型的格子和前四个 Large V3 Q5 的格子(阿拉伯语、捷克语、丹麦语、德语)都在 12 GB 的那一部分里运行。其中有两次截断:默认模型的印地语(最低时可用内存 241 MB)和 Large V3 Q5 的捷克语(60 MB)。其他每次截断的运行,可用内存都超过 6,000 MB。低内存可能对这两次有影响,而这个矩阵无法把它与模型区分开。解码保持使用应用的文件路径默认设置,而不是命令行工具的设置。
- 绝对错误率有一定的虚高,原因是标点和大小写规范化的选择。起决定作用的是模型之间的比较,而不是绝对的百分比。
这一次保留了逐字稿。在更早的一次扫描中,它们被下一次运行的配置步骤覆盖了,只能靠词数来推断截断,这恰恰是它被忽视了这么久的原因。在结果表里,“错误率更差”和“提前停下”看起来一模一样。
问题
关于 Whisper 提前停下的问题
语音识别中的“静默截断”是什么?
模型返回的逐字稿只覆盖了音频的一部分,而周围的处理流程却报告成功。已有的文字通常是对的,所以在有人把逐字稿和录音对照之前,看不出任何问题。在这个矩阵里,它影响了 143 次运行中的 10 次,其中 9 次出在两个 large-v3 文件上。
没有参考文本,怎样发现被截断的逐字稿?
把返回的内容和输入的内容对比:最后一段的结束时间戳对比音频文件的时长,或者逐字稿的长度对比预期长度。两者都不需要标准答案逐字稿,这正是这种检查能用于生产环境的原因。在这批数据里,被截断的运行平均覆盖率为 0.44,正常的运行为 1.01。
更大的 Whisper 模型结果就更好吗?
在这个矩阵里不是。两个最大的文件平均错误率最高,并占了 10 次截断运行中的 9 次,而 834 MB 的 turbo 量化模型平均错误率最低(9.16%,把印地语排除后与其他 turbo 运行相差在 0.2 个百分点以内),且从未被截断。在这里,下载大小既预测不了准确率,也预测不了可靠性。
这是 Whisper 的 bug,还是应用的 bug?
尚无定论,本页也不声称知道。测得的事实是:这种情况会发生,而周围的处理流程没有发现。文中提出的覆盖率检查是应用层面的缓解措施,因为应用层是我们能控制的一层;它并不诊断根本原因。
更多