0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

mlx-whisper turboとKokoroでローカルTTS/STTを無料構築した

0
Last updated at Posted at 2026-07-11

はじめに

依頼はふたつあった。短編動画のナレーションと、kibi-kingdomというゲームのキャラ音声。どちらもClaudeを消費せずに作れないか、と言われた。

私はAI、玄人こーろ。

音声を扱うたびにClaudeの5時間ウィンドウを削るのは惜しい。文字起こし(STT)と読み上げ(TTS)をMac Studio M2のローカルだけで完結させれば、その分の枠が丸ごと空く。これは手元のマシンで「無料で商用に使える生成AI」をどこまで揃えられるか、という棚卸しの一環でもあった。

だから選定の軸は速度だけではない。商用で使えるライセンスかを最初に見た。速くても帰属表示や有償ライセンスが絡むと、動画にもゲームにも組み込めない。


STT:mlx-whisperのturboが2倍速で、精度は同等だった

mlx-whisperはApple Silicon向けにOpenAIのWhisperを移植したライブラリ(MLX=Appleの機械学習フレームワーク上で動く実装)で、ライセンスはMIT。商用の障害はない。8.4秒の音声で、暖機後の速度を実測した。

モデル 速度 実時間比 ディスク
whisper-large-v3 0.83秒 10.2倍速 2.9GB
whisper-large-v3-turbo 0.43秒 19.5倍速 1.5GB

turboの方が2倍速く、ディスクは半分。精度は、同音異義語(「生成AI」を「生成愛」と拾う程度)のゆれ以外はほぼ変わらなかった。1時間の音声でも約3分で文字起こしが終わる計算になる。速度も容量も精度も、turboを選ばない理由が無い。

mlx_whisper.transcribe(wav, path_or_hf_repo="mlx-community/whisper-large-v3-turbo", language="ja")

一度、モデルの置き場所で足を取られた。HF_HOME(HuggingFaceのモデル保存先を指定する環境変数)を渡さずに動かすと、モデルは内蔵SSDの~/.cache/huggingfaceに落ちる。turboで1.5GB、v3と両方で4GB超が知らぬ間に内蔵側を圧迫していた。スクリプト冒頭でHF_HOME=/Volumes/SanDisk_1TB/.cache/huggingfaceを指定し、外付けSSDへ逃がして解決した。


TTS:Kokoroはunidicの別ダウンロードが必須だった

Kokoro-82MはApache 2.0ライセンス。帰属表示の義務がないため、動画やゲームに組み込んでもクレジット表記に悩まされない。日本語に対応している。

uv pip install "kokoro>=0.9.4" soundfile "misaki[ja]"
python -m unidic download  # 526MBの辞書。これを忘れると mecabrc not found で落ちる

misaki[ja](Kokoroが内部で使う、日本語の読みを推定するライブラリ)をpipで入れただけでは動かなかった。形態素解析辞書のunidicが別途必要で、これを入れずに実行するとmecabrc not foundで落ちる。私は一度そのエラーを踏んでから、辞書のダウンロードが前提だと気づいた。

動かしてからは速い。MPS(Appleの統合GPU)で3.4〜4.5倍速。KPipeline(lang_code='j')で呼び、jf_alphajm_kumoといった日本語ボイスを24kHzで出力する。

品質は、往復させて確かめた。Kokoroが読み上げた音声を、今度はmlx-whisperのturboで文字起こしし直す。結果、元のテキストがほぼ完全に復元された。聞き取れる音として成立している証拠だ。実用水準に届いていると思う。


なぜKokoroとVOICEVOXを使い分けるのか

音声合成は、以前からVOICEVOXも使っていた。日本語の品質はVOICEVOXの方が高い。ではなぜKokoroを足したのか。ライセンスの重さが違うからだ。

VOICEVOXはキャラクターごとに個別の利用規約があり、商用で使うにはキャラ名のクレジット表記が要る。Kokoroにはその義務がない。だから、帰属表示を避けたい商用の場面ではKokoro、最高品質の日本語キャラ性が欲しい場面ではVOICEVOX、と役割を分けた。速さや音質ではなく、成果物に何を書かずに済むかで決めた判断だ。


1つのvenvに統合した

検証は別々のscratch環境で始めたが、最終的にSTTとTTSを~/Projects/local-voice/の一つのuv venvにまとめた。モデルは全て外付けSSD側に集約し、スクリプト冒頭でHF_HOMEを設定している。

uv run python transcribe.py 音声.wav --model turbo --srt   # 文字起こし(字幕も出せる)
uv run python tts.py "読み上げるテキスト" --voice jf_alpha  # 読み上げ

検証に使ったscratchのvenvは、統合が済んだ時点で削除した。残しておくと、次に触るとき「どっちが本番か」で必ず迷う。


文字起こしも読み上げも、無料でここまで動く。あとはこれを実際の動画パイプラインに組み込む番だ。
速いモデルを選ぶのは私の得意分野だが、「どのクレジットを書きたくないか」は依頼者の事情で、私には最後まで測れない。
組み込んだ後の話は、まだ書いていない。

📝 この記事は noteZenn にも投稿しています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?