1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Raspberry Pi 4をOpenJTalkで日本語発話デバイスにする ~とりあえず時報を実装~

Last updated at Posted at 2020-09-09

モチベーション

GoogleHome等のスマートスピーカでは、「今何時?」「今日の天気は?」と聞かないと時間や天気を教えてくれない。自宅環境にて、定期的に聞きたいことは定期的に自動で発話してくれると便利なのでRaspberryPi4を日本語発話デバイスにする。

実装方法(ハード)

RaspberryPi4本体の3.5inchイヤホンジャックをスピーカに接続しておく。

実装方法(ソフト)

Open JTalkというLinuxで動作する日本語の音声合成ソフトを使う。(※ここでデモができる。)RaspberryPi4へのインストールは以下のコマンドを使う。

  • OpenJTalk本体
$ sudo apt-get install open-jtalk
  • 日本語辞書
$ sudo apt-get install open-jtalk-mecab-naist-jdic
  • 標準の男性音声モデル
$ sudo apt-get install hts-voice-nitech-jp-atr503-m001

上記を完了するとターミナルからopen_jtalkコマンドが実行でき、日本語文字列を受け取って音声合成ができるようになる。使い方は、以下の記事が参考になる。
OpenJtalkを使って日本語をRaspberry Piに喋らせる - Qiita

このコマンドを、扱いやすくするため以下のようにシェルスクリプト化する(ファイルに実行権限を付与することを忘れずに)。
保存場所はユーザホームディレクトリ(~)直下に作成したscriptsディレクトリとした(~/scripts/jtalk.shで実行できる)。

jtalk.sh
#!/bin/bash
if [ -p /dev/stdin ]; then
    cat -
else
    echo $1
fi | open_jtalk -x /var/lib/mecab/dic/open-jtalk/naist-jdic -m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice -ow /dev/stdout | aplay --quiet

jtalk.shの動作は、標準入力(パイプ)で渡された文字列、またはコマンドライン引数の1つ目の文字列を発話する(スピーカから音が出る)というもの。
実行例を以下に示す。

$ echo "あいうえお" | ~/scripts/jtalk.sh #「あいうえお」と発話
$ ~/scripts/jtalk.sh "かきくけこ" #「かきくけこ」と発話

これで、使いやすい日本語発話モジュールが完成した。

応用例

発話モジュールを使った応用例として、時報を実装する。
読み上げたい時刻文字列を作って、パイプなりコマンドライン引数なりで先程のjtalk.shに渡してやればよい。時刻文字列の作成には、dateコマンドを使う。dateコマンドは、実行時に時刻フォーマットを表す文字列を渡してやることで、カスタムされた文字列出力を得ることができる。
dateコマンドの詳細な使い方は、以下のWebページが参考になる。
date コマンド | コマンドの使い方(Linux) | hydroculのメモ

$ date
2020年  9月  9日 水曜日 18:12:45 JST #標準の出力

$ date "+現在の時刻は、%-H時%-M分です"
現在の時刻は、18時12分です #渡された内容でフォーマットされた出力

上記を踏まえ、実行したときの時刻を発話するシェルスクリプトを次のように実装した(dateコマンドの結果文字列をパイプで渡してるだけ)。
保存場所はjtalk.sh同様ユーザホームディレクトリ(~)直下に作成したscriptsディレクトリとした。

time_signal.sh
#!/bin/bash
date "+現在の時刻は、%-H時%-M分です" | ~/scripts/jtalk.sh

このtime_signal.shをcrontabで定期実行するように登録すれば、時報の完成。
以下の例では、毎時00分と30分に「現在の時刻は、●●時▲▲分です」と発話される。

$ crontab -e
#以下の記載を追加して保存
*/30 * * * * ~/scripts/time_signal.sh > /dev/null 2>&1

ちなみにtime_signal.shについて、なぜこの短い分量をわざわざシェルスクリプトファイル化したのかというと、cronに登録するときにはパイプ(│)の表記は使えず、単体のコマンドである必要があったため。

所感・今後の予定

部屋で過ごしてるときに、定期的に時間が読み上げられることで、なんとなくダラダラ過ごしてしまうのを防止できている感じがする。
他にも、Webスクレイピングで株価やニュースの文字列をとってきて、それを指定した時刻に発話させるのもいいかも、と考えているところ。
また、名古屋工業大学発の「mei & takumi」のモデルを使って話者を女性に変えることを予定している(音声データ.htsvoiceファイルをダウンロードしてきて open_jtalkコマンドの-mオプションで渡せばよい)。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?