ラズパイで何か便利なものを作れないか…と考えた結果、毎日定時に最新のニュースを読み上げてもらっています。
スポンサーリンク
環境の準備
我が家のラズパイ環境は以下の通り。
ハードウェア
- RaspberryPi 3
- 汎用スピーカー(サンワサプライ MM-SPU8BK)
ソフトウェア
- Raspbian 8
- OpenJTalk 1.09
- PHP 5.6
意外と重要なのがスピーカーです。
ラズパイのアナログ出力だと、音が小さくて全く聞こえないです。
アンプ内臓のスピーカーや、USBスピーカーなどを利用した方が良いです。
でも、オンボードのアナログ出力だと少しデメリットが。
- ノイズが乗りやすいこと
- 接続する線が増えること
- アンプの電源が必要になる
音質を気にしなければ、安くて小さいUSBスピーカーがオススメです。
ラズパイ自身から給電でき、配線がスッキリします。
また、上記スピーカーであれば、Raspbianでも問題なく使用できることが確認できています。
仕組み
最近何かと増えてきた音声合成で喋ります。
ニュースのソースは、NHKニュースです。
NHKニュースは、正しい日本語が使われていることや、横文字が並ぶことがないため、スムーズに読み上げてくれます。(ニュース内容も安定してるし!)
要するに、ラズパイがNHKニュースの原稿を拾ってきて、読み上げてくれる!という感じです。
ハードとOSインストール、ネットワークに接続
Raspbianを使用します。公式ページからダウンロードし、microSDカードに書き込みましょう。
インストール方法は、公式ドキュメントなどを参考に。
それと、最新のニュースは外部から取得するので、インターネットに接続できるようにしておく必要があります。無線でも有線でも構いません。
OpenJTalkとPHPのインストール
まずは、OpenJTalkとインストールして日本語が喋れる環境を作りましょう。
aptでインストールするか、ソースからコンパイルしましょう。
具体的な手順は、別ページを参照して下さい。
— 2017.04.24追記 —
ラズパイにOpenJTalkを入れて喋ってもらうまでの手順を公開しました!
同じように、PHPも必要です。
aptで入手しておいて下さい。
ニュース読み上げスクリプト
ここからがニュースを読み上げる機能になります。
NHKニュースは、RSSを利用しています。
今回のスクリプトでは「主要ニュース」を対象としています。スポーツや経済が聞きたいという場合はアドレスを変更して下さい。
OpenJTalkは、/usr/local/bin/jsayとしています。jsayコマンドはこちらから拝借致しました。
以下、news.phpとして保存しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | <?php ////////////////////// // (c) namekon, 2017 ////////////////////// //ニュースを取得し配列に格納する $news_array = get_news(); //確認する var_dump($news_array); //最初の挨拶 $say = "最新のニュースをお伝えします。"; exec('/usr/local/bin/jsay '.$say); //ニュース分だけ読み上げる for($count=0; $count < count($news_array); $count++) { exec('/usr/local/bin/jsay '.$news_array[$count]); } //最後の挨拶 $say = "ニュースをお伝えしました。"; exec('/usr/local/bin/jsay '.$say); function get_news() { //$data = array(); $rss = simplexml_load_file('http://www3.nhk.or.jp/rss/news/cat0.xml'); $array = array(); $i = 0; foreach ($rss->channel->item as $item) { // $x = array(); // $x['link'] = (string)$item->link; // $x['title'] = (string)$item->title; // $x['description'] = (string)$item->description; // $x['pubDate'] = (string)$item->pubDate; // $data[] = $x; if ($i == 0) { $x = "最初のニュースです。"; } else { $x = "次のニュースです。"; } $x .= (string)$item->description; $array[] = $x; $i++; } return $array; } ?> |
実行するには以下の通り。
$ php news.php
成功すれば、スピーカーからニュースを喋り出すはずです。
ニュース本文の長さにもよりますが、本文を喋り出すまでに20〜30秒程度かかる場合があります。(その間はCPU 100%になります)
定時に実行する
news.phpをcronに登録して好きな時間に実行させると楽しいです。
cronを使うのであれば、電源を落とすと時刻がズレてしまうので、NTPで時刻が同期されていることを確認して下さい。(Raspbianであれば、NTPはデフォルトで動いていると思います)
まとめ
OpenJTalkをインストールすれば、アイデア次第でいろいろなことを喋ってくれるようになります。
OpenJTalkのパラメータを調整すると、声色を変えることができるのでいろいろ試してみるのも楽しいです。
※2017/05/10追記
ラズパイにスイッチを付ける記事を追加しました!
スポンサーリンク
[…] Previous PostPrevious RaspberryPiでニュースを読み上げるNext PostNext Arduinoで温湿度+気圧計を作る […]
[…] 以前、RaspberryPiで音声合成を使ってニュースを読み上げる機能を紹介しました。 DeathMarch.net RaspberryPiでニュースを読み上げるhttps://deathmarch.net/archives/191ラズパイで何か便利なもの […]