以前、作ったRaspberry Pi 3 Model B+とJulius、Open JTalkベースのスマートスピーカーを自作した時点で搭載済みの機能ですが、改めてページとして起こしておくことに。
主な機能は、
尚、ラズパイ用ACアダプタを挿したスイッチ付きコンセントでのON/OFFとは別にラズパイ用boot/reboot/shutdown物理ボタン付き。
音声認識にJuliusを使った自作スマートスピーカーに伝言とメモの機能を実装するにあたり、マイクとスピーカーを専有してしまうOSSやALSAからPulseAudioに移行しました。
ちなみに便利なのでラズパイだけでなく、PC/Debianにも自作スマートスピーカー機能を搭載しています。
自ずとモニタ付きとなるPC版スマートスピーカーには、PC及びラズパイ双方のスマートスピーカー機能のデスクトップアプリとしてPyQt5/Qt Designerによる操作パネルも作成しました。
ずっと猛暑だから聞いてもしょうがないなって放置してたら、気づけば、livedoor天気サービス終了なんだって...。
2020年7月31日(金)14:00 をもちまして、「livedoor 天気」のサービス提供を終了...。
当然、Weather Hacksも終わりってことね...ありがとね、Weather Hacks。
最近、このページのアクセスが、少し増えてて?だったんだけど、そういうことか。
って、どうしようかな...、OpenWeatherMapは、登録しなくちゃいけないし、Yahoo!APIもそうだけど、その上、わかりにくいし...。
というわけでYahoo!天気・災害をpythonでスクレイピングしてみることにしました。
livedoorの天気予報API『Weather Hacks』のサービスがlivedoor天気と一緒に終了したらしく、これを使ったスクリプトは後段に置いておくとして改めてYahoo!Japan天気・災害の特定の都道府県・地域のページをWebスクレイピングして天気情報を取得することにしました。
これを選んだのは、一番最初に見つけた無料で登録の必要がないものだったから。
スクリプトはこんな感じ。
今回は、JSONデータじゃなくてHTMLをスクレイピング。
Pythonらしくないかも...、しかも嫌いなフラグを使ってしまった...、代わりと言ってはなんですが、今回は、今日・明日・明後日の3日分の天気と気温、降水確率の9種をスクリプト1つにまとめてみました。
これは、東京の天気及び気温を取得する例、他の都道府県や地域の場合は、url要変更。
東京のページのソースを眺めてみると今時点では、urlに([?day=1]を省略可っぽい)当日以外は、[?day=]で明日を示す2から7日先の8まで指定することで実際には、全部で8日分取得できます。
音声合成のOpen JTalkから成るjsayスクリプトを組み込む方法がわからくなったので最終的にテキストを出力するスクリプトにしました。
また、スマートな方法を思いつかなかったこともあり、ラズパイ版もパソコン版もスマートスピーカー用応答スクリプト(自身が作ったのはPythonじゃなくてPerl)の方で、jsayスクリプトに渡すのに、このスクリプトを実行・展開すべく、バッククォートで、更にひとまとまりのテキストとするため、ダブルクォートでくくる方法をとることにしました。
天気APIから情報を得るスクリプトについては、livedoorの天気予報API『Weather Hacks』を使ったというPythonで書かれたtalk_weather.pyをhttp://raspi.seesaa.net/article/415530289.htmlから拝借。
入力に応じた分岐条件を追記・編集してもよかったのかもしれませんが、Python初心者の自身は、用途ごとにスクリプトファイルを分割し、ベースと成る音声操作応答用Perlスクリプトから、それらPythonスクリプトを直接呼び出す方法をとりました。
このpythonスクリプト内では、奇しくも発話用にjsayという同じ名前のスクリプトを指定していますが、登録済み実行パスに存在するコマンドとして書いてあるようなので、そうでない場合は、環境に応じてjsayスクリプトのパスを合わせておく必要があります。
jsayスクリプトは、Open JTalkから成るスクリプト、詳細は、冒頭リンク「スマートスピーカーを自作」参照。
自身は、ローカルで対応しましたが、このWeather Hacks、日付や時刻情報も取得できます。
今日の天気、最高気温・最低気温を読み上げてくれるpythonスクリプト。
と思いましたが、お天気Webサービス仕様のサンプルを見ると当日の最低気温はnullで取得できない仕様、最高気温は取得できそうに見えるもダメな模様。
ただ、後述の通り、今日の最高気温だけなら取得できます。
よって当日は、天気のみとしました。
明日の天気及び最高気温、最低気温を読み上げてくれるpythonスクリプト。
明後日の天気を読み上げてくれるpythonスクリプト。
Weather Hacksでは、明後日の気温情報はnullであり、ないので天気のみ。
今日の最高気温、最低気温を読み上げてくれるpythonスクリプト。
ただし、前述の通り、当日の最低気温は、nullで取得できない為、「今更聞かないで」と返すようにしてみました。
明日の最高気温、最低気温を読み上げてくれるpythonスクリプト。
ラズパイスマートスピーカーへの反映についても詳細は、「スマートスピーカーを自作」他、リンク先参照。