智能聊天功能——天气情况篇

天气预报已然成为人们生活中不可缺少的一部分,实时了解气象的优劣,做到第一时间预防是至关重要的。所以,当我们需要外出时,如果能提前知道天气的变化情况,做好预防准备措施,就能让出行变得更加顺利。
本系统为用户提供播报天气情况功能,每天出门前询问“依米”当日的天气情况,它便会告诉你当日温度、能见度、风速等信息,并给用户一些出行建议,做好预防准备,智能家居让出行变得更加简单。具体实现流程如图所示。
在这里插入图片描述
调用天气情况功能的关键代码如下:

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的音频文件,最后在主程序中播放该文件即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值