ひゃまだのblog

ひゃまだ(id:hymd3a)の趣味のブログ

Raspberry Pi3にしゃべってもらう

(2019-03-17 初稿 - 2021-05-12 転記 -2022-02-17 追記)


はじめに

Raspberry Pi3(ラズパイ)の電源を24時間電源ONにしているので、人が近づいて来たら「こんにちは」等とあいさつしたり、パワーポイントの資料がプレゼンできたら、さらに有効に活用できそう。
このページでは、Raspberry Pi3に Open Jtalkのライブラリを使ってしゃべってもらう設定を行う。
なお、このページを記載するにあたり、以下のページを参照した。というか、そのまま利用させていただいた(多謝)。

ネットで検索すると、他にもたくさん有益なページがあるので、ぜひ検索を。(^^)/

f:id:hymd3a:20210512161032p:plain

しゃべるラズパイ

インストール

上記サイトの記述にあるとおり、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出力で行っているが、最初の文字を話してくれない問題がある。(^_^;)

(2022-02-17 追記)

最近のRaspberry PiはPluseAudioで音声を管理しているよう。

出力先の選択は、デスクトップの右上にあるスピーカーを右クリックして選択する。

f:id:hymd3a:20220217140532p:plain

スピーカーのアイコンをクリックして、出力先を選択

(追記終了)

音量の調節

デフォルトでは、かなり音量が小さいので、以下のコマンドで音量を調節する。

alsamixer

(2022-02-17 追記)
pavucontrolをインストールして、音量調節。

$ apt install pavucontrol
$ pavucontrol

(追記終了)

しゃべってもらう

さて、準備が整いましたので、以下のとおりしゃべらせる。

./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出力では、遅延が起こって、最初の何文字かは発声されないよう。
ということで、外部スピーカーをお持ちの方は、外部スピーカーでお試しを。

たくさんのテキストをしゃべってもらう(2019年3月18日追記)

上記のスクリプトは、短いテキスト(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で判断すれば、かなり面白いアプリケーションができるような。
皆さんも、ぜひ、いろいろと挑戦してみて。


また、なにかわかったら、追記します。(^^)/

関連ページ