CASE · 軽微 · other
検証済み運営者の一次記録無音45秒を「音声なし確率0%・高信頼」で文字起こしした
完全な無音を音声認識モデル(Whisper)に渡すと、「ご視聴ありがとうございました」のような定型句が返ってきた。しかも返ってきた数値は、音声なしの確率が0%、信頼度も高かった。
約3分で読めます
- 発生日
- 分類
- other
- 影響範囲
- data
- 検知
- manual-audit
- タグ
- #whisper #speech-to-text #hallucination #confidence-score #silence
CH 1
原因
Whisperは無音の区間に、言語ごとに決まった定型句を書き込むことがある。その際、モデル自身が出す信頼度の数値は、幻聴を見分ける手がかりにならなかった。
CH 2
結果
自作の文字起こしツールの出力に、話されていない文が混ざりうる状態だった。信頼度にしきい値を置く一般的な対策は、この幻聴には効かないことが分かった。
CH 3
対策
時間の長さで判定する方式を作った。中身の無い定型句であること、その区間を埋めるには文字数が少なすぎるか前後が無音であること、の両方が揃ったときだけ外す。外した行は捨てずに、時刻と理由を添えて別ファイルに残す。
何が起きたか
自作の文字起こしツールは、音声認識にWhisperを使っている。クラウド経由 (Groq の whisper-large-v3-turbo)と、手元で動かす whisper.cpp の2つの経路がある。
無音の区間に、話されていない定型句が出ることがある。これを確かめるため、 45秒の完全な無音を送った。日本語なら「ご視聴ありがとうございました」が返ってきた。 手元の whisper.cpp でも、同じ文が同じ区間(0.00〜29.98秒)に出た。
現場の混乱
Whisperの幻聴そのものは、よく知られた現象だ。普通の対策は、モデルが一緒に返す
数値を見ることになる。音声なしの確率(no_speech_prob)が高い区間や、
平均の対数確率(avg_logprob)が低い区間を外せばいい、という考え方だ。
実測の値は、その考え方を裏切った。完全な無音に対して、no_speech_prob は
0.0000、avg_logprob は -0.151。「音声なしの確率0%、しかも高信頼」だった。
しきい値を置く先が無い。
返ってくる文は言語ごとに決まっていた。14言語を実測すると、英語は「Thank you.」、 韓国語は「감사합니다.」、フランス語は「Sous-titrage Société Radio-Canada」、 ロシア語は「Продолжение следует…」だった。
原因
幻聴は、Whisperが一度に見る30秒の窓をまるごと埋める。中身はあっても、 話し方としてはありえない長さになる。モデルの信頼度は「この文をどれだけ確信して 出したか」であって、「本当に話されたか」ではない。ここで二つは一致しなかった。
対策
- 手がかりを時間の側に求めた。過去の出力5009区切りを数えると、本物の発言の 最長は19.51秒、1秒あたりの文字数の中央値は7.92字だった。14文字を10.7秒かけて 言うのは、本物の話し方ではない。
- 外すのは、「中身の無い定型句であること」と「その区間を埋めるには文字数が 少なすぎる、または前後が無音ばかり」の両方が揃ったときだけにした。前者だけだと 本物の「ありがとうございました」を消し、後者だけだと本物の短い相槌を消す。
- 「同じ行が連続したら消す」は採らなかった。実データには、本物の発言として 同じ言葉が2回、3回と続く箇所があった。
- 外した行は捨てず、時刻と理由を添えて別のファイルに残す。判定を誤っても 取り戻せることが、自動で消す機能の前提になる。
- 過去のジョブの出力を総なめにして、本物の発言を消さないことを確かめる試験を 常時走らせている。
出典
- 運営者自身が起こした事故の一次記録です。外部に公開された元記事はありません。
この記録をチームに回す