(2019-03-17 初稿 - 2020-09-14 転記)
様々なことができるRaspberry Pi3(ラズパイ)ですが、筆者は24時間電源ONにしているので、人が近づいて来たら、「こんにちは」等とあいさつしたり、セリフをしゃべりながらパワーポイントの資料を見せたら、さらに有効に活用できそうです。
このページでは、Raspberry Pi3に Open Jtalkのライブラリを使ってしゃべってもらう設定をします。
なお、このページを記載するにあたり、以下のページを参照ネットで検索すると、他にもたくさん有益なページがありますので、ぜひご参照を。(^^)/というか、そのまま利用させていただきました。
上記サイトの記述にあるとおり、Open Jtalkのライブラリと音声ファイルをインストールします。
sudo apt-get install open-jtalk open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001
上記インストールが終了したら、以下のとおりスクリプトを作成します。
mkdir ~/bin
vi bin/speak
毎回細かなオプション等を入力するのは、面倒なので、以下のスクリプトを作成します。
#!/bin/bash
tempfile=$(tempfile)
option="-m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice \
-x /var/lib/mecab/dic/open-jtalk/naist-jdic \
-ow $tempfile"
echo "$1" | open_jtalk $option aplay -q $tempfile
rm $tempfile
スクリプトが完成したらさっそくしゃべらせてみます。
が、その前に出力先の設定を行います。
amixer cset numid=3 0 自動判別
amixer cset numid=3 1 外部スピーカー
amixer cset numid=3 2 HDMI出力
ちなみに、筆者は HDMI出力で行っていますが、最初の文字を話してくれない問題があります。(^_^;)
デフォルトでは、かなり音量が小さいので、以下のコマンドで音量を調節してください。
alsamixer
さて、準備が整いましたので、以下のとおりしゃべってもらいます。
./speak "こんにちは。ラズベリーパイです"
デフォルトでは、男性の良い声ですが、お好みに応じて以下に示すように、音声をメイさんに変更します。
wget https://sourceforge.net/projects/mmdagent/files/MMDAgent_Example/MMDAgent_Example-1.7/MMDAgent_Example-1.7.zip --no-check-certificate
ダウンロードしたzipファイルを解凍します。
unzip MMDAgent_Example-1.7.zip
解凍したファイルのうち、メイさんのものをコピーします。
sudo cp -R ./MMDAgent_Example-1.7/Voice/mei /usr/share/hts-voice/
インストールしたメイさんの音声を使ってしゃべってもらいます。
#!/bin/bash
tempfile=`tempfile`
option="-m /usr/share/hts-voice/mei/mei_normal.htsvoice \
-x /var/lib/mecab/dic/open-jtalk/naist-jdic \
-ow $tempfile"
echo "$1" | open_jtalk $option
aplay -q $tempfile
rm $tempfile
上記スクリプトを実行すると、最初の何文字かは音声になりません。
ネットで検索すると以下のページを見つけました。
どうも、HDMI出力では、遅延が起こって、最初の何文字かは発声されないようです。
外部スピーカーをお持ちの方は、外部スピーカーで試してみてください。
上記のスクリプトは、短いテキスト(200字以内)でしたら問題がありませんが、長い文章になると途中でしゃべらなくなってしまいます。
せっかく上手にしゃべってくれるのに、残念ですね。
そこで、長い文章でもしゃべってくれるようにスクリプトを変更しました。
まず最初に、soxというパッケージをインストールします。
sudo apt-get install sox
soxは、複数の wav ファイルを結合してくれます。
以下の例では、input01.wavとinput02.wavを結合して、output.wavを作成します。
sox input01.wav input02.wav output.wav
それでは、実際に話す内容を1行1文の形式で、read.txt というテキストファイルに書き込みます。
$ cat read.txt
こんにちは。
ラズベリーパイです。
新しいスクリプトでは、長い文章でもちゃんと読み上げることができます。
皆さんも、使ってくださいね。
最後に作成したスクリプト lot_speak を示します。
#!/bin/bash
option="-m /usr/share/hts-voice/mei/mei_normal.htsvoice \
-x /var/lib/mecab/dic/open-jtalk/naist-jdic"
i=0
cat "$1" | while read line
do
echo $line | open_jtalk $option -ow temp_$(printf %03d $i).wav
i=$(($i + 1))
done
/usr/bin/sox $(ls temp_*.wav) "$2"
rm temp_*.wav
使い方は、以下のとおりです。
$ lot_speak read.txt out.wav # 読み上げるテキストファイル 出力のwavファイル
$ aplay -q out.wav # 出力されたwavファイルを読み上げる
長い文章も読み上げることができたでしょうか?
サンプルとして、以下のリンクを貼っておきますので、聞いてみてください。
今回は、ラズパイにしゃべってもらう設定をしました。しゃべってもらう内容をAIで判断すれば、かなり面白いアプリケーションができるような気がします。
皆さんも、ぜひ、いろいろと挑戦してみてください。
また、なにかわかったら、追記します。(^^)/
Raspberry Pi3で動体監視カメラに挑戦