天气预报已然成为人们生活中不可缺少的一部分,实时了解气象的优劣,做到第一时间预防是至关重要的。所以,当我们需要外出时,如果能提前知道天气的变化情况,做好预防准备措施,就能让出行变得更加顺利。
本系统为用户提供播报天气情况功能,每天出门前询问“依米”当日的天气情况,它便会告诉你当日温度、能见度、风速等信息,并给用户一些出行建议,做好预防准备,智能家居让出行变得更加简单。具体实现流程如图所示。
调用天气情况功能的关键代码如下:
1. if "天气" in recognition_result:
2. s=recognition_result.replace('。','')
3. s=recognition_result.replace('?','')
4. s=s.replace('请问','')
5. s=s.replace('的天气怎么样','')
6. s=s.replace('天气怎么样','')
7. try:
8. tq=weather.get_wat(s)
9. print(tq)
10. weather.tts("./result/question_result.txt")
11. os.system('mpg123 ase.mp3')
12. except Exception:
13. url = baiduAPI.voiceSynthesis("识别错误,请这样问'某某天气怎么样'")
14. voice.playVoice(url)
15. time.sleep(2)
16. break
用户说出带有关键词“天气”的语句,系统将执行播报天气情况功能。上述代码对用户指令的识别结果进行了一些处理,目的是为了得到语句中的地名,然后通过urllib2.Request调用了和风天气api,获取城市天气情况。
调用接口的关键代码如下:
17. url_weather = 'https://free-api.heweather.net/s6/'+search+'?location='+index+'&key=301daef2824c41d9b3d6e0391011fd4d'
18. print(url_weather)
19. req = urllib2.Request(url_weather)
20. resp = urllib2.urlopen(req)
21. context = resp.read()
22. weather_json = json.loads(context, encoding='utf-8')
通过调用接口我们会得到很多数据,选取部分需要的数据即可。
根据需要我分别获取了实况天气、当日天气和明日天气情况。实况天气的部分代码如下:
23. def get_wat(wt):
24. city_weather_now = city_weather['now']
25. a= city_weather_now['cond_txt'] #天气状况描述
26. b= numtozh(city_weather_now['pres'] ) #气压
27. c= numtozh(city_weather_now['tmp'] ) #温度
28. d= numtozh(city_weather_now['vis']) #能见度
29. e= city_weather_now['wind_dir'] #风向
30. f= city_weather_now['wind_sc'] #风力
31. g= numtozh( city_weather_now['wind_spd']) #风速
32. weather_now_str = "目前天气{0},气压{1}帕斯卡,温度{2}度,能见度{3},风向{4},风力{5},风速{6}级;".format(a,b,c,d,e,f,g)
上述代码返回的结果中包含某些机器难以识别的数字,这使得语音合成出来的效果有点差强人意,比如:-18℃等之类的数据。因此,需要对获取结果中的特殊数字进行相关的处理。特殊数字处理的部分代码如下:
#数字转中文
def numtozh(num):
num_dict = {1: '一', 2: '二', 3: '三', 4: '四', 5: '五', 6: '六', 7: '七',
8: '八', 9: '九', 0: '零'}
num = int(num)
if 100 <= num < 1000:
b_num = num // 100
s_num = (num-b_num*100) // 10
g_num = (num-b_num*100) % 10
if g_num == 0 and s_num == 0:
num = '%s百' % (num_dict[b_num])
elif s_num == 0:
num = '%s百%s%s' % (num_dict[b_num], num_dict.get(s_num, ''), num_dict.get(g_num, ''))
elif g_num == 0:
num = '%s百%s十' % (num_dict[b_num], num_dict.get(s_num, ''))
else:
num = '%s百%s十%s' % (num_dict[b_num], num_dict.get(s_num, ''), num_dict.get(g_num, ''))
elif 10 <= num < 100:
s_num = num // 10
g_num = (num-s_num*10) % 10
if g_num == 0:
g_num = ''
num = '%s十%s' % (num_dict[s_num], num_dict.get(g_num, ''))
elif 0 <= num < 10:
g_num = num
num = '%s' % (num_dict[g_num])
elif -10 < num < 0:
g_num = -num
num = '零下%s' % (num_dict[g_num])
elif -100 < num <= -10:
num = -num
s_num = num // 10
g_num = (num-s_num*10) % 10
if g_num == 0:
g_num = ''
num = '零下%s十%s' % (num_dict[s_num], num_dict.get(g_num, ''))
return num
上述代码是将获取到的天气情况中的特殊数字转化为中文字体,便于机器语音合成出用户能听懂的语言。
将处理后的结果写入文件,通过百度语言合成保存为ase.mp3的音频文件,最后在主程序中播放该文件即可。