Raspberry Pi Zeroで音声合成にチャレンジしてみよう

記事タイトルとURLをコピーする

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秒経ってから音声が始まります。

このように、比較的自然と読み上げてくれます。注意点としては、京急 だと きょうきゅう と読み上げてしまうので、ひらがなで けいきゅう にしています。

さて問題です。この駅はどこでしょうか?

まとめ

いかがでしたでしょうか。
音声合成はさまざまな分野に応用できる技術なので、ぜひこの夏休みにチャレンジしてみましょう。