Kokoro TTSのメモ

What is Kokoro TTS
82MのパラメータだけでText to Speech ができるモデル。基本モデルのサイズが327MB. Quantized モデルなら86MBのファイルサイズ。声の変更もモデルを入れ替える必要がなく、基本モデルに 500kb程度の styleを適用するだけで動作するという。軽量のTTSの中ではクオリティが高いので、Unity Multi-platformに移植できるかという観点で調査してみた。
Links
GitHub
HuggingFace
HuggingFace ONNX モデル

Preprocessing
Kokoroには公式でpython実装とJavaScript実装があり、両方を参考にしながらどうやって動かすのか調べていく。言語処理に全く詳しくないので、概念だけの理解メモ
入力でPreprocessing で必要なものは、
- G2P graphemes (spelling) to phonemes (pronunciation) → phonemes tokens
- voice style (tokenの長さに応じてマスクする)
ONNXモデルからの出力は
- 24kHzの生音声
phonemesさえ導いてしまえば動く。phonemes → tokanize処理は、kokoro.js実装ではHuggingFaceのAutoTokeninzerを使っているものの、自前でもシンプルなマッピングにできそうなので、Transformerライブラリをのぞけるのはありがたい。
一方G2P、Graphemes to Phenemes、つまりスペルから、発音記号を取り出す処理は結構難しい。
kokoro 本家では、Misakiという専用ライブラリを用意している。pyproject.tomlを見ると分かるように、結構依存ライブラリがある。Misakiの辞書に含まれてない単語については、eSpeak NGへフォールバックする仕組みになっていそう。
一方kokoro.js側は、phonemizer というライブラリに依存している。eSpeak NGというGPLライセンスのライブラリのphonemize部分をweb assembly化したもののよう。eSpeakNG自体がmacOSで動いて、phonemesが取得できることろまでは確認したもののできればGPLのネイティブライブラリを組み込みたくはない。

Misakiの最新のPRで辞書が存在しない単語についてもBertベースの3MB程度の軽量モデルで発音を推定するフォールバックが入り、eSpeak依存から脱却できる可能性が出てきた。

音声スタイルは複数のスタイルを合成も出きるっぽい。

動き始めた!G2Pの実装がまだ適当…。

Misakiのphonemes辞書をみると分かるように、英単語は動詞と名詞で発音が変わったりするので、Part-of-Speech POS Tagingが必要。Misaki内部では業界標準 spaCyでやっている。
C#で代替はないかと探したところ Catalyst に行き当たる。Pure C#でUnity Editorではいい感じに動作を確認。
しかし、AOTに対応してないのでiOSでエラー。修正してPRを出してみた。
NLPがpythonばっかりになるのもわかる。これは大変だ。

iOSでも動作確認。

Fine-tuning
英語以外の音声のクオリティはまだ低く。Fine-tuningが必要になってくるが、StyleTTS2を元にしているらしいという以外の情報は無い。