Open8

Kokoro TTSのメモ

Koki IbukuroKoki Ibukuro

What is Kokoro TTS

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

GitHub
https://github.com/hexgrad/kokoro

HuggingFace
https://huggingface.co/hexgrad/Kokoro-82M

HuggingFace ONNX モデル
https://huggingface.co/onnx-community/Kokoro-82M-v1.0-ONNX/tree/main/onnx

Koki IbukuroKoki Ibukuro

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のネイティブライブラリを組み込みたくはない。

Koki IbukuroKoki Ibukuro

Misakiのphonemes辞書をみると分かるように、英単語は動詞と名詞で発音が変わったりするので、Part-of-Speech POS Tagingが必要。Misaki内部では業界標準 spaCyでやっている。

C#で代替はないかと探したところ Catalyst に行き当たる。Pure C#でUnity Editorではいい感じに動作を確認。

しかし、AOTに対応してないのでiOSでエラー。修正してPRを出してみた。

https://github.com/curiosity-ai/catalyst/pull/117

NLPがpythonばっかりになるのもわかる。これは大変だ。