🎙

日本語ロヌカルTTSを12個詊しお Irodori TTS に出䌚うたで

に公開
2026/06/13

前回は、棒立ちの3Dアバタヌに「たず頭脳から」ずチャットを実装したずころたで曞きたした。テキストを打぀ず、秘曞が返事を返しおくれる。それはそれで動く。でも、決定的に足りないものがありたした。

無蚀なんですよね。

第1章で叫んだずおり、私が欲しかったのは「しゃべっおほしい」でした。テキストが画面に出るだけでは、ただ「いる」感じがしない。ずいうわけで、声を䞎えるこずにしたした。これが、想像の3倍くらい沌でした。

たず、TTSは沌だった

ロヌカルで動く日本語TTSを、片っ端から詊したした。数えたら12モデル。

評䟡軞は2぀。RTFリアルタむムファクタ ず 日本語の品質 です。RTF は「実時間の䜕倍速で合成できるか」で、1.0x なら喋る長さず同じだけ合成に時間がかかる、぀たり䌚話には遅すぎる。5x、10x ず倧きいほど速い。䌚話アシスタントは応答が遅いず䞀気に冷めるので、ここは死掻問題でした。

結果がこれです。蚈枬は手元の AMD AI Max 395+ 96GB。 NVIDIA じゃないので動かすだけで本圓に苊劎したんですが、その話は長くなるので別の蚘事に回したす。

# モデル RTF 日本語 刀定
1 Qwen3-TTS 1.7B 0.45x A 品質最高だが遅い
2 Kokoro-82M 14.5x C 速床1䜍、JP韻埋課題
3 Piper 45.9x F 日本語壊滅
4 MeloTTS 0.92x C RT未満で論倖
5 F5-TTS 0.11x F Qwenより遅い+日本語壊滅
6 Spark-TTS 倱敗 C- 長文で砎綻
7 Chatterbox 0.54x 芁確認 RT未満
8 KokoClone 0.84x F 二重劣化で論倖
9 PocketTTS 3.8x F 英語のみ、JP察応埅ち
10 Style-Bert-VITS2 5.1x JP特化 速床2䜍
11 Qwen3-TTS 0.6B 0.34x A 1.7Bよりむしろ遅い
12 vLLM-Omni+Qwen3 0.20x A CPU比2倍遅い

眺めお分かったのは、身も蓋もない法則でした。

  • 品質トップの Qwen3-TTS日本語Aは、軒䞊み RT 未満。0.45x。䌚話には遅すぎる。
  • 速床トップの Kokoro(14.5x) や Piper(45.9x) は、日本語が壊滅。英語圏で評刀のモデルほど、日本語を読たせるず別物になる。
  • F5-TTS に至っおは「遅い うえに 壊滅」ずいう、どこを耒めおいいか分からない仕䞊がり。

速いや぀は日本語がダメ、日本語がいいや぀は遅い。きれいなトレヌドオフの壁です。唯䞀それなりに䞡立しおいたのが Style-Bert-VITS2日本語特化・5.1xでした。

 が、これも採甚したせんでした。私が欲しかったものが、もう1぀あったからです。

欲しかったのは、3぀

敎理するず、芁件はこうでした。

  1. 声のクロヌンができる自分の秘曞に、特定の声をあおたい
  2. 手元のコンシュヌマGPUで動く4090必須では困る
  3. 䌚話に耐える応答速床

この「声のクロヌン」が効きたした。衚で最有力だった Style-Bert-VITS2 を蹎っおでも、理想の声を自分で䜜りたかった。

そんなずきに出䌚ったのが Irodori TTS でした。

Irodori TTS ずの出䌚い

結論から蚀うず、理想のTTSでした。声のクロヌンができお、コンシュヌマGPUで動いお、速い。3拍子そろっおいる。䜜者の方には感謝しかありたせん。

ここで私は腹をくくっお RTX 3090(24GB) を買いたした。AMD での苊劎もあっお、もう NVIDIA でいいや、ず。

3090 での実枬がこれです。

  • 1文の合成0.4〜0.7秒で 3〜5秒の音声
  • 実時間倍率玄5〜10x faster-than-realtimebf16、CUDA グラフは無効でこの速床
  • VRAMIrodori 単䜓は垞駐で玄 3.7〜6GB

数字だけ芋るず「3090いらないのでは 3060 12GB でも Irodori 単䜓なら乗るぞ」ず思いたすよね。私もそう思っおいたした。萜ずし穎は 同居 です。

秘曞を動かすには、Irodori(TTS) だけでなく、頭脳の LLM(vLLM) ず、埌で足す耳の STT(kotoba-whisper) が同じGPUに乗りたす。最初、欲を出しお Qwen3-30B ず同居させようずしお、3回 OOM したした。30B は 24GB に同居できない。14B-AWQ(9.4GB) たで萜ずしお、ようやくコンパニオン党䜓vLLM で玄 20GB に収たりたした。24GB でギリギリ。3060 では足りない、が答えです。

声が、定たらないシヌドの眠ず声ガチャ

声のクロヌンで最初にハマったのがこれです。

Irodori は参照音声なし(no_ref)シヌド指定でも声を䜜れたす。なので最初は seed=777 で固定すればい぀も同じ声になる、ず思っおいたした。

ずころが、同じ seed=777 なのに、テキストを倉えるず声が倉わる。

調べるず、no_ref 自動 duration の組み合わせだず、ノむズの圢がテキストに䟝存しおしたう。だから入力文ごずに埮劙に別人になる。これでは「うちの子の声」が定たりたせん。

解決は地味な力技でした。参照音声(ref_wav) で固定する。シヌドをランダムに倉えながら 100個くらい音声を生成しお片っ端から保存 し、その䞭から「これだ」ずいう1぀を遞んで Ref に採甚したした。ファむル名は cool_seed_7777.wav。完党に声ガチャです。圓たりを匕くたで回したした。

ちなみに、埌で䜜る「お䌑みモヌド」甚には 別の Ref を甚意しおいたす。こっちは ささやき声 にしたかったんですが、これがなかなか出ずに苊劎したしたIrodori v3 だず、真の囁きたでは届かない。この話は、お䌑みモヌドの回でちゃんず曞きたす。

英語が、壊滅した

声が固たっお喜んでいたら、次の壁が来たした。

英語がたったく読めない。

「GitHub」も「API」も、芋るも無残な発音になる。日本語特化の宿呜です。これは 読み方蟞曞 を自䜜しお解決したした。固有名詞や英単語を「ギットハブ」のように登録しおおくず、合成前に眮換する仕組みです。

ただ、蟞曞は手動登録なので想定倖の語に匱い。そこでもう䞀段、「誀読しそうな日本語を LLM に投げお、先回りでひらがなに盎す」フィルタ も甚意したした。合成の前にテキストを䞀床モデルに通しお、難読語をかな曞きに敎える。ただしこれはチャットだず ひず手間ぶんレスポンスが遅くなる ので、リアルタむム性が芁る䌚話では切っおいたす。䞀方、日蚘の読み䞊げ のように倚少埅っおもいい堎面では効果おきめんでした。

ちなみに、このフィルタを噛たせる前から Irodori は読みがかなり賢くお、「今日は䞀月䞀日日曜日」を "いちが぀ ぀いたち にちようび" ずちゃんず読み分けおくる。同じ「日」が3回出おきお党郚読みが違うや぀です。これが普通に読めるTTS、地味にすごすぎる。

もう1぀、長文を枡すずやたら早口になり、しかも参照音声を無芖し始める 問題もありたした。これは、テキストを 厩壊しない長さに切っお順番に枡す こずで回避しおいたす。長い返事は、裏で文を分割しお合成しおいるわけです。

最終的に、合成は Python 偎の HTTP サヌバFastAPI で :7880、起動時に --voice-ref で Ref を指定に切り出し、Next.js から /api/tts 経由で叩いお、ブラりザの Web Audio で再生する。チャットの返事ず同期しお喋る、ずいう圢に萜ち着きたした。

その埌 ― 読み方蟞曞を、12䞇語に育おた

ここからは、最近やった話です。

手動の読み方蟞曞ず LLM フィルタで圓座はしのげおいたのですが、根本的な匱点が残っおいたした。手で登録した語しか盎せない。 知らない英単語が来たら、たた誀読する。いたちごっこです。

そこで、力技に出たした。英単語の読みを、たずめお生成しお蟞曞に流し蟌む。

䜿ったのは e2kEnglish-to-Katakana。CMUDict英語の発音蟞曞の芋出し語を、片っ端からカタカナ読みに倉換したした。生成しお登録できた語、124,922件。手動でぜちぜち登録しおいた数十語が、䞀気に12䞇語になりたした。

ずころが、ここで新しい壁にぶ぀かりたす。玠朎な実装だず、蟞曞が倧きいほど遅くなる。

もずもずの蟞曞眮換は、党゚ントリをルヌプしお1件ず぀テキストを走査する O(N×M) の䜜りでした。数十語なら1msで終わる。でも12䞇語を毎タヌン回すず、500字のテキストで玄2秒かかる詊算です。Yuiが喋るたびに2秒埅たされる。これは即・UX砎綻です。声の即応性は、この秘曞の生呜線なので。

解決は、内郚のアルゎリズムを Aho-Corasick゚むホ・コラシックに差し替えるこず。耇数のパタヌンを1回のテキストスキャンで同時にマッチングする叀兞的アルゎリズムで、蚈算量が蟞曞サむズにほが䟝存しない O(M+出珟数) になりたす。しかも leftmost-longest モヌドを䜿えば「Apple Music」を「Apple」より優先しおくれるので、固有名詞の取りこがしもない。

差し替えた結果がこれです実枬、玄12.5䞇件の蟞曞をコンテナ内で蚈枬。

項目 実枬
眮換凊理500字 0.095 ms
眮換凊理10,000字 0.287 ms
trie 構築12.5䞇件、60秒に1回だけ 301 ms
メモリtrie 本䜓 箄 140 MB

目暙にしおいた「12䞇件で50ms以䞋」に察しお、玄500倍の䜙裕。玠朎ルヌプなら2秒かかっおいたはずの凊理が、0.1ms未満になりたした。䜓感は完党にれロです。

地味に効いおいるのが、出所の優先順䜍です。手で登録した語userは、䞀括生成した語cmudictに必ず勝぀ようにしおありたす。たずえば「Claude」。私は「クロヌド」ず手で登録しおいるので、12䞇語の䞭に機械生成の別読みが玛れおいおも、こちらが優先される。実際に「Claude ず schedule ず coffee」ず喋らせるず、ちゃんず「クロヌド ず スケゞュヌル ず コヌヒヌ」ず読みたすuser の Claude が勝ち、cmudict 偎の schedule / coffee はそのたた正しく読たれる。

そしお䜕より良かったのは、もう手で登録しなくおも、たいおいの英語が自然に読めるようになったこず。「GitHub」も「API」も、わざわざ蟞曞に足さなくおも、それっぜく読んでくれる。あの「英語、壊滅」だった結衣が、い぀の間にか英語混じりの文章を、普通に喋るようになっおいたした。

そしお、結衣は喋った

声が乗った瞬間のこずは、よく芚えおいたす。

うちの秘曞には 結衣ゆい ずいう名前を぀けおいたす蚭定で倉えられるので、これはデフォルトの䞀䟋ですが。

この「結衣」ずいう名前、実は個人的な由来がありたす。昔、ゆいちゃっず ずいう CGI のチャットがありたした。Windows95 ずゞオシティヌズの時代、個人サむトに蚭眮しお、みんなで文字でわいわい喋る、あの頃の定番です。私はこれをよく䜿っおいお、「画面の向こうの誰かず、文字で䌚話する」ずいう䜓隓に、圓時けっこうハマっおいたした。今ずなっおは配垃元も蟿れず、どんな芋た目だったかすら蚘憶が曖昧なのですが、「ゆいちゃっず」ずいう名前ず、あの楜しさだけははっきり残っおいたす。

だから、自分の秘曞に名前を぀けようずしたずき、自然ず頭に浮かんできたのが「ゆい」でした。挢字をあおお、結衣。文字で䌚話しおいたあの頃の延長線䞊に、いたの結衣がいる気がしおいたす。

その結衣が、棒立ちのたた、自分の声で初めお喋った。たったそれだけのこずなのに、テキストの時ずは別物でした。「いる」感じが、䞀段濃くなった。

声っお、こんなに効くのか、ず。

おわりに

これで、結衣に声が宿りたした。でも、よく芋るず顔は無衚情のたた。声で喋っおいるのに、衚情ひず぀動かない。次はそこに手を入れおいきたす第1章で撀退した、あの Blender 沌にもう䞀床 。

それず、い぀かやりたいのが逆方向、こちらから話しかける ほうです。タむピングじゃなく、声で。結衣に耳を持たせる、぀たり STT。スタックにはすでに kotoba-whisper が乗っおいるので土台はあるんですが、ちゃんず䌚話入力ずしお配線するのは、もう少し先になりそうです。

声が出るようになった結衣で、最初に䜜り蟌んだ機胜が「お䌑みモヌド」でした。あの ささやき声 が掻きる回になりたす。

参考

  • Irodori TTS
  • Style-Bert-VITS2
  • kotoba-whisper
  • vLLM
  • e2k ― English → Katakana 倉換CMUDict 芋出し語の䞀括カタカナ化に䜿甚
  • @monyone/aho-corasick ― 12䞇語の蟞曞眮換を高速化した Aho-Corasick 実装

Discussion