軽量なテキスト読み上げ(TTS)モデルKokoro-82Mを試してみる。
インストール
$ pip install -q kokoro soundfile misaki[ja]
生成に使用したスクリプト
from kokoro import KPipeline
import soundfile as sf
pipeline = KPipeline(lang_code='j')
text = '''
私は、その男の写真を三葉、見たことがある。
一葉は、その男の、幼年時代、とでも言うべきであろうか、十歳前後かと推定される頃の写真であって、その子供が大勢の女のひとに取りかこまれ、(それは、その子供の姉たち、妹たち、それから、従姉妹たちかと想像される)庭園の池のほとりに、荒い縞の袴をはいて立ち、首を三十度ほど左に傾け、醜く笑っている写真である。醜く? けれども、鈍い人たち(つまり、美醜などに関心を持たぬ人たち)は、面白くも何とも無いような顔をして、
「可愛い坊ちゃんですね」
といい加減なお世辞を言っても、まんざら空お世辞に聞えないくらいの、謂わば通俗の「可愛らしさ」みたいな影もその子供の笑顔に無いわけではないのだが、しかし、いささかでも、美醜に就いての訓練を経て来たひとなら、ひとめ見てすぐ、
「なんて、いやな子供だ」
と頗る不快そうに呟き、毛虫でも払いのける時のような手つきで、その写真をほうり投げるかも知れない。
'''
generator = pipeline(
text, voice='jf_alpha',
speed=1, split_pattern=r'\n+'
)
for i, (gs, ps, audio) in enumerate(generator):
print(i) # i => index
print(gs) # gs => graphemes/text
print(ps) # ps => phonemes
sf.write(f'{i}.wav', audio, 24000)
実行
$ time python kokoro-sample.py
(中略)
python kokoro-sample.py 139.01s user 61.26s system 945% cpu 21.171 total
Mac mini(M4 Pro)の実行速度。マルチスレッドで実行されている。
生成された音声
上記のスクリプトでは改行単位でwavファイルが生成されるが、ffpmpegで結合しmp3に変換した。
ffmpeg -i 0.wav -i 1.wav -i 2.wav -i 3.wav -i 4.wav -i 5.wav \\n-filter_complex "[0:0][1:0][2:0][3:0][4:0][5:0]concat=n=6:v=0:a=1[out]" \\n-map "[out]" -acodec libmp3lame -q:a 2 kokoro.mp3
ボイスはjf_alpha
を使用した。現時点(2025/02/08)では日本語で5種類の音声を使用できる模様。
音声合成で商用のvoicepeakを使っているが、それと比較するとイントネーションの自然さでは負けているものの十分聞き取れる。
また、voicepeakはアプリのUIからテキストを入力し音声合成するしかなく、他のアプリやプログラムとの連携ができないが、Kokoro-82Mはプログラミング可能であるのが大きい。
ちなみに以下は同じテキストをvoicepeakの女性1で生成した音声。