このエントリーをはてなブックマークに追加
facebooktwittergoogle_plusredditpinterestlinkedinmail

こんばんは、tapunです。

前回、無事に遅延無くRaspberry Pi にしゃべってもらうことに成功したので、次はもうすこし意義のある内容を喋ってもらうべく、まずは「天気予報」を語っていただくことにしました。

 

ウェザーニュース タッチ


天気予報の情報は何をつかうの?

livedoor天気予報が公開しているお天気Webサービス(Weather Hacks)のREST APIを使わせていただきます。

※商用利用は認められていませんので、個人的な利用にとどめましょう。

※お天気Webサービスの仕様はこちらにまとめられています。


どうやって天気予報をしゃべってもらうの?

今回はこちらの記事を参考にpythonで実装していきます。

  1. 任意のパスに”talk_weather.py”ファイルを作成します。
    $ sudo vi talk_weather.py
  2. 下記のように記載して、保存します。

    tail_weather.py

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    import shlex
    import subprocess
    
    from datetime import datetime
    
    import urllib2
    import json
    
    CMD_SAY = 'jsay'
    
    def main():
        say_datetime()
        say_weather()
        return
    
    def say_datetime():
        d = datetime.now()
        text = '%s月%s日、%s時%s分%s秒' % (d.month, d.day, d.hour, d.minute, d.second)
        text = CMD_SAY + ' ' + text
        print text
        proc = subprocess.Popen(shlex.split(text))
        proc.communicate()
        return
    
    def say_weather():
        city = '130010'; # Tokyo 他の地域の方は、番号を変えてください。
        json_url = 'http://weather.livedoor.com/forecast/webservice/json/v1' #API URL
    
        weather_text = u'%sの天気は%sです。'
        temperature_text = u'%sの予想最高気温、%s度、予想最低気温、%s度です。'
    
        try:
            r = urllib2.urlopen('%s?city=%s' % (json_url, city) )
            obj = json.loads( unicode(r.read()) )
    
            title = obj['title']
            forecasts = obj['forecasts']
    
            # TODAY
            cast = forecasts[0]
            temperature = cast['temperature']
            today_w_txt = weather_text % (cast['dateLabel'], cast['telop'])
            today_t_txt = temperature_text % (cast['dateLabel'], temperature['max']['celsius'], temperature['min']['celsius'])
    
            # TOMMOROW
            cast = forecasts[1]
            temperature = cast['temperature']
            tommorow_w_txt = weather_text % (cast['dateLabel'], cast['telop'])
    
            # SAY
            weather_str = title + ' ' + today_w_txt + ' ' + today_t_txt + ' ' + tommorow_w_txt
            weather_str = weather_str.encode('utf-8')
    
            text = '''%s '%s' ''' % (CMD_SAY, weather_str)
            print text
            proc = subprocess.Popen(shlex.split(text))
            proc.communicate()
        finally:
            r.close()
    
        return
    
    
    ### Execute
    if __name__ == "__main__":
        main()

     ※この天気予報は朝に聞くイメージなので、気温の情報は「今日」の情報に入れ込みました。
    ※[2015/12/6追記]上記のスクリプトでは気温でnullが返ってきたときに天気予報も喋ってくれないので、ちょっと工夫したバージョンはこちらです⇒お天気Webサービスは最高/最低気温がnullで返ってくることがある

    ※東京以外の地域の天気予報を取得する場合は、こちらを参考にしてください。

    (例)「福岡県・久留米の天気」を取得する場合

    下記URLにアクセスしてJSONデータを取得します。
    基本URL + 久留米のID(400040)
    引用:http://weather.livedoor.com/weather_hacks/webservice

     
  3. 早速ためしてみます。
    $ python talk_weather.py
    jsay 12月5日、1時15分38秒
    jsay '東京都 東京 の天気 今日の天気は晴れです。 今日の予想最高気温、15度、予想最低気温、7度です。 明日の天気は晴のち曇です。'

     天気予報をしゃべった~~~!!!! :-)

    都度情報をとってきてるから、若干2行目の音声は遅れますね。でも許容範囲です。


毎日(定期的に)喋ってもらうための設定

これで、きちんと天気予報を喋ってくれることがわかったので、定期的に声を発するように設定します。

  1. cron設定ファイルを開きます
    $ crontab -e
  2. 下記の行を追記して、保存します
    15 8 * * python /home/user/talk_weather.py

     上記の例は、毎朝8:15に天気予報を語りだすように設定しています。
    # 8:15まで朝ドラを見ているので、その後に天気予報が流れ出したら良いかな~と!

    ※cronの設定については、こちらの記事が参考になるかと思います。


まとめ

天気予報APIとOpenJtalkを組み合わせることで、定期的な天気予報を音声で伝えてもらえるようになりました!

どんどん出来ることが増えて便利な機械になってきました。

今週末は初めての電子工作にチャレンジしてみたいと思います!


Raspberry Pi ブログランキングへ