13
Python に 天気予報を聞いてみた @kawatomo.0331

Python に天気予報を聞いてみた

Embed Size (px)

Citation preview

Page 1: Python に天気予報を聞いてみた

Python に 天気予報を聞いてみた

@kawatomo.0331

Page 2: Python に天気予報を聞いてみた

はじめに

• 自己紹介

• 千葉県で Unity(c#) 関係の仕事をしています

• LTに参加したきっかけ

• Python 入門者向けハンズオンの懇親会で巻き込まれた

Page 3: Python に天気予報を聞いてみた

天気予報の取得• お天気Webサービス(Livedoor Weather Web Service)

• 千葉の天気情報を取得

• http://weather.livedoor.com/forecast/webservice/json/v1?city=120010

• 結果は JSON 形式

• 上のリンクをブラウザから見てみると…

Page 4: Python に天気予報を聞いてみた

{'pinpointLocations': [{'name': '千葉市', 'link': 'http://weather.livedoor.com/area/forecast/1210000'}, {'name': '市川市', 'link': 'http://weather.livedoor.com/area/forecast/1220300'}, {'name': '船橋市', 'link': 'http://weather.livedoor.com/area/forecast/1220400'}, {'name': '松戸市', 'link': 'http://weather.livedoor.com/area/forecast/1220700'}, {'name': '野田市', 'link': 'http://weather.livedoor.com/area/forecast/1220800'}, {'name': '成田市', 'link': 'http://weather.livedoor.com/area/forecast/1221100'}, {'name': '佐倉市', 'link': 'http://weather.livedoor.com/area/forecast/1221200'}, {'name': '習志野市', 'link': 'http://weather.livedoor.com/area/forecast/1221600'}, {'name': '柏市', 'link': 'http://weather.livedoor.com/area/forecast/1221700'}, {'name': '市原市', 'link': 'http://weather.livedoor.com/area/forecast/1221900'}, {'name': '流山市', 'link': 'http://weather.livedoor.com/area/forecast/1222000'}, {'name': '八千代市', 'link': 'http://weather.livedoor.com/area/forecast/1222100'}, {'name': '我孫子市', 'link': 'http://weather.livedoor.com/area/forecast/1222200'}, {'name': '鎌ケ谷市', 'link': 'http://weather.livedoor.com/area/forecast/1222400'}, {'name': '浦安市', 'link': 'http://weather.livedoor.com/area/forecast/1222700'}, {'name': '四街道市', 'link': 'http://weather.livedoor.com/area/forecast/1222800'}, {'name': '八街市', 'link': 'http://weather.livedoor.com/area/forecast/1223000'}, {'name': '印西市', 'link': 'http://weather.livedoor.com/area/forecast/1223100'}, {'name': '白井市', 'link': 'http://weather.livedoor.com/area/forecast/1223200'}, {'name': '富里市', 'link': 'http://weather.livedoor.com/area/forecast/1223300'}, {'name': '酒々井町', 'link': 'http://weather.livedoor.com/area/forecast/1232200'}, {'name': '栄町', 'link': 'http://weather.livedoor.com/area/forecast/1232900'}], 'title': '千葉県 千葉 の天気', 'copyright': {'title': '(C) LINE Corporation', 'link': 'http://weather.livedoor.com/', 'image': {'title': 'livedoor 天気情報', 'height': 26, 'url': 'http://weather.livedoor.com/img/cmn/livedoor.gif', 'width': 118, 'link': 'http://weather.livedoor.com/'}, 'provider': [{'name': '日本気象協会', 'link': 'http://tenki.jp/'}]}, 'forecasts': [{'image': {'title': '晴れ', 'url': 'http://weather.livedoor.com/img/icon/1.gif', 'width': 50, 'height': 31}, 'temperature': {'min': None, 'max': {'celsius': '11', 'fahrenheit': '51.8'}}, 'date': '2016-01-27', 'dateLabel': '今日', 'telop': '晴れ'}, {'image': {'title': '晴れ', 'url': 'http://weather.livedoor.com/img/icon/1.gif', 'width': 50, 'height': 31}, 'temperature': {'min': {'celsius': '2', 'fahrenheit': '35.6'}, 'max': {'celsius': '13', 'fahrenheit': '55.4'}}, 'date': '2016-01-28', 'dateLabel': '明日', 'telop': '晴れ'}], 'location': {'city': '千葉', 'prefecture': '千葉県', 'area': '関東'}, 'link': 'http://weather.livedoor.com/area/forecast/120010', 'publicTime': '2016-01-27T05:00:00+0900', 'description': {'text': ' 西日本から東日本は、東シナ海に中心を持つ高気圧に覆われています。\n\n 千葉県は、晴れています。\n\n 27日は、高気圧に覆われて、晴れる見込みです。\n\n 28日は、高気圧に覆われて晴れますが、夜は気圧の谷が接近してくるた\nめ、次第に雲が広がるでしょう。\n\n 太平洋沿岸では、27日から28日にかけて、波がやや高い見込みです。', 'publicTime': '2016-01-27T04:32:00+0900'}}

Page 5: Python に天気予報を聞いてみた

Python#!/usr/bin/env python# -*- coding: utf-8 -*-

import requests

json_url = 'http://weather.livedoor.com/forecast/webservice/json/v1'# 地域コード:千葉県payload = {'city': '120010'}

response = requests.get(json_url, params=payload)json = response.json()text = json['description']['text']

print(text)

実行するためには事前に “pip install requests” が必要になります

Page 6: Python に天気予報を聞いてみた

実行結果 西日本から東日本は、東シナ海に中心を持つ高気圧に覆われています。

千葉県は、晴れています。

27日は、高気圧に覆われて、晴れる見込みです。

28日は、高気圧に覆われて晴れますが、夜は気圧の谷が接近してくるため、次第に雲が広がるでしょう。

太平洋沿岸では、27日から28日にかけて、波がやや高い見込みです。

Python で天気予報が取得できました

Page 7: Python に天気予報を聞いてみた

おまけ 天気予報を喋らせてみた

Python 成分が少し減ります…

Page 8: Python に天気予報を聞いてみた

Raspberry Pi を用意 

Page 9: Python に天気予報を聞いてみた

Raspberry Pi で喋らせる• 最初から Python が入っているけど少し古いので新しくする

• pyenv, pyenv-virtualenv

• たぷん日記のラズパイに喋ってもらう作戦を参考に環境構築

• http://www.tapun.net/raspi/raspberry-pi-speaks-japanese

• Open Jtalk というオープンソースの日本語音声合成エンジンを利用

• mplayer をインストール (任意)

Page 10: Python に天気予報を聞いてみた

←の部分 (jsay.sh) Python にできないかな…

Page 11: Python に天気予報を聞いてみた

#!/usr/bin/env python# -*- coding:utf-8 -*-

import subprocessimport shleximport tempfileimport os

def debug_print(tag,obj): if __debug__: print('[%s]:%s'% (tag, obj))

def execute(message):

with tempfile.NamedTemporaryFile() as temp_text_f, tempfile.NamedTemporaryFile() as temp_wav_f:

temp_text_f.write(message.encode('utf-8')) temp_text_f.seek(0)

debug_print('text path',temp_text_f.name) debug_print('wav path', temp_wav_f.name) debug_print('text',temp_text_f.read().decode('utf-8'))

jtalk_dic_path = '/usr/local/share/open_jtalk/open_jtalk_dic_utf_8-1.09/' voice_path = '/usr/local/share/hts_voice/mei/mei_normal.htsvoice'

jtalk_command = '/usr/local/bin/open_jtalk -x %s -m %s -ow %s %s' % (jtalk_dic_path, voice_path, temp_wav_f.name, temp_text_f.name)

debug_print('jtalk command', jtalk_command)

subprocess.check_call(shlex.split(jtalk_command))

mplayer_command = '/usr/bin/mplayer %s' % (temp_wav_f.name)

if __debug__: subprocess.check_call(shlex.split(mplayer_command)) else: with open(os.devnull, 'w') as fnull: result = subprocess.check_call(shlex.split(mplayer_command), stdout = fnull, stderr = fnull)

if __name__ == '__main__': execute('こんにちは')

jsay.sh -> jsay.py

Page 12: Python に天気予報を聞いてみた

jsay.py を呼ぶ#!/usr/bin/env python# -*- coding:utf-8 -*-

import requestsimport jsay

json_url = 'http://weather.livedoor.com/forecast/webservice/json/v1'payload = {'city': '120010'}

response = requests.get(json_url, params=payload)json = response.json()text = json['description']['text']

speech = text.replace('\n','').replace('\r','').replace(' ','')

jsay.execute(speech)

赤枠は変更・追加部分です

Page 13: Python に天気予報を聞いてみた

天気予報を喋らせてみた