PythonからVOICEVOXを使う


VOICEVOX

商用利用可能なAIベースの音声合成ソフトウェア

ボイボと呼びましょう。

APIなのかと思ったら、ダウンロードして.exeを実行すると、ローカルにサーバーが立つみたい。
curlでも利用できるとのことなので、pythonで叩いてみた。
あらかじめ上記リンクから、VOICEVOX本体をダウンロードして実行しておいてください。

実行環境

当方の実行環境は以下

  • CPU: i7 8550u
  • GPU: Nvidia MX150
  • Python = 3.9.5

CPUで実行しました。

ソースコード

合成されるファイルは映像系のサンプルレート(モノラルの24000[Hz])なので注意

voicevox.py
import json
import requests
import wave

def generate_wav(text, speaker=1, filepath='./audio.wav'):
    host = 'localhost'
    port = 50021
    params = (
        ('text', text),
        ('speaker', speaker),
    )
    response1 = requests.post(
        f'http://{host}:{port}/audio_query',
        params=params
    )
    headers = {'Content-Type': 'application/json',}
    response2 = requests.post(
        f'http://{host}:{port}/synthesis',
        headers=headers,
        params=params,
        data=json.dumps(response1.json())
    )

    wf = wave.open(filepath, 'wb')
    wf.setnchannels(1)
    wf.setsampwidth(2)
    wf.setframerate(24000)
    wf.writeframes(response2.content)
    wf.close()

if __name__ == '__main__':
    text = 'こんにちは!'
    generate_wav(text)

感想

上記のPythonからしかためしていないので、GUIからだと解決できる機能があるかもですが、以下が簡単な感想です。

  • 合成にはそこそこ時間がかかるので、リアルタイムでの合成には向いていなさそう(マシンスペックによる?)
  • 英語をアルファベット読みされてしまうことがある(言語指定とかで回避できる?)
  • 音声自体の品質は高い方だと思う
  • 日本語にて、あらかじめ合成しておいて使うような用途であれば、現時点でベストプラクティスかもしれない
  • 音声合成はいつもライセンス周りで困るので、ラピットプロトタイピングできるようになるのはありがたい
  • 他の音声合成でもありがちだが、合成されたファイルは、音声部分のみ再生するとプツっと切れてしまう。 "、"や"。"で無音を置けたり、SSMLでpauseを入れたりできるとよくなりそう。