【TTS】VOICEVOX+Docker+WSL2で合成音声を出力してみる

はじめに

みなさん合成音声はご存じでしょうか?
YouTubeのコメント読み上げや解説動画などで耳にする方も多いかもしれませんね。
合成音声は一つ一つの音がはっきりしており、字幕等が無くても話している内容が理解できるため好んで観ることが多いです。

今回は「VOICEVOX」を使用して合成音声に触れてみようといった回となります。

使用技術

・VOICEVOX
・Docker
・WSL2

導入方法

前提:DockerとWSL2の設定は既に完了しているものとします。

まずはDockerコンテナの作成と起動を行います。
(とはいえ公式で手順を説明してくれていますのでそれに沿ってコマンドを実行するだけです。)
今回はCPU版を使用しました。
※GPU版を使用する場合はこちらを参照してください。

// イメージの取得
docker pull voicevox/voicevox_engine:cpu-ubuntu20.04-latest
// 起動
docker run --rm -it -p '127.0.0.1:50021:50021' voicevox/voicevox_engine:cpu-ubuntu20.04-latest

これで準備は完了です。

使用方法

実際に使用する場合は以下のコマンドを使用します。

// 読み上げるテキストを作成
echo -n "はじめまして、よろしくお願いします。" > text.txt
// テキストをパラメーターに変換
curl -s -X POST "localhost:50021/audio_query?speaker=1" --get --data-urlencode text@text.txt > query.json
// オーディオファイルの作成
curl -s -H "Content-Type: application/json" -X POST -d @query.json "localhost:50021/synthesis?speaker=1" > audio.wav

使用例

echo -n "メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。メロスには政治がわからぬ。メロスは、村の牧人である。笛を吹き、羊と遊んで暮して来た。けれども邪悪に対しては、人一倍に敏感であった。きょう未明メロスは村を出発し、野を越え山越え、十里はなれた此のシラクスの市にやって来た。メロスには父も、母も無い。女房も無い。十六の、内気な妹と二人暮しだ。この妹は、村の或る律気な一牧人を、近々、花婿として迎える事になっていた。結婚式も間近かなのである。メロスは、それゆえ、花嫁の衣裳やら祝宴の御馳走やらを買いに、はるばる市にやって来たのだ。先ず、その品々を買い集め、それから都の大路をぶらぶら歩いた。メロスには竹馬の友があった。セリヌンティウスである。今は此のシラクスの市で、石工をしている。その友を、これから訪ねてみるつもりなのだ。久しく逢わなかったのだから、訪ねて行くのが楽しみである。歩いているうちにメロスは、まちの様子を怪しく思った。ひっそりしている。もう既に日も落ちて、まちの暗いのは当りまえだが、けれども、なんだか、夜のせいばかりでは無く、市全体が、やけに寂しい。のんきなメロスも、だんだん不安になって来た。" > text.txt
curl -s -X POST "localhost:50021/audio_query?speaker=1" --get --data-urlencode text@text.txt > query.json
curl -s -H "Content-Type: application/json" -X POST -d @query.json "localhost:50021/synthesis?speaker=1" > running_melos.wav

作成された音声

解説

VOICEVOXではローカルで起動したWebサーバーとHTTP通信を介してデータをやり取りしています。
今回使用したAPIは以下の二つで、
"/audio_query"にテキストデータを投げると、パラーメーターに変換されたjsonファイルが返却され、
"/synthesis"に変換されたデータを投げることで音声を合成し、wavファイルが返却されます。

VOICEVOXエンジンを起動した状態でhttp://127.0.0.1:50021/docsにアクセスするとAPIドキュメントが確認できます。

VOICEVOXではふりがな・アクセント・高さ・長さの4つの要素を使用して音声を作成しており、各要素を細かく設定することでより自然な形でテキストを読み上げさせることができます。
デフォルトだと"/audio_query"のレスポンスはVOICEVOXエンジンが判断した読み方が記録されるため、アクセントや読みを変更したい場合は以下の記法で調整することが可能です。

・全てのカナはカタカナで記述される
・アクセント句は「/」または「、」で区切る。「、」で区切った場合に限り無音区間が挿入される

・カナの手前に「_」を入れるとそのカナは無声化される
・アクセント位置を「'」で指定する。
・全てのアクセント句にはアクセント位置を 1 つ指定する必要がある。
・アクセント句末に「?(全角)」を入れることにより疑問文の発音ができる

実際にやってみると以下のような形になります。

// 調整なし
$ echo -n "メロスは激怒した。" > text.txt
$ curl -s -X POST "localhost:50021/audio_query?speaker=1" --get --data-urlencode text@text.txt > query.json
$ curl -s -H "Content-Type: application/json" -X POST -d @query.json "localhost:50021/synthesis?speaker=1" > running_melos_default.wav

作成された音声

// 調整あり
$ echo -n "メロスは激怒した。" > text.txt
$ curl -s -X POST "localhost:50021/audio_query?speaker=1" --get --data-urlencode text@text.txt > query.json
$ cat query.json | grep -o -E "\"kana\":\".*\""
// 出力
// "kana":"メ'ロスハ/ゲ'キド/_シタ'"
$ echo -n "メロス'ワゲ/キ'ド/_シタ'?" > kana.txt
$ curl -s -X POST "localhost:50021/accent_phrases?speaker=1&is_kana=true" --get --data-urlencode text@kana.txt > newphrases.json
$ cat query.json | sed -e "s/\[{.*}\]/$(cat newphrases.json)/g" > newquery.json
$ curl -s -H "Content-Type: application/json" -X POST -d @newquery.json "localhost:50021/synthesis?speaker=1" > running_melos_change.wav

作成された音声

おわりに

今回はDocker環境でVOICEVOXを使用して遊んでみましたがいかがでしたでしょうか?
試したのは簡単なデータのやり取りのみでしたが、工夫次第でいろいろと遊べそうですね!
簡単な手順で合成音声に触れることができるため、興味を持った方はぜひ試してみてください。(公式から提供されているGUIエディタも手軽でおすすめです。)

ここまでご覧いただきありがとうございました!
いつか人の代わりに合成音声が話してくれる日がくることを願って終わりたいと思います。

クレジット

VOICEVOX:https://voicevox.hiroshiba.jp/
VOICEVOX:ずんだもん
Docker image:voicevox/voicevox_engine

前へ

【Vue3】FullCalendarを使用して予定表を作ってみた

次へ

VSCode Dev Containersでこれからの開発環境構築