Lesskeys
语言
指南Mac 和 WindowsMacWindows

Whisper 提前​停下⁠,​却说已完成

简短​回答

Whisper 模型​可能​在一段录音​中途​停下,​却​仍报告​成功:​在​我们的​测试​里,​143 次运行​中就有 10 次​这样。​把​返回的​逐字​稿量​与音频的​时长​对比,​就​能发现,​不​需要​参考​逐字稿。

macOS 13+​(Apple Silicon)⁠· 无订阅Windows 10 和 11 · 无订阅

最后​审阅:​

真实​结果的​示意图。​一个转写​窗口​显示​我们​测试​中最差的​一次运行,​挪威语:​音频​条是满的,​逐字​稿条停在 22%​(521 个词中的 113 个),​而​状态​仍显示 COMPLETED。​下方​是 143 个方块,​每次运行​一个:​其中 10 个是红色,​即提前​停下的​运行。
矩阵​中最差的​一次运行,​由​数据绘制。​每个方块​是一次运行,​按​结果​文件的​顺序​排列;​143 个中有 10 个是红色。

是​什么

什么​是静默​截断

它​写出的​文字​是对的。​它​只是停了,​而​处理​流程​说它已经​做完了。

语音模型​可能​返回错误的​词,​也​可能​在中途​停下,​把​前一部分的​正确​逐字稿​当作​完整的​交了回来。​在​我们​最差的​一次运行​挪威语​中,​经过 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 次运行​中没有​一次超出​参考​文本​一半以上。​这​与重复​循环故障的​方向​相反:​在​那种故障​里,​模型​卡住,​一连​几分钟重复​同一句话,​覆盖率​达到​参考​文本的​五倍或更多。​两者​都是灾难性​的,​抽查时​都看不出来,​但​从同一个数字​偏高​还是偏低​就能区分它们,​因此​一个检查​就能同时​发现​这两种情况。

发现​它

没有​参考​文本​也能发现

把​返回的​逐字​稿量​与音频的​时长​对比。

词​错误率​需要​一份参考​逐字稿,​而​生产​环境​里你从来没有。​覆盖率​不需要。​在​这个​矩阵​里,​两类运行​分得​很清楚:

这个​矩阵​中被截断的​运行​与正常的​运行
项目运行​次数平均​覆盖率平均​错误率
被​截断100.4465.90%
正常1331.0112.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 MB299.16%6.80%无
Large V3 Turbo1.6 GB299.52%7.23%无
Large V3 Turbo Q5 模型 ● 应用​默认547 MB299.99%7.81%29 次中的 1 次
Large V33 GB2824.64%15.80%28 次中的 5 次
Large V3 Q51.0 GB2826.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?

尚无定论,​本页​也不声称知道。​测得的​事实​是:​这种情况​会发生,​而​周围的​处理​流程​没有​发现。​文中​提出的​覆盖率​检查​是应用​层面的​缓解​措施,​因为​应用层是我们​能控制的​一层;​它​并不​诊断​根本​原因。

更多

相关​阅读