Raspberry Piでミクさんの声を使いたい!
以前Raspberry Piで音声認識や音声合成をやっていました。
そのときは、手軽に使えるのと、ゆっくりっぽい声が好きだったので音声合成にはAquestalk Piを使っていました。
ただ、もうちょいかわいい声で喋って欲しいなと思って調べていたら、なんとOpen JTalkというフリーの音声合成ソフトで初音ミクの音声モデルが使えるというではないですか!Aquestalk Piはライセンス微妙にいやらしいし、これは使うっきゃないと思って早速トライしてみました。
結構参考サイトたくさんあるし、すぐできるだろうと思っていたら、例によって色々微妙にハマって思ったより大変でしたのですが、Raspberry PiだけでなくLinuxやMacでもミクさんの声でしゃべってもらうことができるという思わぬ(?)副作用もありました。作業手順残しておくので、興味ある方は参考にしてください。
ミクさんの声でおしゃべりさせる方法
Raspberry Piは以下記事参考にセットアップください。
LinuxやMacは特別準備は必要ないかと思います。LinuxはUbuntu 14.04。MacはOS X Yosemite 10.10.5で試しました。
以降は上記記事の基本的なセットアップが完了していることが前提の説明となります。
Open JTalkインストール
LinuxとRaspberry Piは以下1行で完了。楽々ですね。
$ sudo apt-get install open-jtalk open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001
Macの場合はHomebrewで以下1行でインストールできます。
$ brew install open-jtalk
ミクさんの音響モデルダウンロード
以下のサイトから音響モデルをダウンロードできます。
このファイルはWindowsかMacで変換する必要があるので、WindowsかMacのどちらかでダウンロード下さい。解凍したフォルダの中にあるVoice
というフォルダを使用します。
ミクさんの音響モデル変換
ここからが面倒くさいです。Open JTalkのバージョンが変わった関係で、ミクさんの音響モデルのフォーマットを.htsvoice
形式に変換してやる必要があるようです。Windowsの場合は、以下からソフトダウンロードして、先ほどのVoice
フォルダをドラッグ&ドロップで変換してくれるようです(未確認)。
Macしか持ってない!詰んだ!と思っていたら、Macのやり方を解説して下さっている人がいました。神!
以下は、上記サイト参考に実施しました。
まずは、monoというライブラリをインストール。参考サイトはport
を使っていますが、私はHomebrew
でインストールしました。
$ brew install mono
次に以下コマンドで変換ソフトに付属しているソースコードをコンパイル。
$ mcs htsvconv.cs
これで同じフォルダにhtsvconv.exe
という実行ファイルが生成されます。
ミクさんの音響モデルのVoice
というフォルダをhtsvconv.exe
と同じフォルダにコピーします。そして、以下を実行
$ mono htsvconv.exe ./Voice
Voice.htsvoice
というファイルが生成されたら成功です。
次にこのVoice.htsvoice
をRaspberry Piに移動しましょう。移動の仕方は説明が難しいので省略します。sftpやUSBメモリのコピー等好きな方法を選択ください。
後は、以下実行して、音響モデルを所定の位置に配置します。
$ sudo mkdir /usr/share/hts-voice/miku
$ sudo cp Voice.htsvoice /usr/share/hts-voice/miku/miku.htsvoice
これでようやく下ごしらえが完了。
おしゃべりさせる
おしゃべりさせるプログラムを作成します。といっても、以下を参考に、音響モデルのリンク先のみ変更しただけです。
以下のファイルをjtalk.py
という名前で保存します。
# -*- coding: utf-8 -*- import subprocess from datetime import datetime def jtalk(t): open_jtalk=['open_jtalk'] mech=['-x','/var/lib/mecab/dic/open-jtalk/naist-jdic'] htsvoice=['-m','/usr/share/hts-voice/miku/miku.htsvoice'] speed=['-r','1.0'] outwav=['-ow','open_jtalk.wav'] cmd=open_jtalk+mech+htsvoice+speed+outwav c = subprocess.Popen(cmd,stdin=subprocess.PIPE) c.stdin.write(t) c.stdin.close() c.wait() aplay = ['aplay','-q','open_jtalk.wav'] wr = subprocess.Popen(aplay) def say_datetime(): d = datetime.now() text = '%s月%s日、%s時%s分%s秒' % (d.month, d.day, d.hour, d.minute, d.second) jtalk(text) if __name__ == '__main__': say_datetime()
以下実行すると、ミクさんの声で日時を教えてくれます。
$ python jtalk.py
まとめ
音響モデルの変換等、意外に大変でした。音響モデル、公開されているだけで十分ありがたいのですが、可能なら緩めのライセンスでGitHub等ダウンロードしやすいところで公開してもらえると、もっと多くの人が幸せになれるのなぁと思ったり。
これでミクさんの声でおしゃべりさせることができるようになったので、あんなことやこんなことに使ってみたいと思います。応用例はまたいずれ。
参考リンク
OpenJTalk + python で日本語テキストを発話 - Qiita
自作音響モデル - MMDAgent & Project-NAIP wiki