自宅リビングでは、Raspberry Pi にVolumioをインストールして音楽やインターネットラジオなどを再生できるようにしていますが、隣に強力なライバル(Google Home Mini)がいます。当然、子供たちは「オッケーGoogle! ~~~の曲を流して!」とYoutube MUSICで好きな曲を再生しているのでVolumioの出番は全くありません・・。折角インストールしたのに・・っ!!
さらに、Google Homeは「天気予報を聞けば、その場所の天気を教えてくれる」なんてこともできます。ということで、RaspberryPi(Volumio)の出る幕は無いのでは・・
そんなふうに考えていた時期が俺にもありました・・
毎朝、子供の朝食を作り、ダラダラ食べる子供たちを急かしながら自分の朝食を食べつつ、夕食の仕込みをする家事タイムアタック中に「オッケーGoogle、今日の天気は?」と軽やかに話しかけられるほどの余裕はありません。ということで、決まった時間に今日の天気をVolumio君が教えてくれたらいいのになぁと思ったのです。Raspberry Pi を使ってインターネットから当日の天気予報情報を取得して、それをお話ししてもらうことにしました。
なお、Google Homeの「ルーティン」機能を使うとできるだろ、というツッコミは聞かないことしますw。(別途紹介したいと思います)
RaspberryPi に毎朝天気予報してもらいたい!
と強引ではありますが、RaspberryPiに天気予報してもらう理由ができたので、具体的な手順を紹介します。
必要なもの
ハードウェア、ネットワーク環境
- RaspberryPi(OSはRaspedianでもVolumioでも、音が出せればOK。RaspberryPiの世代も1~4、nano なんでもOKです)
- スピーカー(RaspberryPiのステレオジャックからでも、DACボードからでもお好きな構成で)
- インターネット接続環境(インターネット経由で最新の天気予報情報を取得するため)
ソフトウェア
- PHP(無ければインストールします) $ sudo apt install php
- OpenJtalk(今回インストールします)
- MMDAgentの音響(音声)モデル
天気予報データ
データとして活用可能な各地の天気予報情報って、実はなかなか無いのです。そんな中以下のサイトで気象庁が公開している天気予報情報(http://www.jma.go.jp/)から独自の手法でメタデータ化した情報を XML 形式で配信していただいています。
Japan Weather Forecast xml (日本お天気予報)の配信リスト
東京都の天気予報はこちらです。これを見ると、以下のようなXMLデータになっています。(→ の部分は渡辺が書いたコメントです)
<weatherforecast> <title>weather forecast xml</title> <link>http://www.drk7.jp/weather/xml/13.xml</link> <description>気象庁の天気予報情報を XML で配信。1日1回 AM 6:00 ごろ更新。</description> <pubDate>Wed, 20 May 2020 18:00:02 +0900</pubDate> <author>気象庁</author> <managingEditor>drk7.jp</managingEditor> <pref id="東京都"> <area id="伊豆諸島北部"> → 伊豆諸島北部 <geo> <long>139.3803</long> <lat>34.7358</lat> </geo> <info date="2020/05/20"> → 天気予報の日付 2020/05/20 <weather>くもり</weather> → その日の天気 <img>http://www.drk7.jp/MT/images/MTWeather/200.gif</img> <weather_detail>北東の風 やや強く くもり 所により 夜遅く 雨</weather_detail> <wave>波 2.5メートル</wave> <temperature unit="摂氏"> <range centigrade="max">22</range> → その日の最高気温 <range centigrade="min">20</range> → その日の最低気温 </temperature> <rainfallchance unit="%"> <period hour="00-06">0</period> → 0時~6時までの降水確率 <period hour="06-12">10</period>→ 6時~12時までの降水確率 <period hour="12-18">10</period>→ 12時~18時までの降水確率 <period hour="18-24">20</period>→ 18時~24時までの降水確率 </rainfallchance> </info> : (以下略)
上記の例は「伊豆諸島北部」ですが、この後に伊豆諸島南部とか小笠原とか東京がエリア(area)として設定されているので、必要な部分のXMLデータを取得することでその日の天気予報情報がゲットできることがわかります。ありがたや~。
ということで、あとは先人の皆様の知見を参考にしつつ仕込んでいきます。
手順段取り
作りたい処理の流れを整理します。まずは、天気予報XMLをダウンロードして、XMLデータを解析して必要な部分を取得して、お天気お姉さんが予報するようなテキストファイルを作ります。手軽にウェブサイトからデータを取得してXMLを解析(パース)するのは、PHPが個人的にお手軽なのでPHPでこの部分を作ります。
次にテキスト読み上げ(テキストファイルを、openjtalk コマンドで「お天気トークファイル」をMEIちゃんの音声で音源データ(WAV形式)で出力し、これをスピーカーで再生できればOKです。
無事にお姉さんが天気予報を喋ってくれるように、crontab で所定の時間に自動実行するよう仕込めば完成です。
完成したら、毎朝 リビングで Raspberry Piからお天気お姉さんが天気予報してくれるので、傘がいるかどうか、薄着が良いか厚着が良いか判断できるわけです。便利!
PHPインストールされてるか確認、なければインストール
$ php -v PHP 7.3.14-1~deb10u1 (cli) (built: Feb 16 2020 15:07:23) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.3.14, Copyright (c) 1998-2018 Zend Technologies with Zend OPcache v7.3.14-1~deb10u1, Copyright (c) 1999-2018, by Zend Technologies
php のバージョンが表示されればインストール済みです。command not found と表示されたらphpがインストールされてないのでインストールしないといけません。
こんな感じでインストールします。
$ sudo apt install php7.3 php7.3-curl php7.3-json php7.3-mbstring php7.3-xml php7.3-zip
再度 php -v のようにバージョンチェックをしてバージョン情報が表示されればオッケーです。
OpenJtalk をインストールする
OpenJtalk はインストールされていませんので、同じようにサクっとインストールします。
$ sudo apt install -y open-jtalk open-jtalk-mecab-naist-jdic hts-voice-nitech-jp-atr503-m001 $ sudo apt install unzip
MMDAgentをインストール
MMDAgentをインストールするしてMEIちゃんの音響(音声)モデルをゲットします。また、Volumio2のデフォルトではunzipコマンドがインストールされていなそうなので、併せてインストールします。そして MMDAgent のデータを展開して所定のフォルダにコピーします。
$ cd /tmp/ $ wget https://sourceforge.net/projects/mmdagent/files/MMDAgent_Example/MMDAgent_Example-1.8/MMDAgent_Example-1.8.zip/download $ sudo apt install -y unzip $ unzip download $ sudo cp -r ./MMDAgent_Example-1.8/Voice/mei /usr/share/hts-voice/
データ取得プログラムの作成
PHPでプログラム作成です。処理手順としては、
- 上記お天気予報のサイトのXMLデータを一式ダウンロード
- 必要な情報だけ抜き出す(今日の天気、今日の最高/最低気温、午前/午後/夜間の降水確率)
- お天気お姉さんが朝の天気予報をするような文面を、得られた情報で作成し、テキストファイル(お天気トークファイル)として保存する。
です。東京都(東京地方)の例は以下の通りです。とても短いコードですが、これでちゃんと動作します。
<?php // 東京都の天気予報(XML)を取得 $area_xml = "https://www.drk7.jp/weather/xml/13.xml"; $xml = simplexml_load_file($area_xml); // 当日の予報データを取得(天気、最高気温、最低気温、降水確率(午前/午後/夜) $weather = $xml->pref->area[3]->info[0]->weather; $temp_max = $xml->pref->area[3]->info[0]->temperature->range[0]; $temp_min = $xml->pref->area[3]->info[0]->temperature->range[1]; $rainfallchance06_12=$xml->pref->area[3]->info[0]->rainfallchance->period[1]; $rainfallchance12_18=$xml->pref->area[3]->info[0]->rainfallchance->period[2]; $rainfallchance18_24=$xml->pref->area[3]->info[0]->rainfallchance->period[3]; // お天気お姉さんの予報トークになるように組み立て。 $weather_msg = "おはようございます。今日の天気は" . $weather . "、最低気温は" . "$temp_min" . "度、最高気温は" . $temp_max . "度です。"; $weather_msg .= " 午前中の降水確率は" . $rainfallchance06_12 . "パーセント、"; $weather_msg .= " 午後の降水確率は" . $rainfallchance12_18 . "パーセント、"; $weather_msg .= " 今夜の降水確率は" . $rainfallchance18_24 . "パーセントです。 "; echo $weather_msg;
これを getweather_tokyo.php というファイル名にして保存します。
実行する($ php ./getweather_tokyo.php )と、
「おはようございます。今日の天気はくもりのち雨、最低気温は16度、最高気温は18度です。 午前中の降水確率は30パーセント、 午後の降水確率は50パーセント、 今夜の降水確率は50パーセントです。」
のように出力されます。
長くなったので、つづきは次回で!