自分がTAとして担当する講義でNICTの杉浦孔明さんが人工知能/機械学習/ロボット対話などについて講演してくださって、中でも"rospeex"というのが気になったので、忘備録としてここに書いておく。
タイトル通り、Pythonでクラウド音声合成エンジンを使う。
というのも、このクラウド音声合成エンジンは今年の夏の第31回 日本ロボット学会 学術講演会で杉浦さんが発表された「非モノローグ音声合成」のことで、超高品質な音声合成(しかも、マニア?オタク?が喜びそうな感じのアニメ声)がクラウドで利用できるというもので、いわゆるクラウドロボティクスであるとか、携帯端末で動くような対話システムにはうってつけのシステムである。
件の「非モノローグ音声合成」については、このサイトで実際に音声合成を試すことができる。
TTS demo
どことなく初音ミクっぽい。
「非モノローグ音声合成」こと"rospeex"というのはなんなんだよ、という話ですが、これを説明するためにはまず"ROS"について説明が必要です。
"ROS"とは"Robot Operating System"のことで、簡単に言うとロボットを動かすための基盤となるシステムを意味します。*2
この"ROS"の存在を知ったところで、"rospeex"について説明します。
"rospeex"は先述の"ROS"で利用するために作られた音声対話ツールキットで、つまるところ「ロボットとより柔軟に音声対話を行うためのサービス」です。
こういった音声対話を行うためのツールキットは"ROS"内に限らずいくら*3かあるのですが、この"rospeex"の凄いところは、クラウドベースで作られているということで、つまりマシンによらず再生・録音環境があればこのツールキットを容易に利用できるという点にあります。
また、他のシステムへの流用も容易*4で、今使っている音声合成エンジンの代わりとしてすぐに利用できます。
で、実際に今使っている音声合成エンジン(OpenJTalk)から"rospeex"に乗り換えてみました。
今まで使っていた音声合成エンジンはクラウドベースではなくスタンドアローンなので、当然パソコンまたはロボット内にエンジンをインストールしておく必要があります。
音声合成エンジンのインストールにどのくらい労力がかかったかは特に明記しませんが、だいたい以下の記事等を参考にインストールします。
id:aidiary
Open JTalkで音声合成 - 人工知能に関する断創録
OpenJTalkを使ってみる。
(すみません、敬称略です)
で、インストールしたうえで、簡単に音声合成エンジンを呼び出すためのスクリプトを用意しておきます。
だいたいこういう感じ。
#!/bin/sh TMP=/anywhere/out.wav touch $TMP cd /anywhere/hts-voice/nitech-jp-atr503-m001 #cd /anywhere/hts-voice/mei_happy echo "$1" | open_jtalk \ -td tree-dur.inf \ -tf tree-lf0.inf \ -tm tree-mgc.inf \ -md dur.pdf \ -mf lf0.pdf \ -mm mgc.pdf \ -dm mgc.win1 \ -dm mgc.win2 \ -dm mgc.win3 \ -df lf0.win1 \ -df lf0.win2 \ -df lf0.win3 \ -dl lpf.win1 \ -ef tree-gv-lf0.inf \ -em tree-gv-mgc.inf \ -cf gv-lf0.pdf \ -cm gv-mgc.pdf \ -k gv-switch.inf \ -s 16000 \ -a 0.05 \ -u 0.0 \ -jm 1.0 \ -jf 1.0 \ -jl 1.0 \ -x /anywhere/lib/mecab/dic/open-jtalk/naist-jdic \ -ow $TMP && \ aplay --quiet $TMP
単純に音声合成エンジンを呼んできて、引数で与えられたテキストを指定のパラメタで読み上げてwavファイルで保存するだけですね。
なので、"$./tts.sh 奈良先端科学技術大学院大学へようこそ"みたいな感じで呼ぶと、指定(TMP)の場所に"out.wav"という読み上げ音声が保存されます。
同じことを"rospeex"でやるときはどうするのかというと、適当にjsonとwavが扱えてURLを開けるライブラリのある言語*5を持ってきて、サンプルを参考にちょっとコードを書くだけ。例えばこんな感じ。
# -*- coding: utf-8 -*- import sys import string import base64 import urllib2 import json import wave tts_url ='http://rospeex.ucri.jgn-x.jp/nauth_json/jsServices/VoiceTraSS' # main if __name__=='__main__': message = sys.argv[1] # command tts_command = { 'method':'speak', 'params':['1.1', {'language':'ja','text':message,'voiceType':"*",'audioType':"audio/x-wav"}]} obj_command = json.dumps(tts_command) req = urllib2.Request(tts_url, obj_command) received = urllib2.urlopen(req).read() # extract wav file obj_received = json.loads(received) tmp = obj_received['result']['audio'] # extract result->audio speech = base64.decodestring(tmp.encode('utf-8')) f = open ("out.wav",'wb') f.write(speech) f.close
私たちのやりたいことは大抵作っている側にはお見通しで、ドストライクなサンプルコード(というか、これサンプルコードがなくても仕様が分かっていれば5分くらいで書けるんじゃないだろうか、と思えるほどの明瞭設計)があって、それを利用していける。
これも"$Python tts.py 奈良先端科学技術大学院大学へようこそ"みたいな感じで呼ぶと、"out.wav"が保存される。(Pythonは音声の再生はちょっとだけ面倒くさいので、その場ですぐ読み上げをするコードは割愛する。)
で、実際に読み上げ音声を作ってみたので、両方ともおいておく。(音声ファイルのアップロードに問題がありましたらご連絡ください、よろしくお願いいたします。)
"rospeex"で「奈良先端科学技術大学院大学へようこそ」
"openjtalk"で「奈良先端科学技術大学院大学へようこそ」
設定の問題もあるけど、音声のこもり具合や音のつながりの滑らかさなども"rospeex"はとても良くて、聞いていてなんだか楽しい気持ちになります。(同期は「早見沙織の声だったらもっと良かった」と言っていた)
また、合成にかかる時間も結構違うようで、試しにtimeしてみたところ、以下のような感じになりました。
$ time OpenJTalk 奈良先端科学技術大学院大学へようこそ
real 0m5.530s
user 0m0.096s
sys 0m0.020s
$ time rospeex 奈良先端科学技術大学院大学へようこそ
real 0m0.774s
user 0m0.028s
sys 0m0.012s
面倒くさくて一回しか測っていないため、どっちがどうこう言う立場ではないのですが、使用感としてrospeexは文章の長さによらずすぐに処理が終わります。やっぱりクラウドの利点を生かして強力なサーバで動いているんでしょうか?この品質をこの時間で提供できるのはやはりクラウドの強みのように思えます。
まとめ
長々と色々書いたけど、結局言いたいのは「rospeex凄い!」というのと「これからはクラウドの時代だなぁ、と改めて感じた」というもの。
こういうすぐに使えるクラウドベースのサービスは、今後自分のシステムないし対話システムをいろいろな環境で動かすうえで必要になるだろうし、十分理解しておきたいと思った。
あと、対話システムそのものをクラウド化するというのも今まさにやっている最中なので、さっさと終わらせてなんかのロボットに載せて動かしてみたい。
今日の講義は楽しかった。杉浦さん、中村先生、ありがとうございました。
*1:画像引用:[http://www.crypton.co.jp/mp/pages/prod/vocaloid/cv01.jsp:title]
*2:もう少し詳しく書くと、"ROS"はロボットに必要なハードウェアの抽象化、低レイヤーデバイスの制御、およびプロセス間通信や組み込み向けの関数群、パッケージ管理などを内包しているオープンソースのOSです。つまり、ロボットを作るときに他の人が使っている環境を一瞬で再現できて、しかも、役に立ちそうな便利な機能は大体入っていて、さらに言えば、他のソフトウェア・ツールをROSのパッケージにインストールするのも簡単一発でできちゃう優れもの的なシステムです。:もし間違っていたら教えてください。
*3:OpenHRIとかHARKとか
*4:杉浦さんは「できればロボットで使ってくれた方がうれしい」とおっしゃっていましたが
*5:PythonとかPythonとかPythonとか