MSP課の平(@mana_cat )です。夏休み企画第二弾のエントリーになります。
今回は、Speaker pHATを準備して、音声合成ファイルを再生する手順を紹介します。
もちろん、Speaker pHATを所有されていなくてもRaspberry Pi Zeroや2、3 がお手持ちのスピーカーに繋がっている(音声が出力可能)な状態でしたら、本エントリーの後半「音声合成に必要なパッケージのインストール」の手順からでも楽しめるようになっていますので、ぜひ参考にしてください。
Speaker pHAT とは
Speaker pHAT はGPIOピンに装着するタイプのHATです。このpHATは、I2S DAC とモノラルアンプ、小型8Ω 2Wスピーカー、LED10個を搭載しています。音声がハッキリと聞こえるので、これ1枚で外出先で音声を流したり、インターネットラジオを聴いたりと活用可能です。
また、別途USBマイクを用意して対話型の音声認識を楽しめます。
国内ではスイッチサイエンスで販売されています。
Speaker pHAT のセットアップ
必要パッケージをインストールする段階では Speaker pHAT を装着しないで下さい。必要パッケージがインストールされていない状態で pHAT を装着してしまうと、OSの起動がうまくいかない場合があります。
今回、Raspberry Pi Zeroを使っていますが、Raspberry Pi 2、3を使用する場合はI2Sをsudo raspi-config
で有効化してください。
以下の手順でSpeaker pHATに必要なパッケージをインストールします。
$ sudo curl -sS https://get.pimoroni.com/speakerphat | bash
Do you wish to continue? [y/N] y
Do you wish to perform a full install? [y/N]y
Would you like to reboot now? [y/N] y
セットアップが終わったら、一度電源を切ります。
$ sudo shutdown -h now
電源を切り終えたら、microUSBを外して Speaker pHAT をRaspberry Pi Zero に装着します。装着したら電源に接続しますが、このときmicroUSBからの給電は直接電源へ接続したUSBアダプターから行いましょう。
理由は、Speaker pHAT単体で電力を消費するので、安定した電力が必要だからです。そのため、PCからの給電は不安定になることがあるため行わないでください。もし、給電不足になると、出力した音声にノイズが走ったり、OS自体が正常に起動できなくなりますのでご注意ください。
スピーカー出力テスト
Speaker pHATをRaspberry Pi に装着後、OSが起動できたら、スピーカ出力テストをします。speaker-test
コマンドを実行して、Speaker pHATからテスト音が正常に再生されるか確認します。
$ speaker-test -t sine -f 600
問題無くテスト音が再生できたらCtrl+C
でキャンセルします。
音量を調整したいときは以下のコマンドで調整できます。
$ alsamixer
次は、音声合成をします。
音声合成に必要なパッケージのインストール
日本語の音声合成に必要なパッケージをインストールします。
OpenJtalkのインストール
まずは open-jtalk をインストールし、その後、提案パッケージをインストールします。確認のため 続行しますか? [Y/n]
と訊かれますので y
を入力します。
$ sudo apt-get install open-jtalk
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
libhtsengine1
提案パッケージ:
open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001
以下のパッケージが新たにインストールされます:
libhtsengine1 open-jtalk
アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 0 個。
187 kB のアーカイブを取得する必要があります。
この操作後に追加で 542 kB のディスク容量が消費されます。
続行しますか? [Y/n] y
次に、表示された提案パッケージをインストールします。
$ sudo apt-get install open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001
音声を合成する
男性の音声エージェントを使って合成してみよう
必要なパッケージがインストールされたら、先ほどインストールした /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice
を使って実際に音声データを合成します。このとき、合成元のテキストを voice.txt
として用意します。これを OpenJtalk を使って日本語の音声として合成し、出力します。出力する音声は wav
ファイルになります。
$ nano voice.txt
こんばんは。はじめまして、僕の名前は江戸川コナン。探偵さ。
作成した テキスト voice.txt
をOpenJtalk の元データとして渡すために、次のコマンドを実行します。そして、 aplay
コマンドで出力されたvoice.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 voice.wav voice.txt
$ aplay voice.wav
問題無く音声が出力されたら成功です。
女性の音声エージェントを使って合成してみよう
次に、女性の音声エンジンを使用するため、「MMDAgent」を利用します。MMDAgentとは、名古屋工業大学国際音声技術研究所によって作成されたオープンソースの音声インタラクションシステム構築ツールキットです。
以下URLから女性の音声データを以下の手順でダウンロードします。ダウンロードが完了したら、MMDAgent_Example-1.7.zip
を展開し、mei
ディレクトリ配下を /usr/share/hts-voice/
にコピーします。
$ wget http://downloads.sourceforge.net/project/mmdagent/MMDAgent_Example/MMDAgent_Example-1.7/MMDAgent_Example-1.7.zip
$ unzip MMDAgent_Example-1.7.zip
$ sudo cp -R ./MMDAgent_Example-1.7/Voice/mei /usr/share/hts-voice/
女性の音声エージェントを使用して、もう一度 音声を合成します。
$ open_jtalk -m /usr/share/hts-voice/mei/mei_normal.htsvoice -x /var/lib/mecab/dic/open-jtalk/naist-jdic -ow mei-normal.wav voice.txt
$ aplay mei-normal.wav
音声が女性に変わりましたね。
MMDAgent には喜怒哀楽別に音声データが用意されている
女性の音声エージェントは感情別に何種類かあって、mei_normal.htsvoice
を使用していますが、利用シーンに応じて変更してください。
$ ls /usr/share/hts-voice/mei/mei_*
/usr/share/hts-voice/mei/mei_angry.htsvoice
/usr/share/hts-voice/mei/mei_bashful.htsvoice
/usr/share/hts-voice/mei/mei_happy.htsvoice
/usr/share/hts-voice/mei/mei_normal.htsvoice
/usr/share/hts-voice/mei/mei_sad.htsvoice
読み上げ用スクリプトの作成
次に、読み上げ用のスクリプトを作成します。今回は /usr/share/hts-voice/mei/mei_happy.htsvoice
を音声エージェントとして使用しています。
$ nano speak.sh
#!/bin/sh
TMP=/tmp/voice.wav
echo "$1" | open_jtalk -m /usr/share/hts-voice/mei/mei_happy.htsvoice -x /var/lib/mecab/dic/open-jtalk/naist-jdic -ow $TMP && aplay --quiet $TMP
rm -f $TMP
作成したシェルスクリプトのパーミッションを変更します。
$ chmod 755 speak.sh
京急線のアナウンスを読み上げてもらう
スクリプトを実行します。./speak.sh
の後に、読み上げて欲しいテキストを入力します。難しくない漢字もだいたい認識してくれます。Enterを押すと実行されます。
$ ./speak.sh 間もなく、一番線に、けいきゅう久里浜ゆきが、ふたつとびらで到着いたします。白線の内側まで、下がってお待ち下さい。次は、品川です。
実際の動画
※ 動画は10秒経ってから音声が始まります。
京急久里浜行き pic.twitter.com/L8jVdzJiBC
— Manami Taira (@mana_cat) 2017年5月4日
このように、比較的自然と読み上げてくれます。注意点としては、京急
だと きょうきゅう
と読み上げてしまうので、ひらがなで けいきゅう
にしています。
さて問題です。この駅はどこでしょうか?
まとめ
いかがでしたでしょうか。
音声合成はさまざまな分野に応用できる技術なので、ぜひこの夏休みにチャレンジしてみましょう。