軽量なテキスト読み上げ(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で生成した音声。