Whisper 幻觉:为什么 Whisper 会写出没人说过的话,以及怎么阻止它

Whisper 幻觉,指的是转写结果里没有人说过的话:一个短语翻来覆去地重复,在静音上冒出“Thank you for watching”(谢谢观看)这样的结束语,或者整句话都是编出来的。它们之所以出现,是因为 Whisper 写文字的方式和语言模型很像,当音频是静音、有噪声或者听不清的时候,它对“接下来通常是什么”的判断,可能压过它实际听到的内容。

OpenAI 自己的模型卡就对此发出了警告,2024 年的一项研究发现,在它测试的转写中,大约 1% 含有编造的短语。我做了 YapToText,一款免费的 Mac 听写 App,在你的 Mac 上运行 Whisper,因为我用手打字有困难,每天都靠听写,围绕模型做的工作里有相当一部分,就是为了抓住这一类错误。下面依次讲:幻觉是什么样子,为什么会出现,研究发现了什么,YapToText 怎么应对,以及不管用哪种 Whisper 方案你都能做什么,包括 whisper.cpp。

在 Mac App Store 下载 YapToText免费下载。无需账号,没有锁定的功能。需要搭载 Apple 芯片的 Mac 和 macOS 14 或更高版本。 源代码在 GitHub 上。

步骤

  1. 一说完话就停止录音,或者在 Dictation 页面打开 Auto-stop after silence。
  2. 长时间思考时按空格键暂停,而不是把静音录进去。
  3. 在 AI Models 页面的 Language 选择器里选你说的语言。
  4. 转写文件之前,修剪长段静音和音乐,如果用 whisper-cli,还要把它转换成 16 位 WAV。
  5. 在 History 里点击 Show pipeline details,读一读原始转写,或者说话时按 2 使用 Raw Transcription。

Whisper 幻觉是什么样子

OpenAI 的 Whisper 论文用平实的话列出了几种失败方式:陷入重复循环,没有转写出一段音频开头或结尾的几个词,以及完全幻觉,也就是模型输出的转写与实际音频完全无关。实际使用中,它们表现为四种模式。幻觉不是听错的词。它是一个背后根本没有声音的词。

  • 重复循环。 同一句话、短语或词一遍又一遍地出现,常常出现在逐渐沉默下去的录音结尾。OpenAI 的模型卡说,序列到序列的架构让模型容易生成重复的文字,束搜索和温度调度可以在一定程度上缓解,但不能完全解决。
  • 静音里冒出的文字。 在 Whisper 代码仓库里标题为“Share your hallucinations here”的讨论串中,用户报告说,在静音、音乐或音效的位置,明明没有人说话,却出现了“Thank you for watching”和字幕署名之类的句子。
  • 编造的句子。 从没有人说过的整句话。康奈尔大学对 Careless Whisper 研究的报道说,Whisper 偶尔会编造整个短语和句子,有时带有暴力的语言、编造的个人信息和虚假的网站。
  • 标签和舞台提示。 读起来像剧本而不是说话的文字。YapToText 1.4 的发行说明记录了一项修复,针对转写里出现的幻觉说话人标签,比如“Male speaker:”。

相反的错误,也就是开头或结尾丢字,与此有关联,这也是为什么同一段录音可能既缺了第一个词,又多出一句编造的最后一行。普通的听错字是另一个问题,解决办法也不同,Mac 版 Whisper 指南里有介绍。

Whisper 为什么会产生幻觉

OpenAI 在它的模型卡里解释了原因。因为这些模型是用大规模的嘈杂数据以弱监督方式训练的,它们的预测里可能包含音频里并没有说出来的文字。模型卡认为,这是因为模型把“预测下一个词”和“转写音频本身”结合在了一起,并且说,在资源较少、较难被发现的语言里,这种现象可能更严重。当可以依据的声音很少时,模型里负责猜测的那一半就承担了更多的工作。

这就指向了容易引发它的几种情况:

  • 静音和长时间停顿。 Careless Whisper 研究发现,说话时非发声时间占比更长的人,也就是停顿更久的人,出现幻觉的比例不成比例地高。
  • 音乐和音效。 Whisper 代码仓库里的报告集中在没有人说话的片段上。
  • 嘈杂或微弱的信号。 语音越不清楚,模型能用来锚定每个词的依据就越少。
  • 语言。 OpenAI 说,表现因语言而异,差别很大,模型卡还说,在资源较少的语言里,幻觉可能更严重。

还有一个细节对发现幻觉有帮助。研究发现,OpenAI 的 Whisper API 产生的幻觉是不确定的,每次运行都会产生不同的随机文字,研究者就利用同一段音频两次运行结果的差异来找出它们。如果你的工具对同一段音频两次给出不同的文字,变化的那一部分就值得再看一眼。

Careless Whisper 研究发现了什么

这项研究是“Careless Whisper: Speech-to-Text Hallucination Harms”,作者是 Allison Koenecke、Anna Seo Gyeong Choi、Katelyn X. Mei、Hilke Schellmann 和 Mona Sloane,发表在 ACM 公平、问责与透明会议 FAccT 2024 上。比例很小。但一句编造的话造成的危害可能很大。

2026年10月5日在 arXiv 和 ACM Digital Library 上的论文,以及康奈尔大学的新闻报道中查阅。

  • 他们测试了什么。 来自 AphasiaBank 的近 40 小时音频,共 13,140 段,说话人有失语症患者,也有对照组,2023 年发送给 OpenAI 的 Whisper API。
  • 多常见。 大约 1% 的转写含有整个幻觉出来的短语或句子,这些内容在底层音频中以任何形式都不存在。
  • 多严重。 38% 的幻觉含有明显的危害,比如延续暴力、编造不准确的关联,或者暗示虚假的权威。
  • 针对谁。 失语症患者比对照组得到更多幻觉,非发声时间更多的片段也更容易产生幻觉。
  • 随时间的变化。 作者在 2023 年 12 月重新运行这些音频时,许多例子已经消失,但 187 段音频中仍有 12 段产生了幻觉。

读这些数字时,有两点要分清。它们描述的是 2023 年那个样本在 OpenAI 托管 API 上的结果,不是 whisper.cpp,不是 Whisper Large v3 Turbo,也不是 YapToText,所以不能用它们来预测你自己的听写。它们也不是惊慌的理由:它们是让你读一读自己听写内容的理由,这本来也是好习惯。如果长时间停顿是你说话方式的一部分,按情况选择听写方式如实说明了 YapToText 可能在哪些地方不够用。

YapToText 怎么防范

YapToText 通过 whisper.cpp 运行原版的 Whisper Large v3 Turbo (Q5) 文件。我没有重新训练过模型。我做的是围绕它搭建的一套流程,这套流程有一部分就是为了不让没人说过的词进入你的文档。模型是原版的。功夫花在了它周围的防护上。

在 Whisper 听到任何内容之前

  • 长时间的静音会先被压缩,再进行转写,这样模型就不会跑偏。
  • 每次听写都会测量噪声,只有比例需要时,才会减去稳定的噪声。轻声说话时,声音会相对房间的背景声被提升。
  • 嘈杂的片段会得到更深入的搜索。 片段测出有噪声时,解码方式会从贪心搜索切换到束搜索。
  • 按键之前的半秒会被保留,所以开头的词不会被截掉。
App Store 海报,标题是 It hears you through anything,在展开的录音面板上方列出了上述音频处理步骤。
图1. 围绕原版模型的各个步骤,从背景噪声消除到静音识别。大部分针对幻觉的防护都发生在这里,以及转写结果刚返回之后。

转写结果返回之后

  • 重复循环会被抓出来并删除。 有一道防护会折叠 Whisper 在静音结尾掉进去的循环,从 1.4 起,以静音结尾的长听写不再把最后一句话反复重复。
  • 编造的说话人标签会被删除,舞台提示也一样。在 1.4 的修复之前,像“Male speaker:”这样的标签甚至可能被当成词汇学进去。
  • 静音里幻觉出来的客套话会被抓出来并删除。
  • 静音不会输入任何东西。 如果一次听写只有静音,YapToText 会显示“Didn't catch that”,并且不转写任何内容。
  • 较短的转写会再处理一遍。 如果返回的文字比输入的语音短,就会运行一次补救处理。

整理模型出错的时候

除了 Raw Transcription 之外,每种模式都会把转写交给你 Mac 上的一个小型整理模型,而语言模型也会编造。App 会检查它的工作:如果结果读起来像助手的回复,长度远远超过你说的内容,重复了参考文字,或者凭空加了省略号,就会被丢弃,改为输入原始的转写。整理模型还被告知,不要丢掉任何一句话,也不要添加你没说过的内容。AI 听写页面介绍了这些规则。

这些改动,在发布之前都会用我自己真实听写的一套测试来衡量。那只是一个人的录音,不是基准测试,而且“抓住并删除”不等于“永远不会发生”:新类型的幻觉仍然可能漏过去。

看看 Whisper 实际听到了什么

分辨幻觉和整理出错的最快办法,是看 Whisper 在其他任何东西碰它之前输出了什么。如果编造的文字在原始转写里,就是 Whisper 写的。如果不在,就是整理环节造成的。

第 1 步:在 History 里打开这条听写

  • 你: 打开 History,找到这条听写,点击 Show pipeline details。
  • YapToText: 在最终文字上方显示原始转写,下方是模式、语言和耗时。
  • 确认: 把原始转写和你记得自己说过的话对照着读。
YapToText 的一条 History 记录,展开了 pipeline details:原始转写、整理后的转写、模式、delivery、目标 App 和耗时。
图2. 原始转写在整理后的文字上方,所以没人说过的一行,可以追溯到是 Whisper 写的还是整理环节造成的。

第 2 步:下一条用原始方式听写

  • 你: 说话的时候按 2,在 Auto mode 开启的默认顺序里,它就是 Raw Transcription。
  • YapToText: 对这一条听写,输入 Whisper 的原话,只加基本标点,不经过 AI 模型。
  • 确认: 输入的就是 Whisper 听到的内容。想让每条听写都保持原始状态,请在 Home 页面关闭 Post-transcription analysis。

每条 History 记录的导出菜单里有 Copy Raw Transcript,它会把整理之前的版本放进剪贴板。如果你想在每条较长的听写输入之前先读一遍,请在 Settings,Advanced,Text output 里打开 Review before inserting。模式指南说明了每种模式可以改动什么。

在任何 Whisper App 里预防幻觉

大多数幻觉都是从静音里长出来的,所以最好的预防办法,就是少给 Whisper 一些静音。这些办法对任何 Whisper App 都有效,适用的地方会写出 YapToText 的设置名称。输入的静音越少,输出的编造词句就越少。

  1. 说完就停。 一说完话就按键,不要让录音一直开着。在 YapToText 里,Dictation 页面 Recording 卡片中的 Auto-stop after silence(默认关闭)会在安静 0.5 到 5 秒后结束听写。
  2. 有意停顿。 中间想很久的话,按 空格键 暂停听写,再按一次继续。空格不会被输入。
  3. 设置语言。 在 AI Models 页面的 Language 选择器里选你说的语言,而不是让 Whisper 自己判断。语言页面列出了全部 29 种。
  4. 给它干净的信号。 麦克风靠近,房间安静,关掉音乐。YapToText 的 Pause music and video while dictating(默认开启)会在你说话时暂停播放。
  5. 先修剪录音。 转写文件之前,用任何音频编辑器剪掉开头和结尾的长段静音和音乐。
  6. 在要紧之前先读一遍。 凡是要发送、归档或引用的内容,都读一读原始转写。
Mac 上 YapToText 的 Dictation 设置页面:Keys、Recording、Microphone 和 Delivery 卡片。
图3. Auto-stop after silence 在 Dictation 页面的 Recording 卡片里,默认关闭。打开它,你不再说话时听写就会结束。

按键和快捷键页面介绍了空格键、Esc 和其他按键。

给 whisper.cpp 用户的建议

如果你通过 whisper.cpp 自己运行 Whisper,输入的音频由你控制,而大部分预防工作就在这里。干净、修剪过的音频,是最便宜的防幻觉办法。

  • 正确转换。 whisper.cpp 的 README 说,whisper-cli 目前只能处理 16 位 WAV 文件,并给出了转换其他格式的 ffmpeg 命令。
  • 先修剪。 转换之前剪掉长段静音和音乐,这样模型根本看不到它们。
  • 能设置语言就设置。 查看 whisper-cli 的帮助输出,找语言选项,而不是依赖自动检测。
  • 试试别的模型大小。 如果你只说英语而且内存紧张,OpenAI 说,只支持英语的 .en 模型在处理英语时往往表现更好,tiny 和 base 尤其明显。
  • 了解实时模式是什么。 whisper-stream 每半秒对麦克风采样一次并连续转写,README 称它是一个朴素的示例。

终端: 用 README 里的命令,把修剪过的录音转换成 whisper-cli 能读取的 WAV 格式。

ffmpeg -i input.mp3 -ar 16000 -ac 1 -c:a pcm_s16le output.wav

结果: ffmpeg 把 output.wav 写成 16 kHz、单声道、16 位的音频,然后你把它交给 -f 后面的 whisper-cli。

你为 whisper.cpp 下载的模型文件在 YapToText 里也能用:在 AI Models 页面的 Your own models 下,Add Model 可以接收任何 whisper.cpp 的 GGML .bin 文件。本地 Whisper 指南有完整的设置、模型大小和内存数据。

没有任何防护能保证的事

  • 每一种幻觉。 这些防护能抓住我见过、也测试过的模式。新的模式可能漏过去,所以原始转写始终只需点一下就能看到。
  • 从没听到的话。 没有任何防护能找回麦克风没有捕捉到的语音,删掉编造的文字留下的是一个空缺,而不是真正说过的话。
  • 我自己的比率。 我没有测量过 YapToText 或任何模型的幻觉率,所以这一页只引用已发表的研究,并说明它的局限。
  • 文件转写的额外功能。 文件的转写结果是纯文本,没有时间戳,所以无法从一行可疑的文字跳到它在音频里的位置。音频文件页面介绍了这项功能。
  • 把长时间停顿当作说话风格。 Whisper 是通用模型,除了压缩静音之外,YapToText 里没有任何设计改变它处理长停顿语音的方式。
  • Intel Mac。 YapToText 需要 macOS 14 或更高版本的 Apple 芯片 Mac。

防护能降低概率。读一读你听写的内容,仍然是最后一道检查。

小结

  • 它是什么。 它是背后没有语音的文字:循环、静音里的结束语、编造的句子和标签。
  • 为什么。 Whisper 既转写也预测,静音、停顿、音乐和噪声给了预测发挥的空间。
  • 在 YapToText 里。 长时间的静音会被压缩。重复循环、说话人标签和静音里的客套话会被删除。过度膨胀的整理结果会被丢弃。
  • 对任何人。 说完就停,修剪静音,设置语言,并读一读原始转写。

YapToText 在 Mac App Store 上免费,Whisper 在你的 Mac 上运行。

少给 Whisper 一些静音,并检查它写了什么。如果 YapToText 输入了你没说过的话,请在 GitHub 上提交 issue,并附上 History 里的原始转写。每一条我都会看。

在 Mac App Store 下载 YapToText免费下载。无需账号,没有锁定的功能。需要搭载 Apple 芯片的 Mac 和 macOS 14 或更高版本。 源代码在 GitHub 上。

关于作者。 Ryleigh Newman 从事软件开发,用手打字有困难,每天都用本站介绍的 YapToText 听写。本页译自英文。App 的界面和网站的其他页面是英文的。 进一步了解这个项目(英文)。

指南

更多指南(英文)

资料来源

常见问题

Whisper 为什么会产生幻觉?

OpenAI 的模型卡说,Whisper 是用大规模嘈杂数据训练的,可能输出并没有说出口的文字,很可能是因为它在转写的同时也在预测下一个词。静音、长时间停顿、音乐和噪声给这种预测提供了更多发挥的空间。

Whisper 为什么会写出“thank you for watching”?

这是一种已知的、发生在静音或音乐上的幻觉。Whisper 代码仓库里“Share your hallucinations here”讨论串中的用户,把它和字幕署名一起报告过。说完话就停止录音,并修剪掉静音,能少给它一些发挥的空间。

Whisper 为什么一直重复同样的文字?

OpenAI 的论文把陷入重复循环列为一种失败方式,它的模型卡说这种架构容易产生重复的文字。循环常常出现在静音的结尾,YapToText 的防护会把它折叠掉。

Whisper 幻觉有多常见?

Careless Whisper 研究发现,在它 2023 年的样本里,OpenAI 的 Whisper API 的转写大约有 1% 含有编造的短语或句子。你自己的比率取决于你的音频、你的模型和你的 App。

怎么解决 Whisper 幻觉?

少给它一些静音:说完就停,有意停顿,并修剪录音。设置语言,保证麦克风信号干净,并读一读原始转写,这样你就能看到 Whisper 实际写了什么。

YapToText 会产生幻觉吗?

它运行的是 Whisper,所以可能会。它会压缩长时间的静音,删除重复循环、编造的说话人标签和静音里幻觉出来的客套话,并丢弃远远超过你说的内容的整理结果。History 里能看到原始转写。