はじめまして。
初めて記事を書く上、学習中の身なので間違い等あると思います。お手柔らかにお願いします。
概要
VOICEVOX APIをアプリ経由で使ってみたのでQiitaを使ってみるのも兼ねて使い方を残しておくことにしました。対象者はPython始めたてでrequestsについてよくわかってない人です。私はrequestsの中身をイマイチ知らなくて躓きました。
VOICEVOXを使う
今回はアプリ版を使います。CPU、GPUどっちでもいい。
OSSのエンジンだけでもできるらしいです。
リファレンス
アプリを起動状態で50021ポートにアクセスするとローカルの専用サーバにアクセスできます。色々書いてありますが見るべきはメソッドとパラメータ。
Pythonからrequestを送る
全体のコードは最後にまとめてあります。
音素データを生成する
requestsとplaysoundはpipしてください。
playsoundは別に必要ではないです。
定番のrequestsを使います。/audio_queryはJSONで音素情報を返します。
urllib.parse.quote()で日本語を変換してます。
直接文字列を入れてもrequests.post()が変換してくれる?っぽいけど一応パースかけてます。
textは読ませたい文字列で、speakerは話者をintで指定します。1はずんだもん。
結果はresponseで返ってきますが、中身がjsonなので見たい場合は変換必須。
import requests
import urllib.parse
import json
from playsound import playsound
# 音素データ生成
text = urllib.parse.quote("これはテスト出力です")
response = requests.post("http://localhost:50021/audio_query?text=" + text + "&speaker=1")
print(json.dumps(response.json(), indent=4))
音声合成
実際に合成するには/synthesisを指定。ここのspeakerは実際に喋るキャラを指定します。
post()メソッドのjsonにさきほどのresponseが持っているjson()メソッドでjson形式で渡します。
GUIアプリで合成したときと同じくらいの時間がかかるので数秒待ちます。
結果はresp_wavにresponseとして返ってきます。
# 音声合成
resp_wav = requests.post("http://localhost:50021/synthesis?speaker=1", json=response.json())
wavデータを書き出す
返ってくるのはresponseで、wavは自分で書きだす必要があります。resp_wav.contentにはバイナリのwavが入っているのでそれを読んでファイルに書き出します。
形式は.wavじゃないと読めなくなると思います。
playsound()は指定パスの位置にある音声ファイルをpython上で再生するライブラリです。
# バイナリデータ取り出し
data_binary = resp_wav.content
# wavとして書き込み
path = "test.wav"
wr = open(path, "wb")
wr.write(data_binary)
wr.close()
# 再生
playsound(path)
全体
うまくいけば実行時に読み上げが同時に行われるはずです。
import requests
import urllib.parse
import json
from playsound import playsound
# 音素データ生成
text = urllib.parse.quote("これはテスト出力です")
response = requests.post("http://localhost:50021/audio_query?text=" + text + "&speaker=1")
# responseの中身を表示
# print(json.dumps(response.json(), indent=4))
# 音声合成
resp_wav = requests.post("http://localhost:50021/synthesis?speaker=1", json=response.json())
# バイナリデータ取り出し
data_binary = resp_wav.content
# wavとして書き込み
path = "test.wav"
wr = open(path, "wb")
wr.write(data_binary)
wr.close()
# 再生
playsound(path)
まとめ
ある程度開発経験がある方ならリファレンス読んでパッとコード書けちゃうのかもしれません。
Qiitaの記事作成は便利な機能が揃っていて使いやすいですね。