Whisperのハルシネーション:言っていない言葉が入る理由と、防ぐ方法

Whisperのハルシネーションとは、誰も言っていない言葉が文字起こしに入ることです。同じ語句が何度も繰り返される、無音の部分に「Thank you for watching」のような締めの言葉が出る、文がまるごと作り上げられる、といった形で現れます。Whisperは言語モデルとよく似た方法でテキストを書くため、音声が無音だったり、雑音が多かったり、不明瞭だったりすると、次に何が来るのが普通かという感覚が、実際に聞こえたものより強く働くことがあるからです。

OpenAI自身のモデルカードもこれについて警告していて、2024年の研究では、テストした文字起こしのおよそ1%に作り上げられた語句が見つかりました。私は、WhisperをMac上で動かす無料の音声入力アプリ、YapToTextを作っています。手でキーボードを打つことが難しく、毎日音声入力をしているので、モデルの周りの作業の大きな部分を、まさにこれを捉えることに充てました。以下では、ハルシネーションがどんなものか、なぜ起こるのか、研究で何がわかったか、YapToTextがそれにどう対処しているか、そしてどのWhisperの環境でもできること(whisper.cppを含む)を説明します。

Mac App StoreでYapToTextをダウンロード無料でダウンロードできます。アカウント不要で、機能の制限もありません。AppleシリコンのMac、macOS 14以降に対応しています。 ソースコードはGitHubにあります。

手順

  1. 話し終えたらすぐ録音を止めるか、<span lang="en">Dictation</span> ページで <span lang="en">Auto-stop after silence</span> をオンにします。
  2. 長く考えるときは、無音を録音せず、Spaceキーを押して一時停止します。
  3. <span lang="en">AI Models</span> ページの <span lang="en">Language</span> で、話す言語を選びます。
  4. ファイルを文字起こしする前に、長い無音と音楽を切り詰めます。whisper-cliを使う場合は、16ビットのWAVに変換します。
  5. <span lang="en">History</span> で <span lang="en">Show pipeline details</span> をクリックして元の文字起こしを読みます。または話している間に2を押して、<span lang="en">Raw Transcription</span> にします。

Whisperのハルシネーションはどんなものか

OpenAIのWhisperの論文は、失敗の種類を平易な言葉で挙げています。繰り返しのループにはまる、音声の区間の最初や最後の数語を文字起こししない、そして完全なハルシネーションです。完全なハルシネーションとは、実際の音声とまったく関係のない文字起こしをモデルが出力することです。実際には、4つのパターンで現れます。ハルシネーションは聞き間違いではありません。裏に音がまったくない言葉です。

  • 繰り返しのループ。 同じ文、語句、単語が何度も繰り返されます。録音の最後が無音に消えていく場合に多く見られます。OpenAIのモデルカードによると、sequence-to-sequenceのアーキテクチャのため、モデルは繰り返しのテキストを生成しやすく、ビームサーチと温度のスケジューリングである程度は軽減できますが、完全にはなくせません。
  • 無音から出るテキスト。 Whisperのリポジトリにある「Share your hallucinations here」という題のディスカッションのスレッドでは、誰も話していない無音、音楽、効果音の部分に、「Thank you for watching」のような行や字幕のクレジットが現れたという報告が寄せられています。
  • 作り上げられた文。 一度も言われていない語句がまるごと入ります。Careless Whisperの研究についてのコーネル大学の記事によると、Whisperは語句や文をまるごと作り上げることがときどきあり、暴力的な言葉、作り上げられた個人情報、偽のWebサイトが含まれることもあります。
  • ラベルとト書き。 話し言葉ではなく台本のように読めるテキストです。YapToTextの1.4のリリースノートには、「Male speaker:」のようなハルシネーションの話者ラベルが文字起こしに現れる問題の修正が記録されています。

反対の失敗として、最初や最後の言葉が抜けることも関連していて、最初の言葉が欠けているのに最後に存在しない行が入っている、ということが同じ録音で起こりうるのはそのためです。普通の聞き間違いは別の問題で、直し方も違います。それは Mac用Whisperのガイド で説明しています。

Whisperがハルシネーションを起こす理由

OpenAIはモデルカードで原因を説明しています。モデルは、大規模でノイズの多いデータで弱い教師あり学習をされたため、予測の中に、音声で実際には話されていないテキストが含まれることがあります。モデルカードは、モデルが次の単語を予測することと、音声自体を文字起こしすることを組み合わせているために起こるのではないかと示唆していて、リソースの少ない言語や、見つけにくい言語では、この振る舞いがより悪くなることがあると述べています。頼れる音がほとんどないとき、モデルの推測する半分がより多くの仕事をします。

そこから、ハルシネーションを招く条件がわかります。

  • 無音と長い間。 Careless Whisperの研究は、ハルシネーションが、声を出していない時間の割合が長い人、つまり間が長い人に偏って起こることを見つけました。
  • 音楽と効果音。 Whisperのリポジトリの報告は、話し声のない区間に集まっています。
  • 雑音が多い、または弱い信号。 不明瞭な話し声は、モデルが各語を結び付ける手がかりを少なくします。
  • 言語。 OpenAIは、性能は言語によって大きく異なると述べていて、モデルカードは、リソースの少ない言語ではハルシネーションがより悪くなることがあると述べています。

見つけるために重要な点がもう1つあります。研究では、OpenAIのWhisper APIのハルシネーションは非決定的で、実行のたびに違うランダムなテキストが出ることがわかり、同じ音声を2回実行した結果の違いを使ってハルシネーションを見つけました。ツールが同じ音声に対して2回の実行で違うテキストを出すなら、変わった部分をもう一度見る価値があります。

Careless Whisperの研究でわかったこと

その研究は、Allison Koenecke、Anna Seo Gyeong Choi、Katelyn X. Mei、Hilke Schellmann、Mona Sloaneによる「Careless Whisper: Speech-to-Text Hallucination Harms」で、ACM Conference on Fairness, Accountability, and Transparency(FAccT 2024)で発表されました。割合は小さいですが、作り上げられた1つの文の害は大きくなりえます。

2026年10月5日に、arXivとACM Digital Libraryの論文、およびコーネル大学のニュース記事で確認しました。

  • 何をテストしたか。 AphasiaBankのほぼ40時間の音声、13,140区間です。失語症のある話者と対照群の音声を、2023年にOpenAIのWhisper APIに送りました。
  • どのくらいの頻度か。 文字起こしのおよそ1%に、元の音声にどんな形でも存在しなかった語句や文がまるごと含まれていました。
  • どのくらい深刻か。 ハルシネーションの38%に、暴力を助長する、不正確な関連付けを作り上げる、偽の権威を示唆するといった、明白な害が含まれていました。
  • 誰に。 失語症のある話者のほうが対照群よりハルシネーションが多く、声を出していない時間が長い区間ほど、それが起こりやすい傾向がありました。
  • 時間がたつと。 著者が2023年12月に同じ音声を再実行すると、多くの例は解消されましたが、187の音声区間のうち12で、ハルシネーションがまだ出ていました。

これらの数字を読むときに、区別しておくべきことが2つあります。それは2023年のそのサンプルでのOpenAIのホスト型APIについての数字であって、whisper.cppでも、Whisper Large v3 Turboでも、YapToTextでもないため、ご自身の音声入力の予測ではありません。また、慌てる理由でもありません。話した内容を読み直す理由であり、それはもともと良い習慣です。話し方に長い間が含まれる場合は、状態別の音声入力 に、YapToTextが力不足になりうる場面が正直に書いてあります。

YapToTextがそれを防ぐしくみ

YapToTextは、標準のWhisper Large v3 Turbo (Q5)のファイルを、whisper.cppで実行します。モデルを再学習してはいません。私が作ったのは、その周りのパイプラインで、その一部は、誰も言っていない言葉を書類に入れないためにあります。モデルは標準のものです。手間をかけたのは、その周りの防御です。

Whisperが聞き取る前に

  • 長い無音は圧縮されます。 文字起こしの前に行うので、モデルが迷走しません。
  • 雑音は音声入力のたびに測定され、一定の雑音は、比率が必要としたときだけ差し引かれます。小さな声は、部屋の音に対して持ち上げられます。
  • 雑音の多いクリップはより深く探索されます。 クリップの雑音が大きいと測定されると、デコードはグリーディからビームサーチに切り替わります。
  • キーを押す前の0.5秒が保持されます。 そのため、最初の言葉が切れません。
広げた録音パネルの上に、前述の音声処理の手順が並んだ、It hears you through anything と書かれたApp Storeのポスター。
図1. 標準のモデルの周りの手順で、背景ノイズの除去から無音の理解まであります。ハルシネーションを防ぐ処理の大部分は、ここと、文字起こしが返ってきた直後に行われます。

文字起こしが返ってきたあとに

  • 繰り返しのループは検出されて取り除かれます。 無音の末尾でWhisperがはまるループを、防御の処理がまとめて1つにします。1.4以降は、無音で終わる長い音声入力で、最後の文が何度も繰り返されることはなくなりました。
  • 作り上げられた話者ラベルは取り除かれ、ト書きも同様です。1.4の修正の前は、「Male speaker:」のようなラベルが、語彙として学習されてしまうこともありました。
  • 無音から作り上げられた挨拶の言葉は、検出されて取り除かれます。
  • 無音は何も入力しません。 音声入力が無音だけだった場合、YapToTextは「Didn't catch that」と表示し、何も文字起こしされません。
  • 短い文字起こしには2回目の処理があります。 入力された音声より短いテキストが返ってきた場合は、救済の処理が実行されます。

整形モデルがおかしな動作をしたとき

Raw Transcription 以外のすべてのモードは、文字起こしをMac上の小さな整形モデルに渡します。言語モデルも作り話をすることがあります。アプリはその仕事を点検します。結果がアシスタントの返事のように読める、話した内容を大きく超えて長くなる、参照のテキストを繰り返す、または省略記号を作り上げた場合は、その結果が捨てられ、代わりに元の文字起こしが入力されます。整形には、文を落とさないことと、話していないことを付け加えないことも、あらかじめ指示してあります。それらの規則は AI音声入力のページ で説明しています。

これらの変更はどれも、公開する前に、私自身の実際の音声入力で作ったテスト環境で測定しています。それは1人分の録音であって、ベンチマークではなく、検出して取り除くことは、決して起こらないこととは同じではありません。新しい種類のハルシネーションは、すり抜けることがあります。

Whisperが実際に聞き取ったものを見る

ハルシネーションと整形の間違いを見分ける最も手早い方法は、ほかの何かが手を加える前にWhisperが出力したものを見ることです。作り上げられたテキストが元の文字起こしに入っているなら、書いたのはWhisperです。入っていないなら、整形が書きました。

手順1:Historyで音声入力を開く

  • 操作: History を開き、その音声入力を見つけて、Show pipeline details をクリックします。
  • YapToText: 最終的なテキストの上に元の文字起こしを表示し、その下にモード、言語、所要時間を表示します。
  • 確認: 元の文字起こしを、自分が話したと覚えていることと照らし合わせて読みます。
パイプラインの詳細を開いたYapToTextのHistoryの項目。元の文字起こし、整形後の文字起こし、モード、配信、対象のアプリ、所要時間が表示されている。
図2. 元の文字起こしが整形後のテキストの上にあるので、誰も言っていない行が、Whisperによるものか整形によるものかをたどれます。

手順2:次の音声入力を元のままにする

  • 操作: 話している間に 2 を押します。Autoモードがオンの初期の並び順では、これが Raw Transcription です。
  • YapToText: その1回の音声入力に限り、AIモデルを使わず、基本的な句読点だけを付けて、Whisperの言葉をそのまま入力します。
  • 確認: 入力されたものが、Whisperが聞き取ったものです。すべての音声入力を元のままにするには、Homeページの Post-transcription analysis をオフにします。

各 History の項目の書き出しメニューにある Copy Raw Transcript は、整形前のバージョンをクリップボードにコピーします。また、長い音声入力を、入力される前にすべて読みたい場合は、Settings、Advanced、Text output で Review before inserting をオンにします。各モードが何を変更できるかは、モードのガイド で説明しています。

どのWhisperアプリでもハルシネーションを防ぐ

ハルシネーションの大半は無音から生まれるので、最善の予防は、Whisperに渡す無音を減らすことです。以下はどのWhisperアプリでも使え、YapToTextの設定は当てはまるところで名前を挙げています。入る無音が少ないほど、作り上げられる言葉も少なくなります。

  1. 終わったら止める。 録音を流しっぱなしにせず、話し終えたらすぐキーを軽く押します。YapToTextでは、Dictation ページの Recording カードにある Auto-stop after silence(初期設定ではオフ)が、0.5秒から5秒の静けさのあとに音声入力を終わらせます。
  2. 意図して間を置く。 途中で長く考えるときは、Space を押して音声入力を一時停止し、もう一度押して再開します。スペースが入力されることはありません。
  3. 言語を設定する。 Whisperに推測させず、AI Models ページの Language で話す言語を選びます。言語のページ に、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 カードにあり、初期設定ではオフです。オンにすると、話をやめたときに音声入力が終わります。

キーとショートカットのページ では、SpaceやEscなどを説明しています。

whisper.cppを使う人へのヒント

Whisperをwhisper.cpp経由で自分で動かしているなら、入力する音声を自分で管理できます。予防の大部分はそこにあります。きれいに切り詰めた音声は、ハルシネーション対策として最も安上がりです。

  • 正しく変換する。 whisper.cppのREADMEによると、whisper-cliは現在16ビットのWAVファイルでしか動かず、それ以外を変換するffmpegのコマンドも載っています。
  • 先に切り詰める。 変換する前に長い無音と音楽を切り取って、モデルが見ないようにします。
  • できれば言語を設定する。 検出に頼らず、whisper-cliのヘルプの出力で言語のオプションを確認します。
  • 別のモデルサイズを試す。 英語しか話さず、メモリに余裕がない場合、英語専用の.enモデルのほうが、特にtinyとbaseで、英語に対して良い結果になる傾向があると、OpenAIは述べています。
  • ライブモードが何かを知る。 whisper-streamは0.5秒ごとにマイクをサンプリングして、連続して文字起こしします。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が話していないことを入力したときは、History の元の文字起こしを添えて、GitHubでissueを作成してください。すべて読んでいます。

Mac App StoreでYapToTextをダウンロード無料でダウンロードできます。アカウント不要で、機能の制限もありません。AppleシリコンのMac、macOS 14以降に対応しています。 ソースコードはGitHubにあります。

このページを書いた人。 Ryleigh Newmanはソフトウェアを開発しています。手でキーボードを打つことが難しいため、このサイトで紹介しているアプリ、YapToTextで毎日音声入力をしています。このページは英語から翻訳したものです。アプリの画面とサイトのほかのページは英語です。 プロジェクトについて(英語)。

ガイド

そのほかのガイド(英語)

出典

よくある質問

Whisperがハルシネーションを起こすのはなぜですか

OpenAIのモデルカードによると、Whisperは大規模でノイズの多いデータで学習されていて、話されていないテキストを出力することがあります。文字起こしだけでなく次の単語の予測もしているためと考えられています。無音、長い間、音楽、雑音は、その予測に余地を与えます。

Whisperが「thank you for watching」と書くのはなぜですか

無音や音楽の部分に出る、よく知られた種類のハルシネーションです。Whisperのリポジトリの「Share your hallucinations here」のスレッドで、利用者が字幕のクレジットとともに報告しています。話し終えたら録音を止め、無音を切り詰めると、その余地が減ります。

Whisperが同じテキストを繰り返し続けるのはなぜですか

OpenAIの論文は、繰り返しのループにはまることを失敗の種類として挙げていて、モデルカードは、アーキテクチャが繰り返しのテキストを生成しやすいと述べています。ループは無音の末尾によく現れ、YapToTextの防御はそれを1つにまとめます。

Whisperのハルシネーションはどのくらいよくありますか

Careless Whisperの研究では、2023年のサンプルで、OpenAIのWhisper APIの文字起こしのおよそ1%に、作り上げられた語句や文が含まれていました。実際の割合は、音声、モデル、アプリによって変わります。

Whisperのハルシネーションを直すには

渡す無音を減らします。終わったら止め、意図して間を置き、録音を切り詰めます。言語を設定し、マイクのきれいな信号を使い、元の文字起こしを読んで、Whisperが実際に何を書いたかを確かめます。

YapToTextもハルシネーションを起こしますか

Whisperを動かしているので、起こりえます。長い無音を圧縮し、繰り返しのループ、作り上げられた話者ラベル、無音から出る挨拶の言葉を取り除き、話した内容を大きく超えて伸びた整形は捨てます。Historyで元の文字起こしを確認できます。