Open JTalkで初音ミクの声でおしゃべりさせる on Mac/Linux/Raspberry Pi

f:id:karaage:20160704223328j:plain:w640

2017/06/11 デフォルトの声でおしゃべりさせる方法と他の音響モデルファイルへのリンクを追加
2016/12/15 Mac向け説明を追記

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というファイルが生成されたら成功です。

ミクさんの音響モデルを所定の場所にコピー

 最後に、音響モデルを所定の場所にコピーしてやる必要があります。

 Linux/Raspberry Piの場合は、作成したVoice.htsvoiceというファイルをLinux/Raspberry Piマシンに移動してやりましょう。移動の仕方はここでは省略します。USBメモリ使うなり、ftp/scp使うなりして移動下さい。そして、Voice.htsvoiceと同じディレクトリに移動して、以下コマンド実行して音響モデルを所定の位置に配置します。

$ sudo mkdir /usr/share/hts-voice/miku
$ sudo cp Voice.htsvoice /usr/share/hts-voice/miku/miku.htsvoice

 Macの場合は、作成したVoice.htsvoiceと同じディレクトリに移動した後、以下コマンド実行して音響モデルを所定の位置に配置します。

$ mkdir /usr/local/Cellar/open-jtalk/1.09/voice/miku
$ cp miku-alpha.htsvoice /usr/local/Cellar/open-jtalk/1.09/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

ふつうのおっさんの声でおしゃべりさせる

 参考までに、普通のおっさんの声で再生する方法です。ミクさんの声でおしゃべりさせるプログラムの8行目を以下のように書き換えるだけです。

htsvoice=['-m','/usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice']↲

 以下実行すると、おっさんの声で日時を教えてくれます。

$ python jtalk.py

まとめ

 音響モデルの変換等、意外に大変でした。音響モデル、公開されているだけで十分ありがたいのですが、可能なら緩めのライセンスでGitHub等ダウンロードしやすいところで公開してもらえると、もっと多くの人が幸せになれるのなぁと思ったり。

 これでミクさんの声でおしゃべりさせることができるようになったので、あんなことやこんなことに使ってみたいと思います。

 ミクさん以外の声だと、以下のリンク先で、他の音響モデルファイル(htsvoice)を公開しているサイトがまとめられていたので、こちらを試してみるのもよいかもしれません。

Open JTalk の音響モデルを試す::まほろば

参考リンク

OpenJTalk + python で日本語テキストを発話 - Qiita

自作音響モデル - MMDAgent & Project-NAIP wiki

橋本商会 » Raspberry Piに喋らせる

Open jTalkで実験!初音ミクボイスでテキスト読み上げ! | もブログ!

音声合成させてみる - AVR・ARM等々 覚え書き

Open JTalkでメイちゃんにしゃべってもらう - 人工知能に関する断創録