【Python】VOICEVOXを導入⇒ずんだもんを喋らせてみた
背景
近年ではAIによる翻訳から対話まで、文字ベースのやり取りだと部分的には実用可能なレベルまで届いているのではないでしょうか。ここでもう一歩踏み出して文字ベースから音声ベースでAIを使ってみるためにまずはVOICEVOXを導入してPythonから喋らせてみたいと思います。
VOICEVOXとは
簡単にいえば「棒読みちゃん(通称、ゆっくり)」のお友達ですね。テキスト入力を音声で読み上げてくれるソフトウェアです。この業界だと「ずんだもん」というキャラクターがよく動画などで登場しますが、この「ずんだもん」こそがVOICEVOXに含まれる音声パターンの一つになります。
実際に使ってみる
VOICEVOXエンジンの取得
VOICEVOXをPython経由で叩くにはVOICEVOXエンジンが必要になるので以下のgithubから取得します。Win版やmac版、あるいはCPU版、GPU版と分かれているので実行環境に合ったものを取得してください。
筆者環境はWindows 10のためWindows(CPU版)を取得しました。記載時点ではVOICEVOXエンジンのバージョンは0.14.5でした。
VOICEVOXエンジンを起動
取得した資源を解凍すると、フォルダの中にrun.exeが存在するので実行すると以下のようなコンソールが立ち上がります。この状態になればAPIを実行するだけで喋らせることが出来そうです。
![](https://assets.st-note.com/img/1688518621461-hzsmDliiTH.png?width=1200)
VOICEVOXエンジンで使えるAPIを見てみる
使用できるAPIは以下の公式ドキュメントあるいはエンジンを立ち上げた状態であれば http://localhost:50021/docs に接続することでSwaggerが立ち上がるのでそのままAPIを叩くことも可能です。
Swaggerを見る限りはクエリ作成⇒音声合成でテキスト入力を音声に変換することが出来そうなのでこれを試してみようと思います!
![](https://assets.st-note.com/img/1688520598214-Dmn4YEqmr7.png?width=1200)
VOICEVOX APIを叩いてみた
今回は入力文字列を音声に変換してpyaudioを使ってそのまま音声を再生してみました。私の環境だと20文字程度であれば実行から1秒立たずに音声が再生されました。試しに250文字程度の入力をしてみると8秒ぐらい時間が掛かったのでテンポよく応答させたい場合は文字数に気を付ける必要がありそうでした。
import requests
import json
import pyaudio
def vvox_test(text):
# エンジン起動時に表示されているIP、portを指定
host = "127.0.0.1"
port = 50021
# 音声化する文言と話者を指定(3で標準ずんだもんになる)
params = (
('text', text),
('speaker', 3),
)
# 音声合成用のクエリ作成
query = requests.post(
f'http://{host}:{port}/audio_query',
params=params
)
# 音声合成を実施
synthesis = requests.post(
f'http://{host}:{port}/synthesis',
headers = {"Content-Type": "application/json"},
params = params,
data = json.dumps(query.json())
)
# 再生処理
voice = synthesis.content
pya = pyaudio.PyAudio()
# サンプリングレートが24000以外だとずんだもんが高音になったり低音になったりする
stream = pya.open(format=pyaudio.paInt16,
channels=1,
rate=24000,
output=True)
stream.write(voice)
stream.stop_stream()
stream.close()
pya.terminate()
if __name__ == "__main__":
text = "こんにちは。私の名前はずんだもんです。"
vvox_test(text)
使ってみた感想
今回は「ずんだもん」の通常音声で試してみましたが、ささやき音声やツンツン音声、あるいは別キャラクターの音声も内蔵されているのでVOICEVOX自体が中々に面白いと思いました!
文庫本をテキスト入力として読ませるには結構な処理時間が必要そうでしたが、GPTのレスポンスに文字数制限を掛けて喋らせる程度であれば違和感ない程度の応答速度で喋らせることが出来るのではないかなと感じました。