KokoroでローカルCPU上で高品質TTSを実行する
(ariya.io)- ローカル音声生成は今や専用GPUなしでも十分に実用的な品質を出せ、例の環境ではGPUをLLM推論用に残し、TTSはCPUが処理している
- Kokoroは8200万パラメータのモデルだが、英語・中国語・ヒンディー語など複数言語をサポートし、約50種類の音声を提供、特に英語に最適化されている
- 最も簡単な構成はKokoro-FastAPIコンテナを実行する方法で、音声モデルがあらかじめ含まれているためイメージサイズは約5GB
- OpenAI speech API互換のインターフェースを提供しており、既存の音声APIベースのプログラムをローカルTTSへ比較的簡単に置き換えられる
- 短い段落の合成は Intel Core i7-4770K で4.7秒、Apple M2 Pro で4.5秒、AMD Ryzen 7 8745HS で1.5秒程度で、ローカルLLMの応答を読まずに聞く使い方が可能
CPUだけで動かすKokoro TTS
- 数年前までは現実的なローカル音声生成は難しかったが、今では個人情報を外部サービスに預けずに高品質な音声を作れる
- 例では以前に扱ったローカルLLM向けGTX 1080 Tiマシンで実行している
- そのマシンの専用GPUはLLM推論用に予約されている
- 音声合成はCPUのみを使う
- 使用モデルは Kokoro
- 8200万パラメータのモデル
- 英語・中国語・ヒンディー語など複数言語で自然な音声を生成する
- 約50種類の音声を提供し、主に英語向けに最適化されている
- 最も簡単なサーバー設定は Kokoro-FastAPI コンテナイメージを使う方法
- 事前ダウンロード済みの音声モデルが含まれている
- そのためコンテナイメージのサイズは約5GB
- DockerまたはPodmanの実行コマンド:
podman run -p 8880:8880 ghcr.io/remsky/kokoro-fastapi-cpu - 起動後、Web UIは
localhost:8880/webで開け、テキストを入力して音声を生成し、自動再生できる
OpenAI互換APIと実行例
- Kokoro-FastAPIコンテナはWeb UIに加えて OpenAI speech API 互換のTTSインターフェースも提供する
- 既存のOpenAI speech API利用プログラムを簡単に合わせて使える
- JavaScriptとPythonのサンプルコードは github.com/remotebrowser/speak にある
- JavaScriptの実行例:
export TTS_API_BASE_URL=http://127.0.0.1:8880/v1 ./speak.js "Good morning! How are you today?" - Pythonの実行例:
export TTS_API_BASE_URL=http://127.0.0.1:8880/v1 ./speak.py "Good morning! How are you today?" - 生成された音声はMP3ファイルとして保存される
- SoXまたはSound eXchangeがインストールされていれば音声は自動再生される
- SoXの情報は sox.sf.net で確認できる
- 別の音声を選ぶには
TTS_VOICE環境変数を設定するexport TTS_API_BASE_URL=http://127.0.0.1:8880/v1 export TTS_VOICE="am_eric" ./speak.js "Good morning! How are you today?" - 利用可能な全音声の一覧は Kokoro VOICES.md にある
CPUごとの合成時間と代替手段
am_eric音声で短いテスト段落を合成した結果、3回実行中の最良記録ベースの生成時間は次の通り- Intel Core i7-4770K: 4.7秒
- Apple M2 Pro: 4.5秒
- AMD Ryzen 7 8745HS: 1.5秒
- リスト最初のCPUは12年前に発売されたモデルで、古いCPUでも処理できる
- OpenAI互換のコンテナ型TTSの代替として Speaches もある
- Kokoro-FastAPIと異なり、コンテナイメージには音声ウェイトが含まれず、API経由で明示的にダウンロードする必要がある
- Whisper を含む高品質なSTT機能も提供する
- アプリケーションにTTSとSTTの両方が必要なら、一か所で処理する選択肢になりうる
- ローカルLLMと組み合わせれば、LLMの回答を読む代わりに音声で聞く使い方が可能
1件のコメント
Hacker News のコメント
アクセシビリティ製品で Kokoro をかなり使ってみましたが、同程度の品質の多くの TTS が必要とする NVidia GPU がなくてもよいので作業しやすかったです。
特に IPA 発音ガイドを手動で入れられる点が気に入っています。重要な単語が同形異義語で、Kokoro が誤って発音することがあったためです。
ただし、1〜2語だけを読ませると弱くなります。たとえば「six」だけを読ませると、ほぼいつも「ah-six-ah」のように発音します。代わりに「The word is: six」のような長い文を入れると正しく読み、Kokoro API は文中の各単語のタイムスタンプを返すので、Python スクリプトで欲しい単語だけを切り出せます。イントネーションは少し平坦ですが、非常に安定しています。
Discord で聞いたところ、小さなパラメータ規模の限界だと言われました。Kokoro を擁護すると、eleven-labs の音声でもたまにこうした問題は起きます。
私の用途はほぼすべて単語単体なので、入力と出力をつなげたり分割したりする処理をわざわざ扱いたくなく、合いません。
これは実際に関心のあるテーマなので面白いです。
以前は whisperx を別途メンテしていました。単純な文字起こしだけでなく、字幕のような用途に必要なタイミングと話者識別も重要だと考えているためです。ただし pyannote に依存していて、ライセンスも曖昧なので、インストールの自動化もさらに面倒です。
そこで、より良い文字起こしを提供しつつ話者分離までサポートするものを探し、文字起こしは parakeet、話者分離は softformer に決めました。しかし、利用可能なエンジンの多くは softformer を含んでいません。
softformer をサポートする parakeet-rs 用の OpenAI 互換サーバーを作り(https://github.com/altunenes/parakeet-rs)、各種の便利機能を扱うデスクトップ文字起こしアプリ OpenWhispr と一緒に使っています。
GPU は別の作業に使っているのでまだ GPU 経路は追加しておらず、今は CPU だけで文字起こししていますが、必要なときにローカルで文字起こしを回せる点は非常に強力に感じます。
やろうとしている作業には、parakeet と一緒に Senko を使うと話者分離がとてもよく機能します。私の MacBook では Pyannote と whisper より速く、正確でした。
このモデルは本当に良いです。GPU が足りなくてローカルモデルをほとんど触れなかったのが残念でしたが、1か月ほど前に GTX1650 に Kokoro を入れて、文章読み上げ用の TTS を作りました。
簡単な WebUI に URL やコピーしたテキストの塊を貼り付けると、Python が整形して Kokoro に送り TTS を作成し、その結果を Apple Podcasts 用の RSS として提供します。朝の運転中に、ためておいた記事やブログ記事を追うのに使っています。
いつかは複数の音声を使い分けて、ためておいたニュース項目をラジオの朝番組のように聴かせる NotebookLM のようなものも作ってみたいです。
数か月前に、どんな Web ページでもこれを実行し、読み上げている文を同時にハイライトする Chrome 拡張を作りました。
コンテナを起動する手順と、Web サイトの内容をコピーして貼り付ける手順の両方を省けるので、Kokoro をもっと手軽に使いたい人には役立つかもしれません。
https://chromewebstore.google.com/detail/local-reader-ai-on-...
TTS は本当に大きく進歩していて、選択肢も豊富です。Kokoro もありますし、Pocket TTS は 100M の小さなモデルでありながら音声クローンも可能です。
Chatterbox Turbo は少し大きいものの音声の感情制御をよりよくサポートし、Fish Audio S2 はさらに大きいですが、トーンや感情を事実上制限なく、はるかに細かく制御できます。これらはすべて MacBook で簡単に動きます。
TTS モデル比較を始めるのによいリポジトリは https://github.com/5uck1ess/tts-bench です。
Kokoro は 1.5 年前に公開されたモデルであることを考えると本当に良いモデルで、サイズの割に性能が優れています: https://5uck1ess.github.io/tts-bench/scores.html
以前ローカル TTS で Piper を使ってみましたが、Kokoro も興味深そうです。
とても素晴らしいです。Linux を使っているので Aqua や Whipsrflow などを使えず、1月から自作の解決策を使っています。
最近整理して、インストールしやすくしました。興味があればここで見られます: https://github.com/Hugo0/voiceio
時間が経つにつれて自分で改善され、ローカルマシン上で動き、全体として使えるソフトウェアです。最近の私の PC とのやり取りの 60% は純粋な音声入力です。
Kokoro が本当に好きです。オーディオブックのない電子書籍を読ませるのに使っていて、その用途ではかなりうまく動きます。
epub/html を読み、モデルを実行してから mp3 を書き出す Python スクリプトを作ってあります。
Kokoro がサポートする言語数は限られているので、オランダ語対応には別のモデルを使う必要がありましたが、品質はそこまで良くありません。たいていずっと遅く、さらに大きいので 8GB VRAM には大きすぎます。
最終的には Windows 内蔵 TTS まで試しました。自然には聞こえませんが、少なくともほとんどの単語を発音でき、非常に高速です。
1日 AI をいじりながら Kokoro から高コストな層を取り除いてみたところ、スマートフォン CPU と MNN で 3倍速く動きます。
品質は非常に似ています。環境によって変わるかもしれませんが、スクリプトはこちらにあります: https://github.com/DavidVentura/translator-rs/blob/master/sc...