Fish Audio S2でボイスクローン -- 自分の声でTTS生成する実験
ElevenLabsの次の選択肢として、Fish Audio S2を触った。自分の声を録音してクローンモデルを作り、APIを叩いて402エラーに阻まれ、Webプレイグラウンドに切り替えて感情タグを3パターン試し、固有名詞の発音がズレるのをひらがな変換で潰した。一日の終わりには生成スクリプトにカタカナ→ひらがな変換関数が追加されていた。
Fish Audio S2とは
Fish Audio S2はOSSベースのTTSサービスで、ボイスクローン(声の複製)機能を持つ。HuggingFaceでモデルの重みが公開されており、ローカルでも動かせる。APIでの利用もでき、Webプレイグラウンドからブラウザ上で手軽に試せる。
前日までにVOICEVOX、Google Cloud TTS、ElevenLabsと3つのTTSエンジンを試してきた。「自分の声で教材ナレーションを生成できないか」という実験がFish Audio S2を触る動機だった。
ボイスクローンモデルの作成
自分の声でクローンモデル test_akira を作成した。
ボイスクローンには90秒程度のサンプル音声が必要になる。ニュートラルなトーンで読める文章を用意し、録音した。サンプルテキストは感情の起伏を抑えた説明口調の文章にした。クローンモデルは数分で生成が完了し、すぐにテストに使える状態になった。
API経由のテスト -- 402残高不足
最初はAPIで音声生成を試みた。リクエストを投げたところ、HTTPステータス402(Payment Required)が返ってきた。アカウントの残高が足りない。
Free枠のクレジットを使い切っていたのが原因だった。課金する前にまず品質を確認したかったので、APIは一旦諦めてWebプレイグラウンドに切り替えた。Webプレイグラウンドでは無料で手動テストができる。
感情タグの3パターン試行
Fish Audio S2はテキスト中に角括弧タグ([happy]、[sad] など)を埋め込むことで、読み上げの感情を制御できる。ElevenLabsのAudio Tagsと同じ発想だ。
3つのパターンを試した:
- パターン1: タグなし -- 素の読み上げ。ニュートラルで安定しているが、抑揚が平坦
- パターン2: 文頭にタグ1つ --
[gentle]を冒頭に置く。全体のトーンがやや柔らかくなる - パターン3: 文中に複数タグ -- 台詞の切れ目ごとにタグを切り替える。感情の変化は出るが、タグ境界で不自然な間が入る箇所があった
ElevenLabsのAudio Tagsと比べると、感情の変化幅はやや控えめだった。ただし、ベースの音声が自分の声のクローンなので、「自分が喋っている感」はFish Audioの方が当然ながら強い。
固有名詞の発音問題とひらがな変換
テスト中に固有名詞の発音ズレが見つかった。登場人物の名前「ユイ」の発音が意図と違う読みになる。
VOICEVOXでも「石」が「こく」と読まれる問題があったが、同じ系統の問題だ。対処法もVOICEVOXと同じで、カタカナをひらがなに変換してTTSエンジンに渡すことで発音を安定させた。「ユイ」→「ゆい」に変換するだけで正しいイントネーションで読み上げられるようになった。
料金調査
Fish Audio S2の料金体系を調べた。
| プラン | 価格 | 内容 |
|---|---|---|
| Pay-as-you-go | $10 | 約22万文字 |
| Plus | $15/月 | 月25万クレジット |
ElevenLabsのStarter($5/月で30,000文字)と比べると、文字あたりの単価はFish Audioの方がかなり安い。ボイスクローンが使えてこの価格帯なら、学習コンテンツの量産にも耐えられる。
ローカル実行可能性の調査
Fish Audio S2はOSSで、HuggingFaceにモデルの重みが公開されている。ローカルで動かせるなら、APIの従量課金を気にせず大量生成できる。
調べた結果、ローカル実行は技術的には可能だが、GPUリソースとセットアップコストを考えると、API経由の方がコスパが良いという結論に至った。$10で22万文字生成できるなら、ローカル環境を構築する時間をコンテンツ制作に回した方が合理的だ。
生成スクリプトへのto_tts_text()追加
固有名詞の発音問題を仕組みで解決するため、TTS生成スクリプトに to_tts_text() 関数を追加した。
def to_tts_text(text: str) -> str:
"""カタカナをひらがなに変換してTTSの発音を安定させる"""
# カタカナ→ひらがな変換のマッピング
...
この関数はTTSエンジンに渡す直前のテキストに適用する。元の台詞データはカタカナのまま保持し、音声生成時だけひらがなに変換する。VOICEVOXでもFish Audio S2でも同じ問題が起きるため、エンジン非依存の前処理として共通化した。
ページ・データファイルの作成
Fish Audio S2用のページとデータファイルをeurekapu-nuxt4に作成した。既存のVOICEVOX用ページと同じ構成パターンを踏襲し、ボイス選択・テキスト入力・音声生成の一連の流れを画面上で操作できるようにした。
振り返り
3日間で4つのTTSエンジンを順に試し、今日ついに「自分の声で教材を読み上げる」ところまで到達した。API 402エラーでいきなり止まったとき、ブラウザのタブをWebプレイグラウンドに切り替えて30秒後にはテスト再開していた。障害に当たっても手を止めなかった一日だった。
固有名詞の発音問題は、VOICEVOX・Google Cloud TTS・ElevenLabs・Fish Audio S2のどのエンジンでも程度の差はあれ発生する。to_tts_text() のようなエンジン非依存の前処理レイヤーを持っておくと、TTSエンジンを差し替えても発音の品質が安定する。この前処理パターンは今後も使い回せる。