【完全ローカル】超軽量・高品質音声合成AI「Kokoro-82M」をPythonで動かす!API不要のテキスト読み上げ(TTS)実装ガイド

近年、大規模言語モデル(LLM)のローカル実行が身近になる中で、音声合成(TTS: Text-to-Speech)の分野でも大きなブレイクスルーが起きています。その筆頭が、わずか8200万パラメータという超軽量設計でありながら、スタジオクオリティの極めて自然な音声を生成できる「Kokoro-82M」です。

従来の高品質な音声合成AI(例えばVITSやStyleTTS2など)は、モデルサイズが大きく、動作にハイスペックなGPU環境を要求されるものが主流でした。しかし、Kokoro-82MはCPU環境であっても高速に動作し、かつ商用利用可能なライセンス(Apache 2.0)で提供されているため、個人開発からビジネスまで幅広い応用が期待されています。

本記事では、このKokoro-82MをPython環境で、かつAPIを一切使用せず「完全ローカル環境」で動かすための具体的な実装ガイドをお届けします。


Kokoro-82Mとは? 注目される3つの理由

Kokoro-82Mは、hexgrad/kokoroによって開発されたオープンソースの音声合成モデルです。Hugging Faceのモデルホスト hexgrad/Kokoro-82M で公開されており、以下のような際立った特徴を持っています。

  1. 圧倒的な軽量性(82Mパラメータ) モデルのファイルサイズは約300MB前後と極めて小さく、メモリ(RAM)消費量も最小限に抑えられています。Raspberry Piのようなエッジデバイスや、一般的なノートPCのCPUでも十分に実用的な速度で動作します。
  2. 多言語対応(日本語・英語など) 英語だけでなく、日本語、中国語、フランス語、スペイン語など複数言語の音声合成に対応しています。特に日本語のイントネーションや漢字の読み分け精度は、軽量モデルとは思えないほど自然です。
  3. 柔軟な音声スタイル(話者)の選択 女性、男性の異なる声質やトーンを表現するボイスファイルが多数用意されており、パラメータ1つで簡単に切り替えられます。

ローカルでLLMを動かす「Ollamaを使ったローカルAI開発環境」などと組み合わせることで、完全オフラインで動作する「賢く喋るAIアシスタント」を構築することも容易になります。


開発環境の準備

今回は、クロスプラットフォームで軽量に動作させるため、ONNXランタイム(ONNX Runtime)を使用した実装アプローチを採用します。これにより、PyTorch等の大がかりな重いライブラリをインストールすることなく、迅速にコードを実行できます。

1. 必要なパッケージのインストール

まずはターミナルを開き、Python環境(Python 3.9以上を推奨)に以下のライブラリをインストールします。

pip install kokoro-onnx soundfile numpy
  • kokoro-onnx: Kokoro-82MをONNX環境で動かすための軽量ラッパーライブラリです。
  • soundfile: 生成された音声データをWAV等のファイルとして保存するために使用します。

2. モデルファイルと音声ライブラリ(ボイス)のダウンロード

Kokoro-82Mを実行するには、**モデル本体(.onnxファイル)**と、**話者の声データ(.binファイル)**が必要です。 以下の手順で、必要なファイルをカレントディレクトリに配置します。

Hugging Faceのリポジトリ、または公式のGitHub等から直接ダウンロードするか、以下のPythonスクリプトを実行して自動ダウンロードを行います。

import urllib.request
import os

# ダウンロード先URLの定義
MODEL_URL = "https://github.com/thewh0ise/kokoro-onnx/releases/download/v0.1.0/kokoro-v0.19.onnx"
VOICES_URL = "https://github.com/thewh0ise/kokoro-onnx/releases/download/v0.1.0/voices.bin"

# ファイルのダウンロード処理
if not os.path.exists("kokoro-v0.19.onnx"):
    print("モデルファイルをダウンロード中...")
    urllib.request.urlretrieve(MODEL_URL, "kokoro-v0.19.onnx")

if not os.path.exists("voices.bin"):
    print("ボイスファイルをダウンロード中...")
    urllib.request.urlretrieve(VOICES_URL, "voices.bin")

print("ダウンロード完了!")

Pythonによる実装コード

準備が整ったら、実際にテキストを音声に変換(TTS)してみましょう。以下は日本語のテキストを読み上げ、WAVファイルとして保存する基本コードです。

日本語音声合成の最小実装

import soundfile as sf
from kokoro_onnx import Kokoro

# 1. Kokoroクラスの初期化(モデルとボイスファイルを指定)
# ※ONNX Runtimeの動作環境は自動で判別されます
kokoro = Kokoro("kokoro-v0.19.onnx", "voices.bin")

# 2. 読み上げる日本語テキストと話者(Voice)の指定
# 日本語話者には 'jf_alpha' (女性) や 'jm_alpha' (男性) などが利用可能です
text = "こんにちは。これは完全ローカル環境で動作する、超軽量音声合成モデル、ココロによる音声テストです。"
voice_name = "jf_alpha" # 日本語女性ボイス

print("音声生成中...")

# 3. 音声の生成(サンプルレートは通常24000Hz)
samples, sample_rate = kokoro.create(
    text,
    voice=voice_name,
    speed=1.0,  # 話速(1.0が等倍)
    lang="ja"   # 言語指定(日本語)
)

# 4. 音声ファイル(WAVフォーマット)への書き出し
output_filepath = "output_japanese.wav"
sf.write(output_filepath, samples, sample_rate)

print(f"音声ファイルを保存しました: {output_filepath}")

コードの解説

  1. モデルのロード: Kokoro("kokoro-v0.19.onnx", "voices.bin") を実行すると、ONNXファイルを読み込み、バックエンドで ONNX Runtime が起動します。GPUが利用可能な環境であれば、自動的にGPUアクセラレーションが有効化されます。
  2. 話者の選定: voice="jf_alpha" は日本語向けに調整された高品質な女性話者の音声データです。他にも男性キャラクターボイスである jm_alpha などが選択可能です。
  3. 言語コード: lang="ja" を指定することで、日本語特有の漢字・かな混じり文を正しく解析し、音声化します。

応用:長文の自動分割とストリーミング保存

音声合成AIに一度に長文を渡すと、メモリ不足になったり、不自然なイントネーションで途切れてしまうことがあります。実用的なアプリケーションでは、文章を「読点(、)」や「句点(。)」で適度に分割して処理するのがベストプラクティスです。

import numpy as np
import soundfile as sf
from kokoro_onnx import Kokoro

kokoro = Kokoro("kokoro-v0.19.onnx", "voices.bin")

long_text = (
    "音声合成AIの進化は目覚ましいものがあります。これまではクラウドのAPIを利用するのが主流でしたが、"
    "今やKokoroのような軽量モデルの登場により、完全にプライベートなローカル環境でも、"
    "人間と遜色のない滑らかな音声を作り出すことが可能になりました。素晴らしい時代ですね。"
)

# 読点や句点でテキストを分割
sentences = [s.strip() for s in long_text.replace("、", "、\n").replace("。", "。\n").split("\n") if s.strip()]

all_samples = []
sample_rate = 24000

print("長文の逐次処理を開始します...")
for i, sentence in enumerate(sentences):
    print(f"処理中 ({i+1}/{len(sentences)}): {sentence}")
    samples, sample_rate = kokoro.create(sentence, voice="jf_alpha", speed=1.0, lang="ja")
    all_samples.append(samples)

# 全ての音声データを1つに結合
final_audio = np.concatenate(all_samples)

# WAVとして保存
sf.write("output_long.wav", final_audio, sample_rate)
print("すべての処理が完了し、結合された音声ファイルを保存しました!")

トラブルシューティング:よくあるエラーと解決策

ローカル環境での音声合成の実装にあたり、引っかかりやすい代表的なトラブルとその対応策を解説します。

1. PhonemizerError や espeak 関連のエラーが出る

Kokoro-82Mは、テキストを音声記号(フォネーム)に変換する処理に「eSpeak NG」というオープンソースの音声ライブラリ内部ロジックを使用する場合があります(特に公式PyTorch版を使う場合など)。

  • 原因: システム内に espeak-ng がインストールされていないか、環境パスが通っていません。
  • 解決策:
    • macOS の場合:
      brew install espeak-ng
      
    • Windows の場合: eSpeak NGの公式インストーラーをダウンロード・実行し、環境変数 PATHC:\Program Files\eSpeak NG などを追加します。
    • Ubuntu/Linux の場合:
      sudo apt-get install espeak-ng
      
    • Tips: 本記事で紹介した kokoro-onnx を使用する場合、ライブラリ側でピュアPythonによるフォネーム解析ロジックが組み込まれているため、このシステム依存エラーを回避しやすくなっています。

2. 音声のスピードやピッチがおかしい、またはノイズが入る

  • 原因: サンプルレート(Sample Rate)の指定ミス、あるいは入力テキストに特殊文字や未対応の外国語フォントが混ざっている可能性があります。
  • 解決策:
    • Kokoro-82Mのデフォルトのサンプリング周波数は 24,000Hz (24kHz) です。soundfile.write する際に、第3引数に指定している sample_rate が正しく 24000 に設定されているか確認してください。44,100Hzや16,000Hzで保存してしまうと、再生速度が極端に速くなったり遅くなったりします。

3. GPUが認識されず、処理が遅い

  • 原因: onnxruntime(CPU専用版)が優先してインポートされている。
  • 解決策: NVIDIA GPUを搭載した環境で高速処理を行いたい場合は、以下のパッケージをインストールしてください。
    pip uninstall onnxruntime
    pip install onnxruntime-gpu
    

まとめとこれからのローカルAI

Kokoro-82Mの登場は、AIによる音声インタラクションの敷居を劇的に下げました。APIキーの管理も、高額な従量課金も不要。なにより「入力したテキストや音声データが外部サーバーに送信されない」という圧倒的なセキュリティ上のメリットがあります。

また、ブラウザ上でローカルAIを動かしたい場合は、WebGPUの進化も無視できません。Web技術を活用したローカルAI開発については「Transformers.js v3とWebGPUで構築するサーバーレスAIアプリ」の記事も、非常に参考になるはずです。

ぜひ、本ガイドを参考に、あなただけのローカル音声アシスタントや、自動読み上げツールを構築してみてください!