Closed8

軽量なTTSモデル「Kokoro TTS」を試す

kun432kun432

HugggingFace

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

Kokoroは、8200万パラメータのオープンウェイトTTSモデルです。軽量なアーキテクチャにもかかわらず、より大規模なモデルと同等の品質を提供しながら、より高速でコスト効率に優れています。Apacheライセンスのウェイトを使用することで、Kokoroは本番環境から個人プロジェクトまで、あらゆる場所で展開することができます。

リリース

モデル 公開 トレーニングデータ 言語と音声 SHA256
v0.19 2024/12/25 100時間以下 1言語 ・10音声 3b0c392f
v1.0 2025/01/27 数百時間 8言語・54音声 496dba11

v1.0が出て日本語にも対応。利用可能な言語・音声についてはこちら。

https://huggingface.co/hexgrad/Kokoro-82M/blob/main/VOICES.md

GitHubレポジトリ

https://github.com/hexgrad/kokoro

kun432kun432

インストール

Colaboratory T4で。

パッケージインストール。misakiはKokoroモデル向けに用意されたg2pエンジン。使いたい言語をextrasで指定しておく必要がある。

!pip install "kokoro>=0.3.4" soundfile misaki[en,ja]
!pip freeze | egrep -i "kokoro|misaki"
出力
kokoro==0.7.16
misaki==0.7.16

音素取得のためのeSpeak NGをインストール。英語の音素辞書に載ってない場合のフォールバック、またいくつかの非英語では使うみたい。多分、日本語の場合はいらないような気もする。

!apt install -y espeak-ng

ではTTS。

from kokoro import KPipeline
from IPython.display import display, Audio
import soundfile as sf

# パイプラインを作成
pipeline = KPipeline(
    # lang_code: 言語を指定
    # - 🇪🇸 'e' => スペイン語(es)
    # - 🇫🇷 'f' => フランス語(fr-fr)
    # - 🇮🇳 'h' => ヒンズー語(hi)
    # - 🇮🇹 'i' => イタリア語(it)
    # - 🇧🇷 'p' => ポルトガル語(ブラジル)(pt-br)
    # - 🇺🇸 'a' => 英語(アメリカ)
    # - 🇬🇧 'b' => 英語(イギリス)
    # - 🇯🇵 'j' => 日本語: `pip install misaki[ja]` が必要
    # - 🇨🇳 'z' => 中国語(北京語): `pip install misaki[zh]` が必要
    lang_code='j'
)

# パイプラインにテキストを与えて実行
generator = pipeline(
    # TTS対象のテキスト
    "おはようございます。今日はいいお天気ですね。こんな日は競馬に行きたくなりますね。",
    # 音声を指定。日本語の場合は以下の
    # - jf_alpha(女性)
    # - jf_gongitsune(女性)
    # - jf_nezumi(女性)
    # - jf_tebukuro(女性)
    # - jm_kumo(男性)
    voice='jf_alpha',
    # 発話速度
    speed=1,
    # 発話生成を分割する正規表現。この単位で生成するファイルも
    # 分割される。文末等であれば `split_pattern=r'(?<=[。!?])'`とか
    split_pattern=None        
)
for i, (gs, ps, audio) in enumerate(generator):
    print(i)  # i => インデックス
    print(gs) # gs => 書記素/テキスト
    print(ps) # ps => 音素

    display(Audio(data=audio, rate=24000, autoplay=False))
    sf.write(f'{i}.wav', audio, 24000)
出力
0
おはようございます。今日はいいお天気ですね。こんな日は競馬に行きたくなりますね。
ohajoː ɡoʣaimasɨ. kʲoː βa iː o teŋkʲi desɨ ne. konna çi βa keːba ɲi ikʲi takɯ naɾʲimasɨ ne.

実際に再生したもの。各日本語音声で試してみた。

https://audio.com/kun432/audio/jf-alpha

https://audio.com/kun432/audio/jf-gongitsune

https://audio.com/kun432/audio/jf-nezumi

https://audio.com/kun432/audio/jf-tebukuro

https://audio.com/kun432/audio/jm-kumo

ちなみに別言語の音声も使える様子。

from kokoro import KPipeline
from IPython.display import display, Audio
import soundfile as sf

# パイプラインを作成
pipeline = KPipeline(
    lang_code='j'
)

# パイプラインにテキストを与えて実行
generator = pipeline(
    "おはようございます。今日はいいお天気ですね。こんな日は競馬に行きたくなりますね。",
    # 英語で最も評価が高いモデルを使用
    voice='af_heart',
    speed=1,
    split_pattern=None        
)
for i, (gs, ps, audio) in enumerate(generator):
    print(i)
    print(gs)
    print(ps)

    display(Audio(data=audio, rate=24000, autoplay=False))
    sf.write(f'{i}.wav', audio, 24000)

https://audio.com/kun432/audio/af-heart-ja

外国人の日本語っぽくはなるけども、日本語モデルよりもいいように個人的には感じる。

英語テキストの場合

from kokoro import KPipeline
from IPython.display import display, Audio
import soundfile as sf

pipeline = KPipeline(
    lang_code='a'
)

generator = pipeline(
    "Good morning. It's a beautiful day today. On days like this, I feel like going to the horse races.",
    voice='af_heart',
    speed=1,
    split_pattern=None        
)
for i, (gs, ps, audio) in enumerate(generator):
    print(i)
    print(gs)
    print(ps)

    display(Audio(data=audio, rate=24000, autoplay=False))
    sf.write(f'{i}.wav', audio, 24000)
出力
0
Good morning. It's a beautiful day today. On days like this, I feel like going to the horse races.
ɡˈʊd mˈɔɹnɪŋ. ˌɪts ɐ bjˈuTəfəl dˈA tədˈA. ˌɔn dˈAz lˈIk ðˈɪs, ˌI fˈil lˈIk ɡˈOɪŋ tə ðə hˈɔɹs ɹˈAsᵻz.

https://audio.com/kun432/audio/af-heart-en

当然ながら英語だときれい。

モデルごとの学習用音声の総時間やグレードを見る限り、やはり学習データが品質につながっているように思える。

kun432kun432

まとめ

軽量だけあってたしかに速い。ONNXならエッジデバイスでも動かせないかなーという期待がある。

kun432kun432

こういうのがある

https://github.com/remsky/Kokoro-FastAPI

Kokoro-FastAPI

Kokoro-82M テキスト音声合成モデル用の Docker 化された FastAPI ラッパー

  • 多言語サポート(英語、日本語、韓国語、中国語、ベトナム語はまもなく対応予定
  • OpenAI 互換の音声エンドポイント、NVIDIA GPU による高速化または PyTorch による CPU 推論
  • ONNX サポートはまもなく対応予定、暫定的なレガシー ONNX サポートについては v0.1.5 以前を参照
  • システム統計を監視するためのデバッグエンドポイント、ローカルホスト:8880/web上の統合ウェブUI
  • 音素に基づく音声生成、音素生成
  • 単語ごとのタイムスタンプ付きキャプション生成
  • 重み付けされた組み合わせによる音声ミキシング

docker composeで試してみた。環境は以下。

  • Ubuntu-22.04
  • RTX4090

レポジトリクローン

git clone https://github.com/remsky/Kokoro-FastAPI.git && cd Kokoro-FastAPI

今回はGPUを有効にして試してみる。

cd docker/gpu

ビルドして起動

docker compose up --build
出力
Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error running hook #0: error running hook: exit status 1, stdout: , stderr: Auto-detected mode as 'legacy'
nvidia-container-cli: requirement error: unsatisfied condition: cuda>=12.8, please update your driver to a newer version, or use an earlier cuda container: unknown

結構新し目のバージョンが必要になるのね。。。。また今度。


2025/05/25追記

以下の点を修正すればいけた

  • Dockerfileでベースとなっているイメージを自分のCUDAバージョンに合わせた。元はUbuntu-24.04+CUDA-12.8だったが、CUDA-12.4.1のイメージでUbuntu-22.04はなかった。
Dockerfile
FROM --platform=$BUILDPLATFORM nvidia/cuda:12.4.1-cudnn-runtime-ubuntu22.04
(snip)
  • docker compose 起動時にモデルをダウンロードするが、コンテナ内部ではUID/GIDが1001固定になっていて、ホスト側と合致しない場合にパーミッションエラーが出る。あらかじめパーミッションを設定しておけば良い
sudo chown -R 1001:1001 ../../api

起動するとこんな感じ。

とりあえず生成がめちゃくちゃ速い。

出力
kokoro-tts-1  | 08:25:42 AM | DEBUG    | paths:153 | Scanning for voices in path: /app/api/src/voices/v1_0
kokoro-tts-1  | INFO:     172.18.0.1:59430 - "POST /v1/audio/speech HTTP/1.1" 200 OK
kokoro-tts-1  | 08:25:42 AM | DEBUG    | paths:153 | Scanning for voices in path: /app/api/src/voices/v1_0
kokoro-tts-1  | 08:25:42 AM | DEBUG    | paths:131 | Searching for voice in path: /app/api/src/voices/v1_0
kokoro-tts-1  | 08:25:42 AM | DEBUG    | tts_service:200 | Using single voice path: /app/api/src/voices/v1_0/af_heart.pt
kokoro-tts-1  | 08:25:42 AM | DEBUG    | tts_service:275 | Using voice path: /app/api/src/voices/v1_0/af_heart.pt
kokoro-tts-1  | 08:25:42 AM | INFO     | tts_service:279 | Using lang_code 'a' for voice 'af_heart' in audio stream
kokoro-tts-1  | 08:25:42 AM | INFO     | text_processor:135 | Starting smart split for 98 chars
kokoro-tts-1  | a
kokoro-tts-1  | 08:25:42 AM | DEBUG    | text_processor:53 | Total processing took 0.49ms for chunk: 'Good morning.'
kokoro-tts-1  | 08:25:42 AM | DEBUG    | text_processor:53 | Total processing took 0.42ms for chunk: 'It's a beautiful day today.'
kokoro-tts-1  | 08:25:42 AM | DEBUG    | text_processor:53 | Total processing took 0.58ms for chunk: 'On days like this, I feel like going to the horse ...'
kokoro-tts-1  | 08:25:42 AM | INFO     | text_processor:268 | Yielding final chunk 1: 'Good morning. It's a beautiful day today. On days ...' (108 tokens)
kokoro-tts-1  | 08:25:42 AM | DEBUG    | kokoro_v1:261 | Generating audio for text with lang_code 'a': 'Good morning. It's a beautiful day today. On days like this, I feel like going to the horse races.'
kokoro-tts-1  | 08:25:42 AM | DEBUG    | kokoro_v1:268 | Got audio chunk with shape: torch.Size([147000])
kokoro-tts-1  | 08:25:42 AM | INFO     | text_processor:274 | Split completed in 93.25ms, produced 1 chunks
このスクラップは2025/02/17にクローズされました