Raspberry piで日本語音声合成(Open JTalk)を試してみる。

#はじめに
この記事は、[関西おうちハック](https://www.facebook.com/groups/kansai.ouch.hack)の[イベント](https://kansaiouchihack.doorkeeper.jp/events/38473)にて試作した入館・入退室管理システムにて（以下の写真参照）、音声を出力するために日本語音声合成(Open JTalk)をRaspberry piで動作させるまでの方法をまとめたものです。
![image](https://qiita-image-store.s3.amazonaws.com/0/51272/3baa3dd2-ebfd-531a-c92a-d1689ade3f3a.png)


#音量の設定
まずはサウンド周りの設定を行います。

音量だけを設定したい場合は、デフォルトで入っているGUIの`alsamixer`が便利です。

```
$ alsamixer
```

![image](https://qiita-image-store.s3.amazonaws.com/0/51272/92e66034-bc77-ba94-a659-de7b76e682b2.png)

#サウンド関係の設定
細かい設定は、`amixer`を使います。

##現在の設定内容

###各コントロールのid確認

```
$ amixer controls
```

と入力すると以下のような情報が表示されます。

```
numid=3,iface=MIXER,name='PCM Playback Route'
numid=2,iface=MIXER,name='PCM Playback Switch'
numid=1,iface=MIXER,name='PCM Playback Volume'
numid=5,iface=PCM,name='IEC958 Playback Con Mask'
numid=4,iface=PCM,name='IEC958 Playback Default'
```

`numid`は`amixer`で指定する各コントロールのidとなります。
上記の例ですと、`PCM Playback Route`である`numid=3`が実際の出力先のコントロールを示します。
`PCM Playback Volume`である`numid=1`は、ボリュームの設定を行うためコントロールのidになります。
以降では、`numid`は上記の設定であることを前提に記載します。

###出力先設定の確認

```
$ amixer cget numid=3
```

と入力すると、現在の出力先設定が確認できます。

```
numid=3,iface=MIXER,name='PCM Playback Route'
  ; type=INTEGER,access=rw------,values=1,min=0,max=2,step=0
  : values=1
```

現在の出力先設定は、`values`の値から1(アナログ出力）とわかります。
0だと自動、2だとHDMIという意味です。

###ボリューム設定の確認

各コントロールの情報取得は、`cget`と`numid`を指定して行います。
ボリュームのコントロールは`numid=1`なので、

```
$ amixer cget numid=1
```

と入力すると、現在のボリューム設定が表示されます。

```
numid=1,iface=MIXER,name='PCM Playback Volume'
  ; type=INTEGER,access=rw---R--,values=1,min=-10239,max=400,step=0
  : values=-925
  | dBscale-min=-102.39dB,step=0.01dB,mute=1
```

上記から、設定できるボリュームの最小値は-10239、最大値は400、現在の値は-925ということがわかります。

##設定の変更

###コントロールの優先度の設定

```
$ amixer cset numid=3 1
```

とすると優先する出力先を1（アナログ）に設定します。

###ボリュームの設定

```
$ amixer cset numid=1 50%
```

とするとボリュームを50%に設定できます。

###設定の保存

再起動時にも設定を保持したい場合は、

```
$ sudo alsactl store
```

と入力します。

#スピーカーの選定

スピーカーは１００均で入手したアンプなしのものと、
![image](https://qiita-image-store.s3.amazonaws.com/0/51272/f6027a00-4127-7ea2-4232-e88be88b0a9f.png)

小型でアンプ付きの[Audio Technica製 AT-SPP30](https://www.audio-technica.co.jp/atj/show_model.php?modelId=779)を試してみました。
![image](https://qiita-image-store.s3.amazonaws.com/0/51272/deee5cdd-e512-ce9b-a438-3100f10f03a5.png)

ボリュームは100%にして試してみました。

結論ですが、100均で入手したアンプなしでは全然音量がたりませんでした。
AT-SPP30は100均よりスピーカーの口径が大きいので100均よりは音量がありますが、やはりアンプなしでは実用には耐えられないと思います。

#日本語音声合成システム(Open JTalk)のインストール

日本語音声合成システムは、[Open JTalk](http://open-jtalk.sourceforge.net/)を使用しました。
Open JTalkのデモは[こちら](http://open-jtalk.sp.nitech.ac.jp/)から。

まずは本体のインストール。

```
$ sudo apt-get install open-jtalk
```

![image](https://qiita-image-store.s3.amazonaws.com/0/51272/353276c5-e08e-9de4-5261-6887c8741c33.png)

その中で、`open-jtalk-mecab-naist-jdic`と`hts-voice-nitech-jp-atr503-m001`が提案パッケージ(Suggested packages)と表示されてます。次にこの２つをインストールします。

```
$ sudo apt-get install open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001
```

これで準備は完了です。

#Open JTalkを使ってみる
先ほどインストールした、`hts-voice-nitech-jp-atr503-m001`に含まれる音声`nitech-jp-atr503-m001`を使って実行してみます。

まず、しゃべらせたい言葉を`voice.txt`に書きます。今回は、以下にします。

```voice.txt
こんにちは、はじめまして。
```

その後、コマンドを実行して、音声ファイルを作ります。今回は`test.wav`とします。

```
$ open_jtalk -m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice -x /var/lib/mecab/dic/open-jtalk/naist-jdic -ow test.wav voice.txt
```

成功すると、`test.wav`というファイルができていますので、

```
$ aplay test.wav
```

でちゃんと再生されれば成功です。

毎回、同じコマンドを打つのも面倒なので、[こちら](https://gist.github.com/shokai/2892965#file-jsay)を参考にスクリプトを作成いたしました。
※元のスクリプトは古い音声フォーマットのパラメータ指定だったため、そこを変更しています。

```jsay.sh
#!/bin/sh
TMP=/tmp/jsay.wav
echo "$1" | open_jtalk \
-m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice \
-x /var/lib/mecab/dic/open-jtalk/naist-jdic \
-ow $TMP && \
aplay --quiet $TMP
rm -f $TMP
```
`jsay.sh`に実行権をつけて、

```
$ chmod 755 jsay.sh
```

実行すれば再生されます。

```
$ ./jsay.sh こんにちは
```

#女性の声に変えてみる

`nitech_jp_atr503_m001`は男性の声ですが、これを女性の声に変えてみます。

まずは、音声ファイルを[MMDAgent](http://www.mmdagent.jp/)のサイトから入手します。
現状(2016.4.7)での最新版であるVersion1.6を使用しました。

```
$ wget http://downloads.sourceforge.net/project/mmdagent/MMDAgent_Example/MMDAgent_Example-1.6/MMDAgent_Example-1.6.zip
```

その後、ファイルを解凍し、

```
$ unzip MMDAgent_Example-1.6.zip
```

その中の、`mei`フォルダ配下を`/usr/share/hts-voice/`にコピーします。

```
$ sudo cp -R ./MMDAgent_Example-1.6/Voice/mei /usr/share/hts-voice/
```

その後、先ほどの`jsay.sh`の4行目の-mの指定を以下に変更します。

 ```jsay.sh
･･･
-m /usr/share/hts-voice/mei/mei_normal.htsvoice \
･･･
```
先ほどと同様に、`jsay.sh`を実行すれば女性の声が再生されます。

```
$ ./jsay.sh こんにちは
```

#最後に
この日本語音声合成をつかって、将来的にはRFIDと連携させて、"〇〇さん、いらっしゃいませ”としゃべらせてみたいと思っています。

以上です。