🔬 不器用パパの休日

ComfyUIとWhisperで音質が変わった

「品質を測る」と「品質を上げる」を分けて考えた話。

前回、3つのTTSエンジンを比較して「読みの正確さと自然さは両立しない」という壁にぶつかった。次は「もっと自然な声を作る」と「504ページ分の音声品質をどう確認するか」の2つに取り組んだ。耳で全部聴くのは、もう「読む」のと変わらない。

8.6時間分を耳で確認するか、数値で「あやしい所」だけ拾って数分で済ませるか——Whisperを挟むだけで、確認の重みがそれくらい変わる。

TTS品質フィードバックループ

やってみた理由

3エンジン比較で残った疑問は2つだった。

  1. もっと自然な声は作れないか — 好きな声で読ませる「音声クローン」や、声の特徴を指示で指定する「VoiceDesign」ができるらしい
  2. 音声品質を客観的に測れないか — 聴感評価だけで504ページ分を全部チェックするのは現実的じゃない

ComfyUIとWhisperで、この2つに取り組んだ。

やったこと

ComfyUIによるTTS拡張

ComfyUIは画像生成のノードベースUIだが、TTSのワークフローも組める。Qwen3-TTSをComfyUI経由で動かすと、APIを直接叩くより細かい制御ができる。

Voice Clone(音声クローン)

参照音声(11.8秒のWAV)から声質を取り、新しいテキストを読ませる。手順は3つ。

  1. 参照音声を24kHz/mono/PCM_16にリサンプル
  2. Whisper large-v3で参照音声を自動文字起こし(hanazawa.json
  3. ComfyUIワークフロー(4ノード)で「参照音声 + テキスト → 合成音声」

tts.sh のcloneモードで一連を自動化した。

VoiceDesign(声質デザイン)

参照音声なしで、声質を自然言語で指示する方式。

A young Japanese woman narrating a novel in a quiet, subdued tone.
Speak like reading an audiobook with restrained emotion.

このinstruct一文で、落ち着いたナレーション調の音声が生成される。プリセットを使い回すのとは別の自由度がある。小説のジャンルに合わせた声質を、言葉で組み立てられる。

プリセットモード特徴
comfyui_design_narrationVoiceDesign落ち着いたナレーション調
comfyui_clone_hanazawaVoiceClone参照音声から声質を模倣
comfyui_ono_annaCustomVoiceプリセット + instruct

Whisperによる音声品質の自動検証

「正しく読めているか」を機械的に測る方法を考えた。逆方向に戻せばいい。

TTS音声 → Whisper STT → 元テキストと比較 → CER(文字エラー率)

TTSが正しく読めていれば、Whisperで文字起こしした結果は元テキストに近づくはず。CERが小さいほど一致度が高い、という考え方。

faster-whisper導入

faster-whisperはWhisperの高速実装。GPU推論なら十分実用的な速度で回せる。

環境20分音声の処理時間倍率
GPU(RTX 5090、float16)57〜84秒×6.9
CPU(int8)576秒×1(基準)

20分の音声を1分で文字起こしできる。これなら1冊全チャンクを夜のうちに回せる。

CER判定基準

CER判定意味
< 5%pass問題なし
5〜15%warn部分的に怪しい
≥ 15%fail重大な問題あり

実例:fail → 辞書追加 → pass

文章で書いてもピンとこないので、「吾輩は猫である」の冒頭で起きたことを並べる。

状態元テキストWhisper書き起こしCER判定
辞書なし吾輩は猫である。名前はまだ無い。ご拝はね子である。名前はまだ無い。0.42fail
辞書追加後吾輩は猫である。名前はまだ無い。我輩は猫である。名前はまだ無い。0.05pass

「吾輩」をTTSが「ごはい」と読んでしまうと、Whisperはそれっぽい漢字を当てて書き起こす。聴き比べると差がはっきりする。

fail例(辞書なし、「吾輩」を取り違えて読んだ音声)

pass例(辞書追加後、同じ文章を再生成した音声)

大事なのは、Whisperの書き起こしが「TTSが間違って読んだ音」を反映していること。元テキストとの差が大きいチャンクは、ほぼ間違いなく耳で聴いても違和感がある。

品質フィードバックループ

failのチャンクだけ自動で再生成する仕組みも組んだ。

TTS音声 → Whisper STT → CER測定
            ↓ fail
   読み仮名辞書を更新 → 該当チャンクを再生成 → 再測定
            ↓ pass
        合格として出力

tts-auto-regen.sh がfailチャンクの再生成を回す。辞書更新は手作業が残るが、再生成自体は自動化できた。

Whisperのハルシネーション対策

Whisperには「実際の音声にない単語を勝手に出力する」という困った癖がある。これを放置すると、CERが「TTS品質」ではなく「Whisperの幻聴度合い」を測ることになってしまう。

3つのフィルタを入れた。

  • 反復検出 — 同じフレーズの異常な繰り返しを除去
  • 末尾ハルシネーション除去 — 音声末尾に追加される無関係なテキストを削除
  • セグメントフィルタ — 信頼度の低いセグメントを除外

あるチャンクではフィルタ前323セグメント → フィルタ後148セグメントまで減った。半分以上が幻聴だった計算になる。フィルタを入れて、ようやくCERが「TTS品質の指標」として使えるようになった。

ハルシネーション例(フィルタ前のWhisper出力をそのまま音声にしたサンプル)

同じフレーズが繰り返されたり、音声末尾に無関係なテキストが追加されたりする。フィルタなしのWhisper出力をCER測定にそのまま使うと、「TTS品質」ではなくこれを測ってしまう。

CER数値の解釈

実際に504ページの小説でCERを測ったら、0.678だった。

数字だけ見ると壊滅的だが、パイプラインの欠陥ではない。

  • 日本語TTS→STTの宿命 — TTSが正しく読んでも、Whisperが別の漢字で書き起こすケースが多い。「吾輩」を正しく「わがはい」と読んでも、Whisperは「我輩」と書くことがある
  • 作品固有の語彙 — 古典作品の言い回しや、作品独自の固有名詞はWhisperの語彙とずれる。読みは合っていても、漢字が一致しないのでCERは膨らむ

CERは「ハルシネーション・文の脱落・完全な誤読」のような重大事故の検出には向いている。日本語の同音異義語による数字の膨らみは、閾値で切るしかない。最終的には「CER + 人間の聴感評価」のハイブリッドに落ち着いた。

結果

504ページ小説の完走結果

  • 全26チャンク品質検証PASSED(failed_chunks=0)
  • 最終オーディオブックbook_all.wav(12GB、8.6時間)→ book_all.mp3(475MB、128kbps)
  • チャンク間結合:1.5秒の無音挿入 + EBU R128ラウドネス正規化
  • 出力形式:MP3(チャプターマーカー付き)

504ページの小説が、8.6時間のオーディオブックになった。

うまくいった点

  • 「測ってから改善する」流れ — TTS→STT→比較で数字を出す仕組みは正しかった。完璧なメトリクスじゃないが、明らかにおかしいチャンクだけは自動で見つけられる。それで十分価値がある
  • ComfyUI VoiceDesignの自由度 — instructで声質を指示できるのは、プリセット選びとは違う設計の仕方になる。小説のジャンル(SF・恋愛・ホラー)に合わせた声質を、言葉で組み立てられる
  • ハルシネーションフィルタ — Whisperの幻聴を放置するとCERが意味をなさない。フィルタを入れて初めて指標として使えるようになった
  • EBU R128ラウドネス正規化 — チャンク間の音量差が気にならなくなった。プロのオーディオブックと同じ放送規格で揃えると、切り替わりの違和感がほぼ消える

失敗・課題

  • CER 0.678の数字をどう扱うか — 数字だけ見れば壊滅的だが、原因の大半は同音異義語問題。閾値設定と解釈は日本語固有のチューニングが必要だった
  • ComfyUI音声クローンの倫理問題 — 声優の声を模倣できてしまう技術。個人利用の範囲で止めているが、「どこまでがOKか」は常に意識が必要
  • ハルシネーションは完全には消えない — フィルタで大幅に減ったが、ゼロにはならない。文脈的に自然だが実在しない単語をWhisperが生成するケースは、パターンマッチでは捕捉しきれない
  • 辞書更新は手作業のまま — 「fail判定 → 再生成」は自動化したが、「何を辞書に追加するか」の判断は人間がやることになった

次にやること

OCR→LLM→TTS→品質検証——パイプラインの全ステップが動くようになった。504ページの小説が8時間のオーディオブックに変換できた。

ただ「完全自動」ではない。読み仮名辞書の更新、failチャンクの確認、声質の調整、随所に人間の判断が残っている。

最終回では、この「完全自動を目指して、結局ハイブリッドに落ち着いた」話をまとめる。


この実験で使った機材 【PR】

ZOTAC GAMING GeForce RTX 5090 SOLID — faster-whisperのGPU推論(CPU比7倍速)、ComfyUI TTS、Qwen3-TTSすべてに使用