ComfyUIとWhisperで音質が変わった
「品質を測る」と「品質を上げる」を分けて考えた話。
前回、3つのTTSエンジンを比較して「読みの正確さと自然さは両立しない」という壁にぶつかった。次は「もっと自然な声を作る」と「504ページ分の音声品質をどう確認するか」の2つに取り組んだ。耳で全部聴くのは、もう「読む」のと変わらない。
8.6時間分を耳で確認するか、数値で「あやしい所」だけ拾って数分で済ませるか——Whisperを挟むだけで、確認の重みがそれくらい変わる。
やってみた理由
3エンジン比較で残った疑問は2つだった。
- もっと自然な声は作れないか — 好きな声で読ませる「音声クローン」や、声の特徴を指示で指定する「VoiceDesign」ができるらしい
- 音声品質を客観的に測れないか — 聴感評価だけで504ページ分を全部チェックするのは現実的じゃない
ComfyUIとWhisperで、この2つに取り組んだ。
やったこと
ComfyUIによるTTS拡張
ComfyUIは画像生成のノードベースUIだが、TTSのワークフローも組める。Qwen3-TTSをComfyUI経由で動かすと、APIを直接叩くより細かい制御ができる。
Voice Clone(音声クローン)
参照音声(11.8秒のWAV)から声質を取り、新しいテキストを読ませる。手順は3つ。
- 参照音声を24kHz/mono/PCM_16にリサンプル
- Whisper large-v3で参照音声を自動文字起こし(
hanazawa.json) - 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_narration | VoiceDesign | 落ち着いたナレーション調 |
| comfyui_clone_hanazawa | VoiceClone | 参照音声から声質を模倣 |
| comfyui_ono_anna | CustomVoice | プリセット + 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.42 | fail |
| 辞書追加後 | 吾輩は猫である。名前はまだ無い。 | 我輩は猫である。名前はまだ無い。 | 0.05 | pass |
「吾輩」を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すべてに使用