音声合成システム AivisSpeech + speak_ros を使ってみた

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

リンク

AivisSpeech
speak_ros