#analog
#norelated
#contents
* 音声合成させてみる。 [#qcd2d89a]

基本的に普段画面は繋げていないので、何かがあった場合に知らせる手段としては、音による通知が良い手段なのかなと。~
ただ何か音を鳴らすだけでは情報が少ないので、ここは日本語を喋ってくれるようにしてみたいと思います。~

スピーカは別のところに置いて、決まった時間にその日の予定を喋らせたり、子供に学校の準備を促したりするために、bluetoothでの接続をすることにします。~

というわけで、AmazonでBluetoothアダブタの[[BT-MICRO4:http://www.amazon.co.jp/exec/obidos/ASIN/B0071TE1G2/shella0x19-22]]と、[[ワイヤレスオーディオレシーバー:http://www.amazon.co.jp/exec/obidos/ASIN/B00EC4XGF6/shella0x19-22]]を購入しています。~
また、ダイソーでオーディオレシーバーにつける安スピーカーを買っています。~
Bluetooth接続のスピーカーとかを見ると、結構な値段がしますし、バッテリー搭載で充電中は使えなくなるので、この組み合わせくらいがコストパフォーマンスがいいのかなと。~

と思ったのですが、ダイソーのスピーカーは全然音が出なくて使い物になりませんでした……。~
Seriaのちょっと大きめの100円スピーカーの方がいい感じです。~
あと、Seriaには、単4電池2本を入れて出力をブーストするやつも売っているので、この辺りを使うのもいいかもしれません。~
音は悪いですけどねー。~

** bluetoothオーディオ [#af608f68]

まずはbluetoothの各種パッケージをインストールします。~

 sudo apt-get install bluetooth bluez-utils blueman

bluetoothはBluetooth用ツールとデーモン、bluez-utilsはドライバアップデートみたいなもん、bluemanはGUIの管理ユーティリティという感じですかね。~
パッケージの取得に失敗するような場合は、「sudo apt-get update」しなおしてみてください。~
入ったら、念のためreboot。~

リモートデスクトップでGUIにログインし、設定のところにあるBluetoothマネージャーを起動します。~
が、なぜかここで一度ではちゃんと画面が出ませんでした……。~

一度、システムツールのタスクマネージャーから、blueman-appletを終了されてから、再度Bluetoothマネージャーを起動すると、画面が開きました。~
何が悪いのかな……。~

画面が開いたら、オーディオレシーバーを電源に繋いで、検索ボタンを押すと、画面にレシーバーが現れます。~

#ref(search.png,left,nowrap,検索)

繋ごうとした時の設定は、ヘッドセットサービスじゃないと繋がらないようでした。~
ヘッドセットサービスを選択して次へ。~

#ref(headset.png,left,nowrap,ヘッドセットサービス)

ペアリングは、「0000」で繋がります。~

#ref(pairing.png,left,nowrap,ペアリング)

そして繋がると、インジケータが表示されるようになります。~
これでとりあえずは繋がったという状態ですね。~

#ref(btconnect.png,left,nowrap,接続)

ここで出ている16進数のアドレスは次で使うので、メモっておく等しましょう。~

----

次に、オーディオデバイスとして使えるように設定します。~
piユーザのhomeフォルダに、.asoundrcというファイルを作成して、以下のように記述しておきます。~

 pcm.!default{
 	type bluetooth
 	device "00:1F:8E:D3:96:BE"
 }

deviceに記述しているのは、先ほどのアドレスです。~
基本的に全ての音をこのオーディオデバイスから出すつもりなので、デフォルト記述をbluetoothにしています。~

次に、「/etc/bluetooth/audio.conf」に以下の記述を追加します。~

 [General]
 Enable=Source,Sink,Headset,Gateway,Control,Socket,Media
 AutoConnect=true

今回必要なのは、Headsetだけのような気もしますが、色々使えるようにしておきます。~
さらに自動で接続出来るようにします。~
ここで念のためreboot。~

RaspberryPiが起動したのを見計らって、オーディオレシーバーも電源に繋ぐと、自動的にペアリングされて、音が出せるようになりました。~
同時に電源を入れて起動するとダメみたいです……。~
オーディオレシーバーは後から電源をいれないと、ちゃんとペアリングしませんでした。~

「/usr/share/sounds/alsa」の中あたりに、wavファイルがあったりしますので、これで鳴らしてみます。~

 aplay /usr/share/sounds/alsa/Front_Left.wav

一応鳴るには鳴るんですが、先頭がちょっと途切れる感じです。~
連続で鳴らせば大丈夫なんですが……。~

これはもう、そういうもんだと諦めて、無音をちょっと流してから本来鳴らしたいものを出力するとかするべきなのかな?~
何はともあれ、とりあえず音は鳴るようになったので、次のステップへと進みます。~

** OpenJTalk [#fb195fec]

このあたりは、以下のサイトを参考にさせてもらいました。~
- [[Raspberry Piに喋らせる:http://shokai.org/blog/archives/6893]] -- 橋本商会
- [[Raspberry Piでミクにしゃべらせよう:http://pawafuru.com/pg/381.html]] -- ぱわふる

OpenJTalkを動かすのに必要な、各種パッケージをインストールします。~

 sudo apt-get install open-jtalk open-jtalk-mecab-naist-jdic htsengine libhtsengine-dev hts-voice-nitech-jp-atr503-m001

OpenJTalk本体と辞書データ、音声合成エンジンとライブラリ、サンプルの男声データになります。~

で、さっそくちょっとスクリプト組んで喋らせてみたんですけど、前述のように先頭が途切れるので、2〜3文字分が欠けて聞こえてしまいます。~
なので、&ref(silence.wav,left,nowrap,1秒の無音音声ファイル);を作って、発話前にこれを再生するようにしました。~
発話しようとしてからは、文章の音声への変換+無音の1秒分待たされることになりますが、そんなにレスポンスを求めるものでもないので、とりあえずこれでしばらく使ってみることにします。~

というわけで、先ほどの無音音声ファイルを「/usr/local/share/sound」に配置して、「/usr/local/bin」に「jsay」スクリプトを作成します。~
実行権限をつけるのを忘れずに。~
内容は以下の通りです。~

 #!/bin/sh
 TMP=`mktemp -t`
 
 VOICEDIR="/usr/share/hts-voice/nitech-jp-atr503-m001"
 DICDIR="/var/lib/mecab/dic/open-jtalk/naist-jdic"
 SILENTWAV="/usr/local/share/sound/silence.wav"
 
 echo "$1" | open_jtalk \
 -x ${DICDIR} \
 -td ${VOICEDIR}/tree-dur.inf \
 -tm ${VOICEDIR}/tree-mgc.inf \
 -tf ${VOICEDIR}/tree-lf0.inf \
 -tl ${VOICEDIR}/tree-lpf.inf \
 -md ${VOICEDIR}/dur.pdf \
 -mm ${VOICEDIR}/mgc.pdf \
 -mf ${VOICEDIR}/lf0.pdf \
 -ml ${VOICEDIR}/lpf.pdf \
 -dm ${VOICEDIR}/mgc.win1 \
 -dm ${VOICEDIR}/mgc.win2 \
 -dm ${VOICEDIR}/mgc.win3 \
 -df ${VOICEDIR}/lf0.win1 \
 -df ${VOICEDIR}/lf0.win2 \
 -df ${VOICEDIR}/lf0.win3 \
 -dl ${VOICEDIR}/lpf.win1 \
 -em ${VOICEDIR}/tree-gv-mgc.inf \
 -ef ${VOICEDIR}/tree-gv-lf0.inf \
 -cm ${VOICEDIR}/gv-mgc.pdf \
 -cf ${VOICEDIR}/gv-lf0.pdf \
 -k ${VOICEDIR}/gv-switch.inf \
 -s 16000 \
 -a 0.05 \
 -u 0.0 \
 -jm 1.0 \
 -jf 1.0 \
 -jl 1.0 \
 -ow $TMP && \
 aplay --quiet ${SILENTWAV} && \
 aplay --quiet $TMP
 
 rm -f $TMP

** MMDAgent用ミク音響モデル [#zfea2d19]

さて、デフォルトの声ではあんまりにも色気がないので、娘(6歳)も息子(2歳)も知っている我らが初音ミクの声に置き換えることにします。~
そのために、[[MMDAgent:http://www.mmdagent.jp/]]というソフトの音響モデルを使用します。~

[[MMDAgent:http://www.mmdagent.jp/]]は、[[MikuMikuDance:http://www.geocities.jp/higuchuu4/]](で作ったモデルやモーション)とOpenJTalk、音声認識エンジンの[[Julius:http://julius.sourceforge.jp/]]等を組み合わせた、一つのシステムです。~
なので、ここで使われているミク用の音響モデルが、OpenJTalkでそのまま使えるというわけですね。~

[[MMDAgent & Project-NAIP wiki:http://cube370.wiki.fc2.com/]]さんが、ミクの自作音響モデルを公開されていますので、TYPE-α、TYPE-β共にダウンロードしておきます。~
そして、「/usr/local/share」に「hts-voice」ディレクトリを作成して、それぞれ解凍したVoiceフォルダを、Miku-A、Miku-Bとして配置しておきます。~

あとは、前述のスクリプトのVOICEDIRの指定を、それぞれのものに置き換えればOKです。~

 jsay あいうえおー

とかで喋ります。~
が、なんか変に反響した音が一緒になってる感じがあるなー。~
イヤホンで聞くと特に酷いですが、これに関しては直し方がわからないのでとりあえずは放置……。~

----

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS