2013年3月24日

【FHC】合成音声をデフォルトからミクさんに変える【健全】


FHCはOpenJtalkを使って音声合成をしているわけなので、音声データは MMD Agent のデフォルト音源(VocaloidのMEIKO)が使われてるぽいです。

MMD Agentだったらミクさんの音声データとかに変えられるんじゃね? というのは結構前から考えてはいました。

ただFHC内でのOpenJtalkが、実行バイナリが見つからないという事もあり、うかつに触らないほうがいいかなと思ってたのでやってなかったのですが、つい最近こうらげ氏(twitter:@courage_courag)がやって動かしたって言うことだったので、便乗犯かましました。
(@rti氏も「バックアップとってやってねー」っていう話だったので、まぁ大丈夫かな。と)

【とりあえずミクさんに声をかけて連れてくる】


以下のURLからミクさんを拾ってきます。


type-α と type-β がありますが、αは少し暗めのミクさん。βは少しあざといミクさんです。(γとδは使ってないんでわからないです。。。)

zipで保存されているので、FHCに移す前に解凍してtarボールにでもしておくのがいいでしょう。
Linuxは以下コマンド(Windowsは知らん)

# cd "Voice TYPE-α"
# tar czvf mmd_miku_alpha.tar.gz Voice/*

【ミクさんをFHCへ連れ込む】

で、FHCに移す。こちらはscpで移すのが簡単そうです。
TeraTermだったらターミナル画面にファイルをD'nD→「scp」。
Linuxだったら以下コマンドで出来ます。(FHCに設定しているIPを192.168.0.10とする)

# scp mmd_miku_alpha.tar.gz sshuser@192.168.0.10:

これでFHCのsshuserユーザホームディレクトリにファイルがコピーされているので、展開してください。

# tar xzvr mmd_miku_alpha.tar.gz

ディレクトリ内にVoiceディレクトリが出来、その中にミクさんの声が入っています。

【ミクさんをあれやこれや弄りまくる】

いわゆるパラメータをいじります。
以下のコマンド一発だけですが。

# echo "-s 48000 -p 200 -a 0.56 -b 0.4 -u 0.0 -jm 0.8 -jf 1.0 -l -z 48000" > Voice/option.txt

【メイコさんはもはや過去の女…】

というわけではないですが、sshuserのホームディレクトリにデフォルトの音声データを退避させます。

# mv /home/rti/naichichi2/naichichi2/config/openjtalk/mei_normal /home/sshuser

音声合成のデータは基本的にmei_normalの中を参照しているようなので、音声データの切り替えを用意にすることも考え、シンボリックリンクを作成します。

# ln -s /home/sshuser/Voice /home/rti/naichichi2/naichichi2/config/openjtalk/mei_normal

シンボリックリンクにしたのでメイコさんといつでもチェンジすることができます。

【FHCから声で切り替えられるようにする】

会話シナリオを作ります。

「会話シナリオ設定を行う」→「新規作成」→適当に名前入力(自分はswitch_voice.js)

テンプレの初期コードを消して以下のコードを上書きします。


//-------------switch_voice.js ここから-------------//

function main()
{
onvoice("みくさんにちぇんじ"
,function(e){
speak("みくさんをよびます");
kernel_execute_local("rm /home/rti/naichichi2/naichichi2/config/openjtalk/mei_normal")
kernel_execute_local("su sshuser -c 'ln -s /home/sshuser/Voice /home/rti/naichichi2/naichichi2/config/openjtalk/mei_normal'")
}
)
onvoice("めいちゃんにちぇんじ"
,function(e){
speak("めいちゃんをよびます");
kernel_execute_local("rm /home/rti/naichichi2/naichichi2/config/openjtalk/mei_normal")
kernel_execute_local("su sshuser -c 'ln -s /home/sshuser/mei_normal /home/rti/naichichi2/naichichi2/config/openjtalk/mei_normal'")
}
)
onvoice("さいきどうして"
,function(e){
kernel_execute_local("killall naichichi2_client");
}
)
}

//-------------switch_voice.js ここまで-------------//

セーブして実行。で切り替わるようになります。

上記設定であれば、「コンピュータ、ミクさんにチェンジ」といった後に「コンピュータ、再起動して」と呼びかければFHCが再起動され、再起動後にミクさんに変わっているはずです。

こんな感じで無事健全に切り替えをすることが出来るようになりましたが、念の為バックアップはとっておいてください。あと、当たり前ですが僕は責任を撮りませんのであしからず。