ハルシネーション
更新日:
定義
音声認識におけるハルシネーションとは、誰も言っていないのにモデルが生成するテキストです。無音やノイズ、短すぎて文字起こしできない断片から作り出された、もっともらしいフレーズです。挿入誤りの極端な形といえます。
どの音声モデルもテキストを出すように訓練されているので、話し声を含まない音声を与えられても、何かを出そうとします。よく知られているのがWhisperのようなバッチモデルで、数秒間の部屋の環境音を入力すると、「Thank you for watching」(日本語なら「ご視聴ありがとうございました」)や、別の言語の文をまるごと出力することがあります。こうした文字列が、訓練データの録音の終わりによく出てきたからです。出力は流暢で、自信たっぷりに間違っています。
同じ言葉は、事実をでっち上げる言語モデルにも使われ、その仕組みも似ています。もっともらしい出力をするように最適化されたシステムは、入力がそれを裏付けているかどうかに関係なく、それを出力します。音声入力ツールでのハルシネーションとは、話していないテキストがドキュメントに入ることです。
起こる場面
1つ目は、録音の最初や最後の無音です。キーを離した時点でのキャプチャと音声区間検出が重要なのはそのためです。2つ目は、1語だけや咳のような、ごく短い発話です。モデルが手がかりにできるものが少なすぎます。3つ目は、動画や同僚の声などの背景の話し声です。本物の話し声ですが、あなたのものではありません。4つ目は長い録音です。モデルによっては位置を見失い、同じ部分を繰り返します。どれにも既知の対策があり、それを適用していないツールは、いずれ思わぬ結果を出します。
優れたツールの防ぎ方
まず音声区間検出を動かし、話し声でない音声は認識器に送りません。両端の無音を削ります。最小の長さに満たないクリップの結果は捨てます。対応する音声エネルギーがないのにモデルがテキストを出していないかを監視し、出していれば捨てます。整形の側では、文字起こしになかった内容語を加える書き換えを拒否し、整形モデルもハルシネーションを起こせないようにします。これをすべて行うツールでも、聞き間違えることはたまにあります。しかし、文をでっち上げることは決してあってはなりません。
コマンドラインでWhisperのハルシネーションを減らす方法
オープンソースのWhisperコマンドラインツールで録音を文字起こし、テキストがでっち上げられたり繰り返されたりする場合、ツールにはまさにそのためのオプションが用意されています。問題がなくなるわけではありませんが、よくある2つの形に対処できます。無音部分にテキストがでっち上げられる場合と、一節がループして繰り返される場合です。
Whisperの開発者は、これらのチェックを不安定な予測への応急処置であり、根本的な解決ではないと説明しています。設定を変えたら、結果を音声と照らし合わせて確認してください。
- ターミナルを開き、まずデフォルトの設定でファイルを1回処理します。例:whisper recording.wav --model turbo。でっち上げや繰り返しのテキストが現れる箇所をメモします。
- 一節が繰り返される場合は、--condition_on_previous_text Falseを付けてもう一度実行します。ドキュメントによると、ウインドウ間でテキストの一貫性が下がることがありますが、モデルが失敗のループに陥りにくくなります。
- 無音部分にテキストが現れる場合は、--word_timestamps True --hallucination_silence_threshold 2を付けます。単語のタイムスタンプが有効なとき、ハルシネーションの可能性が検出されると、指定した秒数より長い無音区間を読み飛ばします。
- --no_speech_thresholdはデフォルトの0.6、--logprob_thresholdはデフォルトの-1.0のままにしておきます。変える理由がある場合だけ変更してください。この2つの組み合わせで、区間を無音として扱うかどうかが決まります。
- 任意のオーディオ編集アプリで録音の最初と最後の長い無音を切り取り、もう一度実行します。モデルが扱う音声以外の部分が少なくなります。
- 最初の手順でメモした箇所で、新しい文字起こしを音声と比べます。
ハルシネーションと聞き間違い:見分け方
聞き間違いは、言った単語の位置に別の誤った単語が入るものです。言った内容と音が似ていて、モデルがなぜそれを選んだのかがわかります。ハルシネーションは、音声の中に元がまったくありません。Whisperの論文は、その極端な例を、実際の音声とまったく関係のない文字起こしと説明しています。
違いが重要なのは、対処法が異なるからです。聞き間違いは、よりよいマイク、はっきりした発音、辞書への登録で改善します。ハルシネーションは、無音やノイズをモデルに渡さないようにするか、モデル自身が自信を持てなかった出力を捨てることで防ぎます。
- 黙っていたところや話し終えた後にテキストが現れたら、ハルシネーションです。
- 同じ語句や文が何度も続けて繰り返されるのは繰り返しループで、Whisperの論文はハルシネーションとは別の失敗として挙げています。
- 正しい単語と音が似た誤った単語は、聞き間違いです。
- 録音の最初や最後の数語が抜け落ちるのは、Whisperの論文が挙げる3つ目の失敗で、ハルシネーションではなく脱落です。
Whisperが自分の出力の失敗を判定する仕組み
オープンソースのWhisperのコードは、30秒のウインドウごとにデコードした後でチェックを行います。生成されたトークンの平均対数確率が-1.0を下回るか、テキストのgzip圧縮率が2.4を上回ると、そのウインドウは失敗とみなされ、より高い温度でもう一度デコードされます。繰り返しの多いテキストはよく圧縮されるため、圧縮率でループを検出できます。
無音について論文は、無発話トークンの確率だけでは発話のないウインドウを検出するには不十分だと述べています。無発話のしきい値0.6と対数確率のしきい値-1を組み合わせると、検出の信頼性が上がります。それでもモデルカードには、ハルシネーションと繰り返しのテキストが既知の制限として記載されています。
よくある質問。
音声入力アプリが、言っていないことを書いたのはなぜですか?
録音の終わりの無音やごく短いクリップなど、話し声を含まない音声が認識器に渡され、それでももっともらしいフレーズを生成した可能性が高いです。これはバッチモデルの既知の挙動で、音声区間検出と無音の削除で防げます。
整形のステップでもハルシネーションは起きますか?
はい。言語モデルが文字起こしを自由に書き換える場合は起きます。防ぐには、出力で言いよどみを取り除いたり句読点を直したりはしても、言っていない内容語は決して加えない、というルールを設け、そのルールを破った書き換えは捨てることです。
Whisperが同じ文を何度も繰り返すのはなぜですか?
Whisperのモデルカードによると、sequence-to-sequenceのアーキテクチャのため、繰り返しのテキストを生成しやすい傾向があります。オープンソースのコマンドラインツールでは、--condition_on_previous_text Falseを設定すると、モデルがそうしたループに陥りにくくなります。
大きいWhisperモデルならハルシネーションは起きませんか?
確実ではありません。Whisperの論文によると、モデルが大きくなるにつれて、似た音の単語の取り違えといった知覚の誤りは着実に減りましたが、繰り返しループとハルシネーションはしぶとく残り、デコードの問題だとされています。
ハルシネーションは文字起こしの誤りと同じものですか?
文字起こしの誤りの一種です。ほとんどの誤りは実際に言った内容の聞き間違いですが、ハルシネーションは話した元がまったくないテキストで、単語誤り率を計算するときは挿入として数えられます。