ディープラーニングとやらの力をお借りして喋らせるやつの力をお借りして喋るROS2パッケージをババーっと作った
この記事はROS2アドベントカレンダー2022,12/14(つまり昨日)の記事です.
ROS2のカレンダー | Advent Calendar 2022 - Qiita
遅れてすみません.
はじめに
ロボコンに出ました.ロボットを喋らせました.
Unfortunately our robot could not restart for the last challenge of WRS FCSC Trial at #IROS22, because of a damaged power line. We are glad to have the opportunity to demonstrate our manipulation system at the exhibition.
— Cross Progress (@CrossProgress) 2022年10月26日
Many thanks for cheering our challenge! pic.twitter.com/VKpUuG2hCQ
これはこれでロボットらしくて良かったです.
でも大会終わって思ったんですよ,もうちょっと流暢に喋らせたいなって.
で,作りました.
ディープラーニングとやらの力をお借りして喋らせるやつの力をお借りしてしゃべるROS2パッケージを!
今回はこれを作った話について書こうと思います.
下調べ
まず,今どんな喋るROSパッケージがあるのか調べてみました.
ロボコンで使ったのはこれです.お世話になりました.
知り合いが作ってるパッケージも見つけました.
よく見たらこちらの方が少し世に出たのが早いんですね.
きっと作者の方は思ったのでしょう,「なければ作れば良いのでは」と
他にも色々見てみましたが,バックエンドがespeak系だったり最近のイケてそうな声が出せそうなROS(2)パッケージはありませんでした.
なければ作れば良いのでは
という訳で僕も作り始めました.
バックエンドはVOICEVOXを使うことにしました.
VOICEROIDやVOICEPEAKも見ていたんですが,せっかく作るからには色々な人に使ってもらえるようにしたかったので有料の壁はやっぱり高かったです.(ごめんなさい)
その点,VOICEVOXは無料しかも商用利用可でここまで高品質な話し声を出せるのは素直にすごいと思いました.(ちゃんとマネタイズできてるのか気になってくる社会人1年生であった)
探していると,なんとDockerコンテナも提供されていてなんとまぁ使いやすいことでしょう!
https://hub.docker.com/r/voicevox/voicevox_engine
共通化
早くパッケージを作りたい気持ちを抑えて,ふと思いました
GitHub - ActiveIntelligentSystemsLab/japanese_tts_ros: 日本語テキストを音声として出力するROS node
GitHub - hakuturu583/openjtalk_ros: ros bridge for openjtalk
はじめに出てきたこの2つのパッケージ,めちゃめちゃ似ているんですよね.
よく考えたらそれもそう,音声合成で喋らせるROSパッケージって
- 合成音声エンジンに音声合成をさせる
- 出てきた音声ファイルを再生する
をやっているだけなんですよね.
このまま,僕が上の2つのパッケージを参考にしてまた似たようなパッケージを作ってもいいかもしれません.
でも基本のところが同じなら1つのパッケージで色々な合成エンジンを切り替えられると楽しいんじゃないかと思ったわけです.
プラグイン化計画
さて,色々なエンジンを切り替えるとなると,まずは各エンジンに対して音声合成させる部分をプラグインに切り出す.
そして,共通処理を扱う母艦プログラムを作れば,あとは母艦プログラムに好きなプラグインを差し込めばいけそうな気がしてきました.
イメージはこんな感じ
という訳でできたのがこちら!
設計は甘いとは思いますが,なにせ基本の音声合成の手順が単純なのでこれでも色々な音声合成エンジンに対して簡単にプラグインを実装できるようになったのではないかと思います.
OpenJTalkプラグイン
母艦プログラムができてもプラグイン実装がないとこのプログラムは喋りません.
まずは試しにOpenJTalkのプラグインを作ってみました.
自分が作ったプログラムを通して聞く音声はなんだか少し温かみがある気がしました(寝ろ
VOICEVOXプラグイン
さて,待ちに待ったVOICEVOXプラグイン.
遠回りが過ぎましたが準備はバッチリであとはこれを実装するのみです!
VOICEVOXはどうやらDockerコンテナを立ち上げると,HTTPのAPIサーバーが立ち上がってそれを叩けば音声合成ができるようです.
今回はC++でプログラムを作るのでMicrosoftのC++ REST SDKというライブラリを使ってAPIを叩くことにしました.
このライブラリのクセがなかなか強くて途中ちょっと苦労もしましたが, 無事出来上がったのがこちらです!
おお,喋る!!
実装終わったのは昨日(12/14)の夜,それも仕事のミーティングが長引いて疲れ果てていましたが,流石にちょっと感動しました.
(その後,頭の死んでいた僕はTwitterのTLに流れて来るツイートを読ませてひとしきり遊びました.)
このリポジトリのREADMEだけはしっかりと書いたので是非みなさんも試してみてください!
あ,ROS2 Humbleでしか動作確認していないので気をつけてくださいね.
動かなかったりしたらIssue・プルリク待ってます.
最後に
ふとした思いつきをババーっとプログラム書いて,ババーっとこうして記事に書きましたがやっててとても楽しかったです.
こんな雑な記事を書くのもはじめてでしたが,こういうスピード感ある記事執筆もアドカレ感が出ていいなと思いました.
プログラムは色々雑ですが,それでも基礎部分は割といい感じに設計したつもりです. これからも雑な部分は少しづつ直していこうと思いますので,使ってみたり,別のプラグイン作ったよ〜って人は是非教えてほしいです.泣いて喜びます.