こんにちは。ポン吉です。
「今最高にイケているフリーの音声合成ソフトウェアVOICEVOX」をラズパイで使う手順を紹介しましたが、リアルタイムな音声合成にはやや無理がある状況でした。ラズパイのスペックが足りない(涙)
VOICEVOXとは?という方は、下記記事を先に読んで頂ければと思います。
そこで、今回はNVIDIA製グラフィックカードを搭載したWindwos/MacにVOICEVOXをインストールし、ラズパイ等の非力なPCからPythonやcurlで呼び出し使う方法を紹介したいと思います。
ラズパイに閉じていないシステムなので正直邪道です・・・ぼそ
例え邪道と言われようと、ラズパイに可愛い声で喋ってもらうために手段は選びません(笑)本記事を参照すれば、ラズパイでリアルタイムにかわいい声を喋ってもらう事が出来るようになります!
公式gitの説明やREST-API仕様を参照しながらpythonプログラムを書くのは初心者には難しいと思うので、誰でも動かせる手順をまとめて公開したいと思います。
今回のテーマはこちら!
- VOICEVOX をNvidia製グラフィックカードを搭載したWindows/MacのPCにインストール
- Raspberry Pi等の非力なマシンからPython/curlでVOICEVOXを使って性能評価
それではやってみましょう~♪
VOICEVOXの使い方 (Windows/Mac OS へのインストール)
公式サイトからインストール媒体をダウンロードしてインストールしましょう。
↑ 公式サイトのリンクはこちらです。
VOICEVOXのインストール
サイトのトップページにあるダウンロードボタンをクリックします。
OS/対応モード/パッケージを選びます。NVIDIA製のGPUをお持ちの方はGPU/CPUを選びましょう。
メモ
GPU/CPUはアプリ起動後の設定から変更が可能です
ダウンロードしたインストーラを実行してインストールします。アプリを実行すると次のような画面になります。いろいろと喋らせたいことをテキストで入力して再生してみましょう。
こちらのアプリの実態は HTTP サーバーなので、アプリを起動している状況でREST-APIでリクエスト送信すれば音声合成が実行できます。よって、ラズパイ等の外部サーバから音声合成結果wavファイルの取得が可能です。
うーむ。このようなマイクロサービスとしてのユースケースまで想定しているとは。ラズパイ利用者からすると非常にうれしいインターフェース仕様ですね!
VOICEVOX REST-API仕様について
実行場所:Windows/Mac
VOICEVOXをインストールしたWindows/Macのブラウザから「 http://localhost:50021/docs 」のアドレスにアクセスしましょう。下記のようにAPIドキュメントが参照できれば、VOICEVOXがHTTPサーバとして機能している事が確認できます。
VOICEVOX REST-APIの使い方
Pythonから呼び出す方法とcurlコマンドで呼び出す方法の2パターンを紹介します。
PythonからVOICEVOXを呼び出す方法
実行場所:ラズパイ等の別PC
ここからはVOICEVOXをインストールしたPCではなくラズパイ等の別PC上での作業となります。先ほどのREST-API仕様を参照し、pythonでVOICEVOXに音声合成させるプログラムを書いてみました。
6行目の「 HOSTNAME=XXXXXXXX 」は環境に合わせて変更して下さい。
import requests
import argparse
import json
# VOICEVOXをインストールしたPCのホスト名を指定してください
HOSTNAME='XXXXXXXX'
# コマンド引数
parser = argparse.ArgumentParser(description='VOICEVOX API')
parser.add_argument('-t','--text', type=str, required=True, help='読み上げるテ>キスト')
parser.add_argument('-id','--speaker_id' , type=int, default=2, help='話者ID')
parser.add_argument('-f','--filename', type=str, default='voicevox', help='ファ>イル名')
parser.add_argument('-o','--output_path', type=str, default='.', help='出力パス名')
# コマンド引数分析
args = parser.parse_args()
input_texts = args.text
speaker = args.speaker_id
filename = args.filename
output_path = args.output_path
#「 。」で文章を区切り1行ずつ音声合成させる
texts = input_texts.split('。')
# 音声合成処理のループ
for i, text in enumerate(texts):
# 文字列が空の場合は処理しない
if text == '': continue
# audio_query (音声合成用のクエリを作成するAPI)
res1 = requests.post('http://' + HOSTNAME + ':50021/audio_query',
params={'text': text, 'speaker': speaker})
# synthesis (音声合成するAPI)
res2 = requests.post('http://' + HOSTNAME + ':50021/synthesis',
params={'speaker': speaker},
data=json.dumps(res1.json()))
# wavファイルに書き込み
with open(output_path + '/' + filename + f'_%03d.wav' %i, mode='wb') as f:
f.write(res2.content)
コマンド引数処理を除くと、実際の処理は「30~39行」だけです。API仕様を見ると更に細かいパラメタが沢山あります。更に設定を突き詰める方はサンプルソースをベースにカスタマイズしてみてください。
長文をVOICEVOXに渡すと処理時間が長くなるため「。」ごとに区切って処理させています。このあたりは、pythonを呼び出す前処理としてシェルで実装しても良いと思います。不要な人は削除を。
▼pythonプログラムの実行例(-idで話者ID、-tでテキストを指定)
python voicevox.py -id 14 -t 本当にラズベリーパイでリアルタイムに喋れるんですか?
# 引数の紹介
# -t, --text 読み上げるテキスト
# -id, --speaker_id 話者ID (省略時は「2」の四国めたんさん)
# -f, --filename ファイル名 (省略時はvoicevox_000.wavで出力されます) ※数字部分は連番
# -o, --output_path パス名 (省略時はカレントディレクトリ)
カレントディレクトリに「 voicevox_000.wav 」という音声ファイルが格納されていれば成功です!
本当にラズベリーパイでリアルタイムに喋れるんですか?
話者ID「14」は冥鳴ひまりさんになります。VOICEVOXのキャラクタ(話者ID)は下記リンク先の記事で解説しています。
エラーになる場合の対処
pythonプログラム実行PC ⇔ VOICEVOXインストールPC の通信経路に問題ないか確認ください。ホスト名解決ができない場合はIPアドレス指定で動作するか確認下さい。Windows/MacのFirewall設定にも問題がないか確認ください。
curlコマンドでVOICEVOXを呼び出す方法
実行場所:ラズパイ等の別PC
pythonではなくシェル等のコマンドラインで使いたい!という場合のために、curlコマンドによる使い方を紹介しておきます。下記サンプルは公式gitサイトの記載をそのまま転記したものです(雑)。詳細はリンク先の公式gitを参照ください。
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
speaker=1となっているので「ずんだもん」さんの声ですね。上記サンプルをラズパイ等の外部サーバから呼び出す場合は「 localhost 」部分を実際にVOICEVOXをインストールした「ホスト名またはIPアドレス」に置き換えてください。
Raspberry PiからVOICEVOXをリアルタイムに活用できるか評価
実際にリアルタイム処理として活用できるか性能評価してみました。音声合成の処理時間は「timeコマンド」を使って計測。
▼VOICEVOXインストール先PCスペック
・Windows10 Pro
・Intel(R) Core(TM) i5-7300HQ CPU @ 2.50GHz
・NVIDIA GeForce GTX 1060 3GB ※GPUスペック動作最低限ライン(弱っ!)▼Pythonプログラム実行PCスペック
・Raspberry Pi 3 Model B Rev 1.2 ※あえて貧弱なラズパイを選択
time python voicevox.py -id 14 -t 本当にラズベリーパイでリアルタイムに喋れるんですか?
real 0m2.557s
user 0m0.570s
sys 0m0.080s
平均して2.5秒程度。この程度の処理時間ならリアルタイムにも活用可能です。(PCスペックが更に良ければ更に早くなると思います)
VOICEVOX COREやOpen JTalkメイさんとの処理時間の比較結果を下記に記載します。
音声合成パターン | 処理時間 | 考察 |
Raspberry Pi OSで Open JTalk メイさんを実行 (ご参考) | 0.9秒 | 最速! |
Raspberry PiのPythonからWindows/MacのVOICEVOX(GPU)を実行 | 2.5秒 | これなら許容範囲 |
Raspberry Pi OSで VOICEVOX COREで実行 | 111.9秒 | こりゃキツイ |
さすがにOpen JTalkのmeiさんの0.9秒には敵いませんでしたが、スマートホーム用途にも十分活用できる応答性能だと思います。
まとめ
- Windows/Macに入れたVOICEVOXを活用しラズパイからリアルタイムに処理可能!
- スマートホーム用途で常時使う場合はWindows/Macの常時起動が必要に・・・
結論:邪道な手段であっても可愛いは正義!
エコじゃないよね
ラズパイから(邪道な手段により)リアルタイムに喋ってもらえるようになりましたが、Windows/Macを常時起動させておくのも微妙です・・・エコじゃない!Wake on Lan環境を構築した上で、マジックパケット送信後にpythonから処理させるという形がエコで良いかもしれません。寝ているマシンをたたき起こす分レスポンスは悪化しますのでご参考まで。