LoginSignup
13
10

VoiceVox を ROS2 で使用する

Last updated at Posted at 2024-02-22

 VoiceVox を ROS2 で使用できるパッケージ VOICEVOX_ROS2 を作成しましたので、本パッケージの使用方法を紹介します。

VOICEVOX_ROS2

 VOICEVOX_ROS2 は ROS2 humble で動作する音声合成パッケージです。ロボットからずんだもんや四国めたんなどの音声合成ボイスを発話できます。ソースコードとドキュメントは以下のリンクから参照してください。

Voicevox_ros2 アップデートのおしらせ
新機能 voice_saver を追加しました。詳しい使用方法は voice_saver を使うを参照してください。

インストール

 インストール前に ROS ワークスペースを事前に作成してください。

mkdir colcon_ws/src

 src ディレクトリに本パッケージをダウンロードします。

cd colcon_ws/src
git clone https://github.com/GAI-313/voicevox_ros2/tree/humble

 ダウンロードが完了したら、パッケージをビルドします。

cd colcon_ws
colcon build --packages-up-to voicevox_ros2

--packages-up-to voicevox_ros2 引数を与えることで、voicevox_ros2 と、それに依存するパッケージ voicevox_ros2_interface のみビルドすることができます。
 Voicevox_ros2 はビルドが開始されると VoiceVox_core や jtalk ライブラリなどの必要なパッケージを自動的にインストールします。よってビルドには数分程かかります。

 ビルドが完了したら ~/.bsahrc とワークスペースを通します。

source ~/.bashrc
source colcon_ws/install/setup.bash

 これでインストールは完了です。

voicevox_ros2_core を起動する

 以下のコマンドを実行して、コアノード voicevox_ros2_core を起動します。

ros2 run voicevox_ros2 voicevox_ros2_core

 起動時に、以下のメッセージが表示されたら成功です。

[INFO] [xxxxxxxx.xxxxxxx] [voicevox_ros2_core]: start voicevox_ros2

 このノードが起動すると、以下のトピックが発行されます。

/voicevox_ros2/speaker
/voicevox_ros2/status

 主に使用するのは /voicevox_ros2/speaker です。/voicevox_ros2/status は voicevox_ros2_core の動作状況を飛ばしていますので、気にしないでください。

トピックから発話させる

 voicevox_ros2_core が起動している状態で、新たなターミナルを起動します。
サンプルとして以下のノードを実行しましょう。

ros2 run voicevox_ros2 pub

 すると

こんにちは。VoiceVox_ROS2 です。

とずんだもんの声で発話します。
 次はコマンドからトピックを飛ばして好きなテキストを発話させてみましょう。以下のように /voicevox_ros2/speaker トピックに voicevox_ros2_interface/msg/Speaker 型で任意のテキスト、発話キャラIDを指定します。加えて オプション --once をつけ忘れないよう気をつけてください。 これを与えないとずっと言葉を喋り続けます…

ros2 topic pub --once /voicevox_ros2/speaker voicevox_ros2_interface/msg/Speaker "{text: 'hello', id: 1}"

 text に発話させたいテキストを入力し、id に発話するキャラクター ID を指定します。id に3を指定するとずんだもんの通常ボイス(ノーマル)で発話します。
 以下のコマンドは、ずんだもん(ノーマル)で「こんにちは。僕の名前はずんだもんです」と発話させます。

ros2 topic pub --once /voicevox_ros2/speaker voicevox_ros2_interface/msg/Speaker "{text: 'こんにちは。僕の名前はずんだもんです', id: 3}"

 Pythonノードでトピックを経由してテキストを発話させるコードを作成したい場合、こちらを参考にしてください。

サービスから発話させる

 ROS2 サービス通信で発話させる場合、/voicevox_ros2/speaker_srvvoicevox_ros2_interface/srv/Speaker 型を使って通信します。以下のサンプルノードを実行すると、サービス通信経由で発話させます。

ros2 run voicevox_ros2 srv

 コマンドからサービス通信で発話させてみましょう。以下のコマンドを実行するとサービス経由で発話できます。

ros2 service call /voicevox_ros2/speaker_srv voicevox_ros2_interface/srv/Speaker "{text: 'サービス通信で発話させるよ', id: 1}"

 データの入力方法はトピックと同じです。Pythonコードでサービス通信をつかって発話させたい場合は、こちらのサンプルコードを参照してください。

API をつかう

 テキストを発話させるだけで導入したい環境に追加のコードを記述するのは大変です。このパッケージには voicevox_ros2_tty モジュールが用意されており、このモジュールをつかって1行で発話させることができるようになります。以下のサンプルコードは voicevox_ros2_tty をつかって発話させる最も単純なコードになります。

#!/usr/bin/emv python3
from rclpy.node import Node
import rclpy
from voicevox_ros2_tts import tts_speaker

if __name__ == '__main__':
   rclpy.init()
   node = rclpy.create_node('vvr2_sample')
   tts_speaker(node, text='こんにちは!これはスピーカーレスポンステストです。生麦生米生卵', id=26)
   rclpy.shutdown()
   node.destroy_node()
from voicevox_ros2_tts import tts_speaker

 で発話パッケージをインポートします。

tts_speaker(node, text='こんにちは!これはスピーカーレスポンステストです。生麦生米生卵', id=26)

で引数 text に発話させたいテキストを入力し、引数 id に発話させたいキャラクター ID を入力します。このとき、引数 node に ROS2 ノードの Node オブジェクトを代入しないとエラーになります。

voice_saver を使う

 voice_saver ノードを実行することで任意の場所に作成した音声ファイルを保存することができます。定型文などを作成するときなどにご活用ください。以下のようにオプション -h をつけるとかんたんな使用方法を表示してくれます。

$ ros2 run voicevox_ros2 voice_saver -h
usage: voice_saver [-h] [-t TEXT] [-i ID] [-p PATH] [-f FILE_NAME] [--speak SPEAK]

options:
  -h, --help            show this help message and exit
  -t TEXT, --text TEXT  必須引数です。発話させたいテキストを入力してください。
  -i ID, --id ID        発話させたいキャラクターIDを選択してください。デフォルトは3です。
  -p PATH, --path PATH  保存先を絶対パスで記述してください。デフォルト値はカレントディレクトリです。
  -f FILE_NAME, --file_name FILE_NAME
                        ファイル名を指定してください。デフォルト名はは output です。拡張子を書く必要はありません。
  --speak SPEAK         保存後その音声ファイルを発話させます。デフォルトは False (無効)です。

 カレントディレクトリに任意のテキストを発話させた音声ファイルを保存させたい場合、いかのように -t をつけて、その後発話させたいテキストを入力してください。

ros2 run voicevox_ros2 voice_saver -t こんにちは!

するとカレントディレクトリに output.wav という音声ファイルが作成されます。このとき、発話キャラクターIDはデフォルトで3になっています。発話させたいキャラを変更する場合は、-i を付与してキャラクター ID を入力してください。
 以下の例ではキャラクターID 2(四国めたん(ノーマル))で発話させた音声ファイルを生成させます。

ros2 run voicevox_ros2 voice_saver -t こんにちは! -i 2

 ファイル名を変更したい場合は、-f で任意のファイル名に設定できます。このとき拡張子を書く必要はありません。以下の例は metran_voice という名前で音声ファイルを生成します。

ros2 run voicevox_ros2 voice_saver -t こんにちは! -i 2 -f metan_voice

 -pを使って保存先のパスを指定することで別の場所に保存させることもできます。このとき入力するパスは 絶対パス で書いてください。

ros2 run voicevox_ros2 voice_saver -t こんにちは! -i 2 -f metan_voice -p /path/to/save/directory

 音声ファイル生成後、その音声をすぐに発音させたい場合は --speak true をつけてください。

ros2 run voicevox_ros2 voice_saver -t こんにちは! --speak true

ファイルが生成されると、以下のようなログが表示されるので、正しいテキスト、保存場所化どうか確認してください。

$ ros2 run voicevox_ros2 voice_saver -t こんにちは!
[INFO] [1708781094.555798150] [voicevox_ros2_core]: start voicevox_ros2 
[INFO] [1708781094.591227469] [voicevox_ros2_core]: Voice Saver info ...
TEXT: こんにちは!
VOICE ID: 3
SAVE FOR: /colcon_ws/output.wav
            
[INFO] [1708781095.238171811] [voicevox_ros2_core]: GENERATE voice
[INFO] [1708781095.257825423] [voicevox_ros2_core]: done.

キャラクターID一覧

 キャラクター ID は以下の表を参考にしてください。

キャラクター名 発話スタイル キャラクターID
四国めたん ノーマル 2
あまあま 0
ツンツン 6
セクシー 4
ささやき 36
ヒソヒソ 37
ずんだもん ノーマル 3
あまあま 1
ツンツン 7
セクシー 5
ささやき 22
ヒソヒソ 38
春日部つむぎ ノーマル 8
雨晴はう ノーマル 10
波音リツ ノーマル 9
玄野武宏 ノーマル 11
喜び 39
ツンギレ 40
悲しみ 41
白上虎太郎 ふつう 12
わーい 32
びくびく 33
おこ 34
びえーん 35
青山龍星 ノーマル 13
冥鳴ひまり ノーマル 14
九州そら ノーマル 16
あまあま 15
ツンツン 18
セクシー 17
ささやき 19
もち子さん ノーマル 20
剣崎雌雄 ノーマル 21
WhiteCUL ノーマル 23
たのしい 24
かなしい 25
びえーん 26
後鬼 人間ver. 27
ぬいぐるみver. 28
No.7 ノーマル 29
アナウンス 30
読み聞かせ 31
ちび式じい ノーマル 42
櫻歌ミコ ノーマル 43
第二形態 44
ロリ 45
小夜/SAYO ノーマル 46
ナースロボ_タイプT ノーマル 47
楽々 48
恐怖 49
内緒話 50
13
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
10