- home
- python
: 2024年2月25日
: 2024年3月2日
VOICEVOXのダウンロード
https://voicevox.hiroshiba.jp/ にアクセスし、ソフトウェアをダウンロードする

CPU版であっても問題なく動きます.筆者にはGPU環境がないのでCPU版をダウンロードします.

このように警告画面が出ますが,詳細情報をクリックするとインストールすることができます。あとは「次へ」を連打すれば問題なくインストールできます. 最後にVOICEBOXアプリを起動し,http://localhost:50021/docsにアクセスしてページが表示されれば 準備完了です.
(アプリがどこにあるかわからない方はタスクバーの検索で「VOICEBOX」と入力してみてください)
Pythonコード
import json
import requests
import simpleaudio as sa
import io
import wave
def generate_and_play_wav(text, speaker=1):
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())
)
# バイナリデータをwaveオブジェクトとして読み込む
with io.BytesIO(response2.content) as audio_io:
with wave.open(audio_io, 'rb') as wave_read:
# simpleaudioで再生可能なオーディオオブジェクトを生成
audio_data = wave_read.readframes(wave_read.getnframes())
wave_obj = sa.WaveObject(audio_data, wave_read.getnchannels(), wave_read.getsampwidth(), wave_read.getframerate())
# WAVファイル再生部分
play_obj = wave_obj.play()
play_obj.wait_done() # 再生が完了するまで待つ
if __name__ == '__main__':
text = '明日の天気は晴れと雪だよ'
generate_and_play_wav(text)
上記のプログラムをVOICEVOXアプリが起動されている状態で実行してください.数秒のラグがありますが、音声が再生されるはずです。
関数
generate_and_play_wavが音声を読み上げる関数。引数は以下。
| text |
読み上げるテキスト |
| speaker=0 |
読み手を表す整数 |
speakerの整数と読み手の対応関係の一部は
| speaker=2 |
四国メタン |
| speaker=3 |
ずんだもん |
| speaker=8 |
春日部つむぎ |
| speaker=10 |
雨春はう |
| speaker=9 |
波音リツ |
のようになっている。口調も変えることができ、別の整数値が用意されている。上の表の口調はすべてノーマル。
プログラムの説明
わからない単語に出くわしたら見てみてください。
| Web API |
Web上で提供されるサービスを利用するための仕組み。HTTP/HTTPS通信を行うことで利用できる |
| HTTPリクエストメソッド |
Webブラウザ(Google ChromeやSafariのこと)からWebサーバー(今回の例ではWeb APIを提供してくれるpc)に対しての命令の種類のこと |
| GETリクエスト |
HTTPリクエストメソッドの一種で、Webサーバーからデータを取得しようとする命令 |
| POSTリクエスト |
HTTPリクエストメソッドの一種で、Webサーバーにデータを送信しようとする命令 |
| リクエストパラメーター |
HTTPリクエストメソッドは命令の種類を定めるものに対し、リクエストパラメーターはどのような形式のデータを取得するかなどを表す。 |
| APIエンドポイント |
URLの一種。「ペースURL + パス + クエリパラメーター 」という構成をしていることが多い |
| ペースURL |
APIサーバーのルートアドレス。例えば、https://api.example.com/ |
| パス |
操作の対象となるデータへのパス。例えば、「users/」であれば全てのユーザーを表すことが多く、「users/123/」であればidが123を表すユーザーを表すことが多い。 これはあくまでも例なので、詳細は仕様を読もう。 |
| クエリパラメーター |
オプションで、リクエストに追加情報を提供するためのパラメータ。例えば、「limit=10」であれば最大で10個のデータを取得することを表したりする。 これはあくまでも例なので、詳細は仕様を読もう。 |
| レスポンス |
APIエンドポイントを指定してサーバーにデータを送信したあと、返ってくるデータのこと |
| リクエストボディ |
パス、パラメーター以外に何かを指定するJSONデータそのもの。APIの種類によっては必要ないこともある。 |
| ペイロード |
リクエストボディの内容といったニュアンスで使われる言葉。 |
| wav形式 |
音声データのファイル形式の一つ。無圧縮なので高品質。変わりに容量が大きい。 |
| audio/wav |
wav形式のファイルを指すMIMEタイプ |
| MIMEタイプ |
ファイルの形式を識別するために使用される標準化された方法。「形式/拡張子」のようになっていることが多い。あくまでも「多い」だけど「text/plain」のようなMIMEタイプもある |
Web API利用の流れ
- Web APIの仕様の理解する。どのような通信手段で、どのようなURLを用いれば、何が返されるかを理解する。「VOICEVOX API使い方」などで検索するといろいろでてくるけどこのページがわかりやすい
- APIキーまたは認証トークンを取得する。今回は必要ない。
- HTTPリクエストメソッドを選択し、リクエストパラメーターを選択し、適切なAPIエンドポイントを選択する
- 一つ上で作成したリクエストを送信、レスポンスを取得する。pythonではrequestsクラスのgetメソッド、postメソッドでリクエストの送信、取得ができる。
- あとはレスポンスを適切に処理すればよい
Web API仕様書の見方
このページを例に解説をする
- 右のpost /audio_queryから、パスがaudio_queryで音声合成用のクエリが生成できることがわかる
- QUERY PARAMETERSで用いるパラメーターと、なにが必須かどうかと、型がわかる
- 右のResponse samplesではレスポンスとしてどんなデータが返るかわかる。
- ここで得られたクエリはそのまま音声合成に利用できますとあるので、この/audio_queryのレスポンスを後で使うかもしれないと予想がつく
- どうやら、「音声合成用」らしいので、このレスポンスではまだ音声合成ができていないらしい。
左のサイドバーの「音声合成/音声合成をする」を見てみる。
- 右のpost /synthesisから、パスがsynthesisで音声合成ができることがわかる
- QUERY PARAMETERSで用いるパラメーターと、なにが必須かどうかと、型がわかる
- 「REQUEST BODY SCHEMA: application/json」から、リクエストボディの形式がJSON形式である必要があることがわかる。
headers = {'Content-Type': 'application/json',}のようにして明示的に指定する。
- 右の「Payload」の下から、リクエストボディが必要であることと、Content type が application/json であることがわかる
- pythonのrequestsライブラリでは、リクエストボディは「data=」という形式で指定していると定められているので、
response1.json()で「application/json」形式のデータを取得し、jsonのdumpsでテキストに変換する
- 上のスクリーンショットには映っていないが、「Responses」という名前の見出しの「Successful Response」とクリックすると、「RESPONSE SCHEMA: audio/wav」となっている。これより、レスポンスがwav形式であることがわかる
Web API使用部分のコードの説明
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())
)
- 「voicevox api ベースURL」と調べるとベースURLは
http://localhost:50021/らしい
- 一つ目のリクエストは、/audio_queryで「text」「speaker」がパラメーターとして必要なことはわかっているので、postメソッドの引数にそれぞれ指定する
- 二つ目のリクエストは、ヘッダーとパラメーターとリクエストボディを指定する。
wavファイルの操作
# バイナリデータをwaveオブジェクトとして読み込む
with io.BytesIO(response2.content) as audio_io:
with wave.open(audio_io, 'rb') as wave_read:
# simpleaudioで再生可能なオーディオオブジェクトを生成
audio_data = wave_read.readframes(wave_read.getnframes())
wave_obj = sa.WaveObject(audio_data, wave_read.getnchannels(), wave_read.getsampwidth(), wave_read.getframerate())
# WAVファイル再生部分
play_obj = wave_obj.play()
play_obj.wait_done() # 再生が完了するまで待つ