当前位置 主页 > 网站技术 > 代码类 >

    python实现智能语音天气预报

    栏目:代码类 时间:2019-12-02 21:06

    python编写的语音天气预报

    本系统主要包括四个函数:

    1、获取天气数据

    1、输入要查询天气的城市

    2、利用urllib模块向中华万年历天气api接口请求天气数据

    3、利用gzip解压获取到的数据,并编码utf-8

    4、利用json转化成python识别的数据,返回为天气预报数据复杂形式的字典(字典中的字典)

    2、输出当天天气数据

    1、格式化输出当天天气,包括:天气状况,此时温度,最高温度、最低温度,风级,风向等。

    3,语音播报当天天气

    1、创建要输出的语音文本(weather_forecast_txt)

    2、利用百度的语音合成模块AipSpeech,合成语音文件

    3,利用playsound模块播放语音

    4、未来几天温度变化趋势

    1、创建未来几天高低温数据的字典

    2,利用matplotlib模块,图形化温度变化趋势

    5、代码

    #导入必要模块
    import urllib.parse
    import urllib.request
    import gzip
    import json
    import playsound
    from aip import AipSpeech
    import matplotlib.pyplot as plt
    import re
    #设置参数,图片显示中文字符,否则乱码
    plt.rcParams['font.sans-serif']=['SimHei']
    #定义获取天气数据函数
    def Get_weather_data():
      print('------天气查询------')
      city_name = input('请输入要查询的城市名称:')
      url = 'http://wthrcdn.etouch.cn/weather_mini?city=' + urllib.parse.quote(city_name)
      weather_data = urllib.request.urlopen(url).read()
      # 读取网页数据
      weather_data = gzip.decompress(weather_data).decode('utf-8')
      # #解压网页数据
      weather_dict = json.loads(weather_data)
      return weather_dict
    #定义当天天气输出格式
    def Show_weather(weather_data):
      weather_dict = weather_data
      if weather_dict.get('desc') == 'invilad-citykey':
        print('你输入的城市有误或未收录天气,请重新输入...')
      elif weather_dict.get('desc') == 'OK':
        forecast = weather_dict.get('data').get('forecast')
        print('日期:', forecast[0].get('date'))
        print('城市:', weather_dict.get('data').get('city'))
        print('天气:', forecast[0].get('type'))
        print('温度:', weather_dict.get('data').get('wendu') + '℃ ')
        print('高温:', forecast[0].get('high'))
        print('低温:', forecast[0].get('low'))
        print('风级:', forecast[0].get('fengli').split('<')[2].split(']')[0])
        print('风向:', forecast[0].get('fengxiang'))
        weather_forecast_txt = '您好,您所在的城市%s,' \
                    '天气%s,' \
                    '当前温度%s,' \
                    '今天最高温度%s,' \
                    '最低温度%s,' \
                    '风级%s,' \
                    '温馨提示:%s' % \
                    (
                      weather_dict.get('data').get('city'),
                      forecast[0].get('type'),
                      weather_dict.get('data').get('wendu'),
                      forecast[0].get('high'),
                      forecast[0].get('low'),
                      forecast[0].get('fengli').split('<')[2].split(']')[0],
                      weather_dict.get('data').get('ganmao')
                    )
        return weather_forecast_txt,forecast
    #定义语音播报今天天气状况
    def Voice_broadcast(weather_forcast_txt):
      weather_forecast_txt = weather_forcast_txt
      APP_ID = 你的百度语音APP_ID
      API_KEY = 你的百度语音API_KEY
      SECRET_KEY = 你的百度语音SECRET_KEY
      client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
      print('语音提醒:', weather_forecast_txt)
      #百度语音合成
      result = client.synthesis(weather_forecast_txt, 'zh', 1, {'vol': 5})
      if not isinstance(result, dict):
        with open('sound2.mp3', 'wb') as f:
          f.write(result)
          f.close()
      #playsound模块播放语音
      playsound.playsound(r'C:\Users\ban\Desktop\bsy\sound2.mp3')
    #未来四天天气变化图
    def Future_weather_states(forecast):
      future_forecast = forecast
      dict={}
      #获取未来四天天气状况
      for i in range(5):
        data = []
        date=future_forecast[i]['date']
        date = int(re.findall('\d+',date)[0])
        data.append(int(re.findall('\d+',future_forecast[i]['high'])[0]))
        data.append(int(re.findall('\d+', future_forecast[i]['low'])[0]))
        data.append(future_forecast[i]['type'])
        dict[date] = data
      data_list = sorted(dict.items())
      date=[]
      high_temperature = []
      low_temperature = []
      for each in data_list:
        date.append(each[0])
        high_temperature.append(each[1][0])
        low_temperature.append(each[1][1])
      fig = plt.plot(date,high_temperature,'r',date,low_temperature,'b')
      plt.xlabel('日期')
      plt.ylabel('℃')
      plt.legend(['高温','低温'])
      plt.xticks(date)
      plt.title('最近几天温度变化趋势')
      plt.show()
    #主函数
    if __name__=='__main__':
      weather_data = Get_weather_data()
      weather_forecast_txt, forecast = Show_weather(weather_data)
      Future_weather_states(forecast)
      Voice_broadcast(weather_forecast_txt)