AivisSpeechはVOICEVOXベースの音声合成システムです。
名前を知っていましたが、試したことがなかったので使ってみました。
AivisSpeechはDockerイメージを提供してくれているので、起動も簡単。
動作も早く、今回使ったPCで短い文章(50文字程度)の場合、1~2秒程度で音声にしてくれます。
GPUを使った場合は、一瞬で音声にしてくれました。
音声品質については、AivisHubで簡単に確認できます。
その後、ROS2対応もしたかったので、以前から気になっていた speak_ros も使ってみました。speak_rosにはAivisSpeechプラグインがあるため、あっけなくROS2対応できました。
動作確認環境
| 項目 | 内容 |
|---|---|
| OS | Ubuntu 22.04.5 LTS (x86_64) |
| ROS2 | Humble |
| Docker | 29.5.2 |
| GPU | NVIDIA GeForce RTX 4060 Ti |
AivisSpeech 編
AivisSpeech Engine を Docker で起動
初回のみ、モデルデータをコンテナ外に永続化するためのディレクトリを作成します。
mkdir -p ~/.local/share/AivisSpeech-Engine
CPU版とGPU版があるので、どちらかで起動します。
CPU版
docker run --pull always --rm -d -p '10101:10101' \ -v ~/.local/share/AivisSpeech-Engine:/home/user/.local/share/AivisSpeech-Engine-Dev \ --name aivis_engine \ ghcr.io/aivis-project/aivisspeech-engine:cpu-latest
GPU版(NVIDIA GPU + nvidia-container-toolkit が必要)
docker run --pull always --rm -d --gpus all -p '10101:10101' \ -v ~/.local/share/AivisSpeech-Engine:/home/user/.local/share/AivisSpeech-Engine-Dev \ --name aivis_engine \ ghcr.io/aivis-project/aivisspeech-engine:nvidia-latest
バージョン情報を取得して返ってくれば準備完了
curl http://localhost:10101/version
インストール済みモデルとスタイルID一覧の確認
curl --fail --silent http://localhost:10101/speakers | python3 -c "
import sys, json
for s in json.load(sys.stdin):
print(s['name'])
for st in s['styles']:
print(f' スタイルID: {st[\"id\"]} {st[\"name\"]}')
"
音声合成モデルの追加 (必要時のみ)
モデルUUIDの確認とインストール
AivisHub から使いたいモデルのページを開き、モデルUUID を確認します。
https://hub.aivis-project.com/aivm-models/47e53151-a378-46f3-abee-ce13aa07feb1
取得したモデルUUIDを指定してインストールします。
例:阿井田 茂の場合
MODEL_UUID="47e53151-a378-46f3-abee-ce13aa07feb1" curl --fail -X POST "http://localhost:10101/aivm_models/install" \ -F "url=https://api.aivis-project.com/v1/aivm-models/${MODEL_UUID}/download?model_type=AIVMX"
阿井田 茂 のスタイルID一覧メモ
| スタイルID | スタイル名 |
|---|---|
| 1310138976 | ノーマル |
| 1310138977 | Calm |
| 1310138978 | Far |
| 1310138979 | Heavy |
| 1310138980 | Mid |
| 1310138981 | Shout |
| 1310138982 | Surprise |
APIによるWAVファイル作成と再生 (必要時のみ)
STYLE_ID=1310138976 curl -s -X POST "http://127.0.0.1:10101/audio_query?speaker=$STYLE_ID" \ --get --data-urlencode "text=こんにちは" > /tmp/q.json curl -s -H "Content-Type: application/json" -X POST -d @/tmp/q.json \ "http://127.0.0.1:10101/synthesis?speaker=$STYLE_ID" > /tmp/audio.wav aplay /tmp/audio.wav
Docker ログの確認
docker logs aivis_engine
Docker コンテナの停止
docker stop aivis_engine
speak_ros 編
リポジトリのクローン
以降のコマンドは ~/ros2_ws をワークスペースとして記載しています。異なる場合は適宜読み替えてください。
cd ~/ros2_ws/src git clone https://github.com/HansRobo/speak_ros.git
依存パッケージのインストール
cd ~/ros2_ws rosdep install --from-paths src/speak_ros --ignore-src -r -y --rosdistro humble
ビルド
cd ~/ros2_ws source /opt/ros/humble/setup.bash colcon build --packages-select speak_ros_interfaces speak_ros speak_ros_aivis_plugin source install/setup.bash
speak_ros ノードの起動
あらかじめ、AivisSpeechは起動させておく。
次のコマンドでノードを起動。
下記はデフォルトのスタイルIDを指定する例です。
ros2 run speak_ros speak_ros_node --ros-args \ -p plugin_name:=aivis_plugin::AivisPlugin \ -p aivis_plugin/speaker:=1310138976
コマンドラインからの発話
別ターミナルで以下を実行し、音声が再生されれば成功です。
source /opt/ros/humble/setup.bash
source ~/ros2_ws/install/setup.bash
ros2 action send_goal --feedback /speak speak_ros_interfaces/action/Speak \
"{text: 'こんにちは、テストです'}"
別のスタイルIDを指定して発話することもできます。
ros2 action send_goal --feedback /speak speak_ros_interfaces/action/Speak \
"{text: 'こんにちは、まおです', parameters: [{name: 'speaker', value: '888753760'}]}"
動作時の構成

AivisSpeech CPU版 と GPU版 のパフォーマンス比較
CPU版とGPU版でWAVファイル生成にかかる時間を計ってみました。
環境や文字列の内容によっても変わると思うので参考程度の記録です。
測定方法
STYLE_ID=1310138976 TEXT="測定用テキスト" START=$(date +%s%3N) curl -s -X POST "http://127.0.0.1:10101/audio_query?speaker=$STYLE_ID" \ --get --data-urlencode "text=$TEXT" > /tmp/q.json curl -s -H "Content-Type: application/json" -X POST -d @/tmp/q.json \ "http://127.0.0.1:10101/synthesis?speaker=$STYLE_ID" > /tmp/out.wav END=$(date +%s%3N) echo "$((END - START))ms"
注意点:
- 同一テキストへの再リクエストはキャッシュを避けるため、測定ごとに異なるテキストを使用
- 初回リクエストはモデルロードのコストが乗るため除外
スピーカー: 阿井田 茂(ノーマル)、初回は初期化コストが乗るため除外。
処理時間
| テキスト(文字数) | CPU版 | GPU版 |
|---|---|---|
| 45文字 | 1,751ms | 232ms |
| 100文字 | 2,758ms | 339ms |
| 175文字 | 4,348ms | 487ms |