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_srv
に voicevox_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 |