2015年03月14日

Raspberry Piに現在時刻と、天気をしゃべらせてみた(Python)

【今日のゴール】

RaspberryPiに現在の日時と、天気をしゃべらせる。

tenki.png

【Python】

RaspberryPiの「pi」はPythonのパイ、ということで、Pythonで実装します。
RaspberryPiには最初からPythonが入っているので、特にセットアップの必要はありません。

【やってみる】

事前準備(open_jtalkのインストール)

事前に下記エントリーを参考に、open_jtalkを使った「jsay」コマンドを使えるようにしてください。

Raspberry Piにしゃべらせてみた(OpenJTalk 1.08、.htsvoiceファイル対応)

使用する天気予報API

livedoorの天気予報API「Weather Hacks」を使用します。
Weather Hacks、JSONのAPI仕様はこちら。

実装する

適当なディレクトリに「talk_weather.py」という名前でファイルを作ります。
$ sudo vi talk_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]
        today_w_txt = weather_text % (cast['dateLabel'], cast['telop'])

        # TOMMOROW
        cast = forecasts[1]
        temperature = cast['temperature']
        tommorow_w_txt = weather_text % (cast['dateLabel'], cast['telop'])
        tommorow_t_txt = temperature_text % (cast['dateLabel'], temperature['max']['celsius'], temperature['min']['celsius'])
        
        # SAY
        weather_str = title + ' ' + today_w_txt + ' ' + tommorow_w_txt + ' ' + tommorow_t_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()
サーバーにもアップしてありますので、wget で取得することもできます。
$ sudo wget http://raspi.up.seesaa.net/bin/talk_weather.py

実行する

ファイルを保存したら、下記のように実行します。
$ python talk_weather.py

下記のように、現在時刻と天気予報が文字列として出力されるとともに、音声で読み上げます。
※ 音声データの生成に少し時間がかかります。
$ python talk_weather.py
jsay 3月13日、17時47分30秒
jsay '東京都 東京 の天気 今日の天気は晴れです。 明日の天気は曇のち晴です。 明日の予想最高気温、13度、予想最低気温、4度です。' 


ちなみに

ちなみに東京ではなく、別の地域に変更したい場合は、29行目のcity= の数字を変更します。

29行目 city = '130010';   # ←ここの数字を変更する

地域IDは全国の地点定義表(RSS) の「cityタグ」のidを参照して下さい。(例・佐賀県 伊万里=410020)


タグ:Raspberry Pi


posted by Raspberry Pi at 10:00 | Raspberry Pi | このブログの読者になる | 更新情報をチェックする