Raspberry Π

Raspberry Piでいろんなことをやってみようというブログです。

mincraft

現在時刻と今日・明日の天気を喋らせるようにする

前回は入力した言葉を喋らせるようにしたので、
今回は現在時刻と今日・明日の天気を喋らせるようにします。
f:id:taka230035:20161001210027j:plain:w300



参照サイトは同じで
Raspberry Piに現在時刻と、天気をしゃべらせてみた(Python)

今回もpythonのバージョンなどが原因か、参照サイトのプログラムでうまくいかず、
結果自分で調査・修正した部分があります。




Raspberry Piの状況

すでにRaspberry PiにOpenJTalkをインストールしていて、シェルスクリプトで喋る状況としておくことが条件です。
まだの場合は

rasp0035.hatenablog.com

を参照してください。



Pythonより現在時刻と今日・明日の天気を取得

Pythonでの情報取得スクリプトは以下です。
バージョンにより
subprocess.Popen(shlex.split..
の部分でエラーが出て、調査で時間がかかりました。
注意点もあり、それは後述します。

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

import shlex
import subprocess

from datetime import datetime

import urllib2
import json

CMD_SAY = './jtalk.sh'#注意

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),shell=False)
proc.communicate()
return

def say_weather():
city = '130010'; #注意
json_url = 'http://weather.livedoor.com/forecast/webservice/json/v1' #注意

weather_text = u'%sの天気は%sです。'

try:
r = urllib2.urlopen('%s?city=%s' % (json_url, city) )
obj = json.loads( unicode(r.read()) )

title = obj['title']
forecasts = obj['forecasts']

#今日
cast = forecasts[0]
temperature = cast['temperature']
today_w_txt = weather_text % (cast['dateLabel'], cast['telop'])

#明日
cast = forecasts[1]
temperature = cast['temperature']
tommorow_w_txt = weather_text % (cast['dateLabel'], cast['telop'])

#言葉
weather_str = today_w_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),shell=False)
proc.communicate()
finally:
r.close()

return


if __name__ == "__main__":
main()






スクリプトの注意点

上記スクリプトの注意点がいくつかあります。

・CMD_SAY = './jtalk.sh'
 ここはOpenJTalkを使って喋らせるスクリプトのファイル名を記載します。

・d = datetime.now()
 ここで、Raspberry Piに設定されているlocale時刻を取得しているため、
 住んでいる場所と一致していることです。

・city = '130010';
 上記では東京を参照したいので、130010としています。
 参照都市を帰る場合は数値を変更します。

json_url = 'http://weather.livedoor.com/forecast/webservice/json/v1'
 天気情報取得方法として、
 livedoorAPIを使用しています。
 APIのURLが時期により変更になる可能性があります。

・気温も取得できるのですが。。(参照サイトでは取得している)
 どうやら明日の分しか取得できないようです。
 なので、今回は省略しました。
 自分が使用するシチュエーションとしては、朝なのでその日の気温が知りたいです。




課題

今回の場合、例えば出先のPC上でRaspberry PiPythonコマンドをたたくと、家のRaspberry Pi上で喋るようにさせたらどうかと思いつきました。

ですが、ブラウザからPythonコマンドの実行を試みたがうまくいかなかったです。
実行はされているようですが、うまく喋ってくれないです。

ブラウザ 
-> http接続
-> 自宅のRaspberry pi
-> PHP
-> Python
-> 音声のシェルスクリプト

とやっているが。。どうしても音を発しません。
知識がないので諦めます。

以上。