F5-TTSは日本語で使えるか|漢字が中国語読みになる仕組みと、有志の日本語チェックポイントで何が変わるか

F5-TTS 日本語に関する記事のアイキャッチ画像 - F5-TTSは日本語で使えるか|漢字が中国語読みになる仕組みと、日本語版で何が変わるか AIモデル

この記事の要点

  • 既定の重みに日本語の文を渡すと、漢字が中国語の読みに置き換わったまま音声になり、出力の言語は中国語と判定された。
  • 公式の一覧にある日本語向けのチェックポイントは第三者が作ったもので、一覧が指定する設定なら文字起こしで日本語と判定された。仮名にあたる文字列は多くが残った一方、漢字にあたる部分は別の文字列になり、読ませた文へ戻すには文字数の半分を超える書き換えが要った。聴いても日本語としては成立していなかった。
  • 重みのライセンスは非商用で、コードのライセンスとは別。日本語向けのチェックポイントは配布元が別で、ライセンスの表記も割れている。

日本語を読ませるとどうなるか

F5-TTS に日本語の文をそのまま渡すと、既定の重みでは漢字が中国語の読みに置き換わった状態でモデルへ届く。生成された音声を自動の文字起こしにかけると、言語は中国語と判定された。公式リポジトリに置かれた派生モデル一覧(有志の学習・微調整の結果をまとめたもの)には、日本語向けのチェックポイントが載っている。そこへ一覧が指定する設定で同じ文を読ませると、今度は文字起こしで日本語と判定され、仮名にあたる文字列は多くが残る一方、漢字にあたる部分は別の文字列になる。当サイトで確認できる範囲でも、日本語っぽいが日本語ではない、という判定になった。

既定の重みの出力と、対照に置いた Windows 同梱の Microsoft Haruka Desktop の出力を、同じ設定の文字起こしへ通した。

音源 言語判定 文字誤り率
既定のモデル 英語162字(対照) 英語(確率1.00) 0.000
Haruka 日本語30字(対照) 日本語(確率1.00) 0.000
Haruka 日本語86字(対照) 日本語(確率1.00) 0.013
既定のモデル 日本語30字 中国語(確率0.82) 0.750
既定のモデル 日本語86字 中国語(確率0.97) 0.950
既定のモデル 日本語185字 中国語(確率0.95〜0.99) 0.971

生成した音声は faster-whisper large-v3(compute_type float16・beam_size 5)へ通している。言語判定は言語を指定しないで走らせた値、文字誤り率は言語を指定して走らせた値で、それぞれ別の実行から取っている。この値は自動の文字起こしがどこまで戻せたかであって、人が聞いたときの品質ではない。元になかった文字が足されたぶんも誤りに数えるため、値は1を超えることがある。Haruka は方式の違う音声合成なので、対照に使っているのは言語判定と文字誤り率だけで、音質の比較には使えない。

生成した音声と、参照に使った音声を、日本語話者1名が聴いて判定した結果も並べておく。

音源 聴取による判定
参照音声に使ったクリップ(Haruka・別の文) 日本語として聞き取れた
Haruka が同じ文を読んだもの(対照) 日本語として聞き取れた
既定の重み + 英語の参照音声 中国語のように聞こえた
日本語向けのチェックポイント 日本語30字(一覧が指定する設定) 日本語っぽいが日本語ではない
日本語向けのチェックポイント 日本語86字(一覧が指定する設定) 日本語っぽいが日本語ではない
日本語向けのチェックポイント 日本語185字(一覧が指定する設定) 日本語っぽいが日本語ではない

聴取で判定したのは日本語として成立しているかの1点だけで、音質・自然さ・声の再現度は判定していない。聴いたのは既定の重みの1条件と日本語向けの3条件で、参照音声や生成ステップ数を変えた場合は聴いていない。日本語向けのチェックポイントは、一覧が指定する設定で生成した音声を聴いている。既定の重みの出力は、機械の判定でも日本語とは判定されず、人の耳でも日本語として聞き取れなかった。音声の生成そのものは成功しており、入力と違ってしまうのは読みである。

漢字は中国語の読みへ渡される

F5-TTS は、入力した文を分かち書きし、断片ごとに中国語のピンインへ変換する処理を挟んでいる。分岐を決めているのは断片のバイト長で、断片がすべて3バイトの文字で構成される場合、その断片まるごと lazy_pinyin にかけられる。日本語の文のうち、漢字と仮名だけでできた断片がこの経路に入る。

elif polyphone and seg_byte_len == 3 * len(seg): # if pure east asian characters

すべて3バイト文字でできた断片が入るこの分岐では、U+3100 から U+9FFF の判定は変換の有無ではなく、変換後に区切りの空白を入れるかどうかに使われる。文字が混在する断片を処理する別の分岐では、この範囲判定が文字ごとの変換の有無そのものを決めている。

f5-tts 1.1.22 の convert_char_to_pinyin へ実際に日本語の文を渡すと、漢字はピンインに置き換わり、仮名はそのまま残る。ピンインは TONE3 形式で、末尾の数字が声調を表す。

入力した日本語 変換後にモデルへ渡るもの
参照音声を数秒与えるだけで can1 | zhao4 | yin1 | sheng1 | を | shu4 | miao3 | yu3 | え | る | だ | け | で
学習をやり直す必要はなく xue2 | xi2 | を | や | り | zhi2 | す | bi4 | yao4 | は | な | く
手元のGPUだけで完結します shou3 | yuan2 | の | G | P | U | だ | け | で | wan2 | jie2 | し | ま | す

区切りは読みやすさのため縦棒に置き換えてある。これは変換関数の出力であって、そこからモデルが実際にどう発音するかは別に測っている。「参照」は can1 zhao4、「学習」は xue2 xi2、「完結」は wan2 jie2 として渡る。モデルが文字列を受け取る時点で、漢字の並びは中国語の読みを表す記号の列に変わっている。

仮名は残るが、既定の語彙に全部は入っていない

f5-tts に同梱されている既定の語彙ファイル(infer/examples/vocab.txt)は2,545トークンある。仮名も並んでいるが、全部ではない。Unicode のひらがな(U+3041 から U+3096 の86文字)と突き合わせると27文字、カタカナ(U+30A1 から U+30F6 の86文字)と突き合わせると19文字が含まれていなかった。

欠けている側には「い」「て」「ふ」「ほ」のように、日本語の文で頻繁に出る文字が混じる。

語彙に無い文字が推論時にどう扱われるかまでは追っていないため、この欠落が出力へどこまで響くかは測れていない。数えた範囲で言えるのは、既定の語彙に仮名が部分的に並んでいて、欠けが高頻度の文字にも及んでいるところまでである。

参照音声を中国語に替えても、既定の重みでは戻らなかった

同じ日本語の文を、参照音声だけ英語から中国語へ替えて生成した。どちらも F5-TTS に同梱されている公式サンプルである。ここで読めるのは言語判定の列で、文字誤り率は英語参照が3走行、中国語参照が1走行と回数が揃っておらず、走行ごとの振れも測っていないため、値の上下そのものは読めない。

参照音声 日本語30字の文字誤り率 日本語86字の文字誤り率 言語判定
英語(basic_ref_en.wav) 0.750 0.950 中国語
中国語(basic_ref_zh.wav) 0.857 1.025 中国語

参照音声を公式の英語サンプルから公式の中国語サンプルへ替えても、言語判定は中国語のまま動かなかった。ただしこの2本は言語だけでなく話者も内容も長さも参照テキストも違うので、参照音声の言語がどれだけ効いたかは切り分けられない。日本語の参照音声を既定の重みへ与えた条件も測っていないので、その条件まで結論を広げることはできない。前処理・語彙・重みのどれがどう働いているかも、この比較では分けられない。

既定のモデルが学習したのは英語と中国語

モデルカードからリンクされている論文には、学習データについて次の記述がある。

After simply filtering out transcription failure and misclassified language speech, we retain approximately 95K hours of English and Chinese data.

この記述が述べているのは、論文で扱っている学習に英語と中国語の約95K時間を使ったという点である。公式の派生モデル一覧も、既定の重みの学習データを同じ Emilia の EN/ZH と記載している。確かめたのはそこまでで、配布されている重みが論文のどの版に対応するかまでは同定していない。

Emilia データセット自体は英語・中国語・ドイツ語・フランス語・日本語・韓国語を含んでいる。データセットに収録されていることと、配布されている重みの学習にそれが使われたかどうかは、別の話になる。

なお、既定の重みは f5-tts のパッケージに同梱されておらず、初回の実行時に api.py が指す配布元(hf://SWivid/F5-TTS/F5TTS_v1_Base/model_1250000.safetensors)から取得される。同梱されているのは語彙ファイルと参照音声のサンプルである。

公式の一覧には日本語向けのチェックポイントがある

README から案内されている言語別の派生モデル一覧(src/f5_tts/infer/SHARED.md)には、日本語の項が置かれている。見出しはこの形になっている。

F5-TTS Base @ ja @ Jmica

同じ項に、Jmica によるチェックポイントと専用の語彙ファイルのパスが載っている。ここで使ったのは JA_21999120 配下の model_21999120.pt と vocab_japanese.txt で、既定の重みのほうは F5TTS_v1_Base の model_1250000.safetensors である。この一覧は公式リポジトリ側が第三者の成果をまとめたもので、まとめた側が品質を保証しているという意味ではない。

同じ項は、推論時のアーキテクチャ設定も明記している。

Config: {“dim”: 1024, “depth”: 22, “heads”: 16, “ff_mult”: 2, “text_dim”: 512, “text_mask_padding”: False, “conv_layers”: 4, “pe_attn_head”: 1}

これは同梱の F5TTS_Base にあたる設定で、既定の F5TTS_v1_Base とは text_mask_padding と pe_attn_head の2か所が違う(既定は text_mask_padding が True、pe_attn_head は指定なし)。見出し自体も「F5-TTS Base @ ja @ Jmica」で、既定の v1 Base ではない。

付属する語彙ファイル(vocab_japanese.txt)を既定の語彙と同じ方法で数えると2,976トークンあり、欠けているひらがなは「ゔ」「ゕ」「ゖ」の3文字、カタカナは0文字だった。既定の語彙にあった仮名の欠けはほぼ埋まっているが、完全に埋まっているわけではない。

語彙ファイル 行数 含まれていないひらがな 含まれていないカタカナ
同梱の既定(vocab.txt) 2,545 27文字 19文字
日本語向け(vocab_japanese.txt) 2,976 3文字 0文字

ここでやったのは、2つの語彙ファイルを Unicode のひらがな86文字・カタカナ86文字と突き合わせて、含まれているかどうかを数えることである。それらの文字が実際にどう読まれるかは、また別の問題である。

チェックポイント側の文字の埋め込み表を読むと、既定は語彙2,545に対して2,546行、日本語向けは語彙2,976に対して2,977行だった。実装が0番を埋め草のトークンに使うため(dit.py の nn.Embedding(text_num_embeds + 1, text_dim))、埋め込み表は語彙のトークン数より1行多くなるのが規則である。この計数で分かるのは、語彙のトークン数とチェックポイントが想定するトークン数が食い違っておらず、この組み合わせならそのまま読み込める、というところまでである。語彙の中身が学習時のものと同じかどうかも、出力の品質も、ここからは分からない。

日本語向けのチェックポイントは、2026年9月22日時点で1年以上更新されていない。

有志の日本語チェックポイントに、一覧の指定どおり読ませる

一覧が指定するアーキテクチャ設定を書いているのは、チェックポイントの配布元のページではなく、公式の派生モデル一覧(SHARED.md)である。そこで指定されているのは F5TTS_Base 系の設定で、f5-tts の既定である F5TTS_v1_Base とは text_mask_padding と pe_attn_head の2か所が違う。f5-tts では設定をモデル名で選ぶので、切り替えるには重みと語彙を指定したうえでモデル名に F5TTS_Base を渡すことになる。

この2か所は重みを持たない設定なので、取り違えてもモデルの読み込みは成功し、警告もエラーも出ない。modules.py は pe_attn_head に数字が入っていれば回転位置埋め込みを先頭のその本数だけに当て、指定なしなら全部のヘッドに当てる。

if self.pe_attn_head is not None:

一覧が指定しているのは先頭1本に当てる設定で、全部に当てる既定のまま走らせると出力が崩れた。f5-tts 1.1.22 で、この2通りの設定の両方を実際に走らせ、同じ文を同じ文字起こしへ通した。

推論時の設定 読み込み 言語判定 文字起こしの結果
一覧が指定する設定(F5TTS_Base 系) 成功 日本語(確率1.00) 日本語として文字起こしできた(文字誤り率0.607)
既定の設定(F5TTS_v1_Base) 成功 判定できず 入力と無関係な定型句を返した

どちらもモデルの読み込みは成功し、警告もエラーも出ていない。これは30字の1条件で、2か所の設定をまとめて入れ替えた対比なので、どちらの設定がどれだけ効いたかは分けられない。設定を取り違えたときの出力について、faster-whisper large-v3(language=”ja” / beam_size 5)が返す avg_logprob(生成したトークンの対数確率の平均)は -0.866 で、既知の正常な日本語音声が -0.046、既定のモデルの日本語出力が -0.319 だった。繰り返しの抑制や無音の検出を足しても、設定違いの出力は変わらなかった。この値が低いのは、この条件で文字起こしが自分の出した文字列へ低い確率しか与えなかったということで、正解である確率でも音声の品質の尺度でもない。

一覧が指定する設定で走らせ直すと、同じ文字起こしで日本語として書き起こせた。30字・86字・185字の3条件とも日本語(確率1.00)と判定され、文字誤り率は0.523〜0.607の範囲に収まっている。

読ませた文 言語判定 文字誤り率 文字起こしの結果
日本語30字 日本語(確率1.00) 0.607 ひょうねじゅうびがえるだけで、りゅうおいしいってぬみそげられます。
日本語86字 日本語(確率1.00) 0.550 きょうりょうりだえるだけで、いいしゅうってぬみうげられます。(以下略)
日本語185字 日本語(確率1.00) 0.523 にひょうぎょりだえるだけで、いっしゅってぬぬみやられます。(以下略)

参照音声はこちらで合成した日本語の1文を使っている。文字誤り率は文字起こしがどこまで戻せたかであって、人が聞いたときの品質ではない。3条件とも同じ1本の参照音声で、参照音声や生成ステップ数を変えた場合は測っていない。読ませた文へ戻すには文字数の半分を超える書き換えが要る。読み上げられているのは、読ませた文そのものではない。

言語判定が日本語(確率1.00)というのは、faster-whisper がこの音声を日本語として分類したという意味に限る。人が日本語として聞き取れることや、読ませた文がそのまま読み上げられていることを示すものではない。文字誤り率が0.5を超えたのは、読ませた文へ戻すのに、その文字数の半分を超える字の入れ替え・追加・削除が要るということである。聴取による判定は「日本語っぽいニュアンスだが日本語ではない」だった。この聴取結果は、機械では日本語に分類された一方、読ませた文は十分に戻らなかったという結果とも整合する。どちらか一方だけを見ていたら、結論を誤っていた。

走行数は条件でそろっていない。30字は3走行で、文字起こしは3回とも一字一句同じだった。86字と185字は1走行ずつである。回数がそろっていないので、条件どうしの数値の差そのものは読まない。

生成側で指定したのは、生成ステップ数32と乱数の種20260922で、それ以外の生成の設定はライブラリの既定のままである。F5-TTS は種を指定しないと走行ごとに種を選ぶので、再現するときはこの種の値を合わせることになる。文字起こしは faster-whisper の large-v3 を GPU 上で動かし、compute_type は float16、beam_size は 5 にした。文字誤り率は編集距離を文字数で割った自前の計算で、比べる前に Unicode の NFKC 正規化をかけ、句読点と空白を落としている。正規化のしかたで値は動くので、他所の数値とそのまま比べられる指標ではない。

文字起こしの中身を見ると、「〜だけで」「〜られます」のような仮名の部分は残り、漢字にあたる部分が別の文字列に置き換わっている。ただし戻らない仮名もあり、30字の条件では助詞の「を」が2か所とも落ちていた。推論のコードは convert_char_to_pinyin を条件なしに呼んでおり(utils_infer.py の final_text_list = convert_char_to_pinyin(text_list))、チェックポイントを日本語向けに替えてもこの変換は実行される。実際に日本語向けのチェックポイントへ渡る入力を書き出してみると、「今日はよく晴れていて」は jin1 ri4 は よ く qing2 れ て い て になっていた。モデルへ渡る並びを決めているのはこの前処理で、その並びをどう音にするかを決めるのは重みである。文字起こしの結果にも、変換で残った仮名はそのまま現れ、ピンインに置き換わった漢字は別の文字列になっていた。

重みのライセンスは非商用

README は、コードと事前学習済みモデルでライセンスを分けている。

Our code is released under MIT License. The pre-trained models are licensed under the CC-BY-NC license due to the training data Emilia, which is an in-the-wild dataset.

README はライセンス名を CC-BY-NC と書くだけで、版を特定していない。版を4.0と特定しているのは開発元の Hugging Face モデルカードのライセンス欄で、そこには cc-by-nc-4.0 と記載されている。

日本語向けのチェックポイントは配布元が別で、しかも、その配布元のモデルカードの中で表記が割れている。2026年9月22日時点で、配布元のモデルカードのライセンス欄は継承条件の付く cc-by-nc-sa-4.0 だが、同じカードの本文と公式の派生モデル一覧の表は cc-by-nc-4.0 と書いている。どちらの条件で配布されているかは、使う前に配布元のページで確認することになる。

CC BY-NC 4.0 の条文は非商用を、主として商業上の優位性や金銭的報酬に向けられていないこと、と定義している。個々の用途が該当するかは、この定義に照らして判断することになる。なお非商用以外にも、共有するときの表示やライセンスへのリンクといった条件が付く。日本語向けのチェックポイントは同じページの中で2つの表記が競合しているので、ページを見るだけでは決まらない。再配布や改変物の公開を含む使い方をするなら配布者へ確認し、それまでは継承条件が付く側も有りうる前提で考えることになる。

導入そのものについて一点だけ補足すると、README は言語によらない一般の導入手順としてFFmpeg を入れるよう案内しており、その手段として conda install ffmpeg を示している。日本語向けのチェックポイントを使う場合も、音声を読み込む経路は同じである。

日本語の音声合成に何を使うか

2つの重みは、行き止まる場所が違う。既定の重みは、漢字が中国語の読みへ変換されたまま音声になり、出力の言語が中国語と判定される。日本語向けのチェックポイントは、一覧が指定する設定で走らせれば文字起こしで日本語と判定され、仮名にあたる文字列は多くが残る。ただし漢字にあたる部分は別の文字列になり、文字誤り率は3条件とも0.5を超えた。どちらの結果も、漢字をピンインへ変換する同じ前処理を通ったうえでの出力である。ただし日本語向けのチェックポイントの3条件は参照音声も日本語のものに替えてあり、既定の重みへ日本語の参照音声を与えた条件は測っていない。日本語向けのほうは日本語話者1名が聴いており、3本とも日本語っぽいが日本語ではないという判定だった。

他の音声合成モデルとの優劣は測っていないため、ここから名指しで別のモデルを勧めることはしない。ローカルで動かせるモデルがそれぞれ日本語をどう扱い、ライセンスがどうなっているかはオープンTTSモデルの比較に一覧でまとめてある。日本語の音声を業務の窓口で使う場合は、モデル単体ではなく音声AIエージェントの比較のほうが近い。

別のモデルを候補に入れるかどうかは、次の順で見ると早い。上の2つは配布元のページを開くだけで確かめられ、下の3つは配布されているコードと語彙ファイル、学習データの記載を読むことになる。

  1. 配布元が日本語を対応言語として明記しているか、日本語のデモ音声があるか
  2. 配布元が推論時の設定を指定していないか、指定があるとして自分が動かす設定と合っているか
  3. 前処理で言語の変換が起きるか
  4. 語彙に仮名が揃っているか
  5. 配布されている重みの学習に何のデータが使われたか

この並びは候補をふるい分けるための順番で、上から順に見ていけば、生成を回す前に落とせるものが落ちる。

確かめた条件と、確かめていないこと

判定に使ったのは faster-whisper の large-v3(compute_type float16・beam_size 5)である。言語判定は言語を指定しないで走らせた値、文字誤り率は言語を指定して走らせた値で、それぞれ別の実行から取っている。対照には Windows 同梱の Microsoft Haruka Desktop で同じ文を読ませたものを使った。文字起こしの道具そのものの選択肢はAI文字起こしツールの比較にまとめてある。

本記事の確認は2026年9月22日時点の f5-tts 1.1.22 と、その時点で配布されているチェックポイントに基づく。

確かめていないのは次の範囲になる。

  • 音質・自然さ・声の再現度は判定していない。見ているのは、自動の文字起こしが入力の文をどこまで戻せたかと、聴いて日本語として成立しているかの2つである。
  • 参照音声や生成ステップ数を変えた場合は測っていない。日本語向けのチェックポイントは3条件とも1本の参照音声で読ませており、配布元が想定した使い方を尽くしたとは言えない。
  • 聴取は、既定の重みの1条件と日本語向けの3条件を日本語話者1名が聴いた結果で、判定したのは日本語として成立しているかの1点だけである。
  • 必要なGPUメモリと生成にかかる時間は、本記事では測っていない。

ハードウェア側の実測は、姉妹サイトのAIハードウェア図鑑で扱っている。

参考資料

タイトルとURLをコピーしました