読者です 読者をやめる 読者になる 読者になる

karaage. [からあげ]

からあげに勝手にレモンをかけたらエンドレスレイン(紅)

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

電波

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

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

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

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

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

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