2025年3月30日日曜日

VOICEVOXで中間生成情報をファイルに書き出さずに発話させるコマンド備忘録


背景

音声合成エンジンVOICEVOXに発話させるコマンドは、公式のREADMEでは文章ファイル、発音内容ファイル、音ファイルの3つを生成した上で、音ファイルの再生を促す説明になっています。
プログラムで生成した文章情報を中間生成ファイルを作らず音を流すコマンドの把握に手間取ったので、備忘録として記事に残します。

使ったもの

VOICEVOX V0.14.10
bash V5.1.16
curl V7.18.0
aplay V1.2.6

中間生成ファイルに作らず発話させるコマンド

コマンド実行前にVOICEVOXエンジン(127.0.0.1:50021)を起動しておきます。
VOICEVOXからファイルをダウンロードして、GUIを起動すればエンジンが起動しますし、runを実行してエンジンだけ起動するのでも良いです。

VOICEVOXエンジンが起動した状態で下記のコマンドを実行すると、中間生成ファイルを作らず発話させれます。
実行環境はubuntu22.04のbashです。
TEXT="107番へのプログラムの書き込みが済みました"
SPEAKER_QUERY=1
SPEAKER_SYNTHESIS=1
AUDIO_QUERY=$(curl -s \
-X POST \
"127.0.0.1:50021/audio_query?speaker=$SPEAKER_QUERY" \
--get --data-urlencode "text=$TEXT")
curl -s \
-d "$AUDIO_QUERY" \
-H "Content-Type: application/json" \
-X POST \
"127.0.0.1:50021/synthesis?speaker=$SPEAKER_SYNTHESIS" \
| aplay

末尾の「 | aplay」を公式のREADMEのように「 > sound.wav」などにすれば、生成した音ファイルを残せます。

上記のコマンドで再生できるのと同じ音声ファイルがこちらです。

voicevox_sound.wav(ダウンロード)
VOICEVOX:ずんだもん

詰まりどころを解説します。

公式のREADMEで"text=@text.txt"を渡している--data-urlencodeを、環境変数の受け渡し "text=$TEXT" にそのまま使えます。
-dや--dataでも半角英数字のみの情報なら渡せますが、日本語など複数byte文字が含まれると動かなくなります。
  --data-urlencode "text=$TEXT"

audio_queryは環境変数で保持し、shyntesisに対してダブルクオートで括って渡します。
jsonを送るpost処理のbodyになるので、こちらはurlencodeが不要です。
AUDIO_QUERY=$(curl -s \
"127.0.0.1:50021/audio_query?speaker=$SPEAKER_QUERY"
# 省略
)
curl -s \
-d "$AUDIO_QUERY"
-H "Content-Type: application/json" \
-X POST \
"127.0.0.1:50021/synthesis?speaker=$SPEAKER_SYNTHESIS"

synthesisで生成された音情報はファイルとして書き出さずとも音再生プログラムaplayに渡せば音を流してくれます。
curl -s \
# 省略
"127.0.0.1:50021/synthesis?speaker=$SPEAKER_SYNTHESIS" \
| aplay

queryやsyntesisの番号はキャラクタ選択です。
1番はずんだもんで、0番は四国めたんなど、VOICEVOXのキャラを選択できます。
queryとsyntesisの番号を変えると、ずんだもん口調の四国めたんなどが作れます。
SPEAKER_QUERY=1
SPEAKER_SYNTHESIS=1

おわり

中間生成物をファイルに書き出さず、VOICEVOXに発話させれました。

参考

VOICEVOX
voicevox_engine
音声合成
Play MP3 or WAV file via the Linux command line

0 件のコメント :