python根据ip获取地理位置再查询天气情况调百度语音合成朗读

2019-11-27 23:54:15 浏览数 (1)

虽然是造轮子,不过还是挺好玩的。主要的困难点再于编码问题。还有一个是部分使用python2.7的代码和python3.4之间的兼容性问题。代码发布在github中。https://github.com/luyishisi/The_python_code/tree/master/automatic_weather

整体框架:

分成三个程序文件。get_ip.py  和 get_yuyin_hecheng.py 还有 1.天气查询.py

思路很明显:首先通过get_ip.py  获取ip同时进行地址的查询,然后进行编码的转换,得到杭州这样的城市名,这阶段主要的问题是编码格式问题,还有就是我很郁闷的2.7和3.4的版本问题。因为暂时没有办法解决就使用文件沟通的方式来处理。

其次,运行1.天气查询,能通过文件操作就读取到默认的位置信息,通过调用api获取天气信息。再保存到文件里。最后则是调用百度语音合成api,一开始还以为很麻烦。后来才发现原来调用百度的语音合成api只需要将要合成的字符串放在网址中,各种参数也是。然后浏览器打开就可以播放声音。然后就采用mpg123的方式,结合在程序中播放声音。这个阶段主要的问题是linux和window下环境不同,所以播放方式不同意,如果需要测试的话,请获取到网址直接复制到浏览器中测试把。

get_ip.py

以下请用python2.7运行。因为httplib的环境问题,暂时用2.7的顶一下,数据采用文件沟通的方式。

代码语言:javascript复制
#!/usr/bin/env python
#coding:UTF-8
 
import urllib2, httplib
from BeautifulSoup import BeautifulSoup
 
def getIpAddr():
    '''从http://www.ip.cn网站获取外网ip和地理位置'''
    url = 'http://www.ip.cn'
    html = urllib2.urlopen(url).read()
    soup = BeautifulSoup(html)
    # 通过

标签找到位置信息 find_div = soup.find(‘div’,{‘class’:’well’}) ip = find_div.code.text # 定位地理位置信息 # 1.获得中文地理位置 no = find_div.contents[0].text.find(‘;’) addr = find_div.contents[0].text[no 1:] # 2.获取en文地理位置 #GeoIP: Nanjing, Jiangsu, China

addrEn = find_div.contents[1].text # 得到拼音字符串,然后进行分割,得到addr列表 addrEn = addrEn.split(‘:’) # addr取原列表中的最后一个元素 addrEn = addrEn[-1] # 将包含位置信息的字符串用’,’再次分割,得到城市、省份 addrEn = addrEn.split(‘,’) # 去除字符串两边多余的空格 print ‘外网IP:’, ip print addr for n in range(len(addrEn)): addrEn[n] = addrEn[n].strip() print addrEn[n], # 逗号是为了print后不换行 #进一步化 浙江省杭州市—》杭州 name = addr if name.find(u”省”) !=-1:# 包含’省’ #print u’有省’ name=name.split(u’省’)[1] if name.find(u”市”) != -1:#包含‘市’ #print u’有市’ me = addr if name.find(u”省”) !=-1:# 包含’省’ #print u’有省’ name=name.split(u’省’)[1] if name.find(u”市”) != -1:#包含‘市’ #print u’有市’ name=name.split(u’市’)[0] print (name) fileHandle = open ( ‘test.txt’, ‘w’ ) fileHandle.write ( name ) fileHandle.close() if __name__ == ‘__main__’: getIpAddr()

这里是处理从获取到的数据中截取到城市名的方法。

1

下面的程序是处理天气查询方面的

1.天气查询.py

请用python3运行

代码语言:javascript复制
__author__ = 'luyi'
import os
import urllib.request
import urllib.parse
import json
class weather(object):
    # 获取城市代码的uri
    code_uri = "http://apistore.baidu.com/microservice/cityinfo?cityname="
    # 获取天气信息的uri
    weather_uri = "http://apistore.baidu.com/microservice/weather?cityid="
    # 主处理逻辑
    def mainHandle(self):
 
        #city_name = input("输入你要查询的天气:")
        fileHandle = open ( 'test.txt', 'r' ) 
        city_name = fileHandle.read() 
        fileHandle.close() 
        #这里是用文件沟通的方式。解决python 3。4和2.7的兼容问题
 
        uri = self.code_uri   urllib.parse.quote(city_name)
        #获取该城市天气情况的网址
        print("查询中请等待")
        ret = json.loads(urllib.request.urlopen(uri).read().decode("utf8"))
        if ret['errNum'] != 0:
            print(ret['retMsg'])
            return False
        #查询失败
        else:
        #查询成功使用json解析
        #需要更详细信息,请看百度api的说明文档。使用方法类似。
            weather_uri = self.weather_uri   ret['retData']['cityCode']
            data = json.loads(urllib.request.urlopen(weather_uri).read().decode("utf8"))
            if data['errNum'] == 0:
                ret_data = data['retData']
                output = "城市名:"   city_name   "rn"
                output  = "更新时间:"   ret_data["date"]   " "   ret_data["time"]   "rn"
                output  = "天气:"   ret_data["weather"]   " ["   ret_data["WD"]   ret_data["WS"]   "]rn"
                output  = "当前温度:"   ret_data["temp"]   " ("   ret_data["h_tmp"]   " ---> "   ret_data["l_tmp"]   ")rn"
                print(output)
                return True
            else:
                print(data['errMsg'])
                return False
if __name__ == "__main__":
    weather = weather()
    weather.mainHandle()
    a = input("按任意键退出")

下面的部分是调用百度语音合成对天气情况进行朗读的部分

代码语言:javascript复制
# -*- coding: utf-8 -*-
 
import os
import urllib.request
import sys
import json
 
'''
def get_token():
    apiKey = "Ll0c53MSac6GBOtpg22ZSGAU"
    secretKey = "44c8af396038a24e34936227d4a19dc2"
 
    auth_url = "https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id="   apiKey   "&client_secret="   secretKey;
 
    res = urllib.request.urlopen(auth_url) 
    print(res.read())
    json_data = res.read()
    
    return json.loads(json_data)['access_token']
'''
if __name__ == "__main__":
    #token = get_token()
 
    fileHandle = open ( 'weather.txt', 'r' ) 
    weather = fileHandle.read() 
    fileHandle.close() 
 
    
    #url = "http://tsn.baidu.com/text2audio?tex=" sys.argv[1] "&lan=zh&per=1&pit=1&spd=7&cuid=7519663&ctp=1&tok=" token
    url = "http://tsn.baidu.com/text2audio?tex=" weather "&lan=zh&per=1&pit=1&spd=7&cuid=7519663&ctp=1&tok=24.91b892cbba2c73d07f9fba69182b7960.2592000.1456136364.282335-7519663"
 
 
    os.system('mpg123 "%s"'%(url))
    #这个在linux可以运行的。也可以自行从我git下载mpg123.然后在window命令行运行。
    a = input()
    #print(token)
 
    #测试数据
    #24.91b892cbba2c73d07f9fba69182b7960.2592000.1456136364.282335-7519663
'''
http://tsn.baidu.com/text2audio?tex=城市名:杭州
 
更新时间:16-01-23 18:00
 
天气:多云 [无持续风向6-7级(34~43km/h)]
 
当前温度:-8 (0 ---> -8)&lan=zh&per=0&pit=5&spd=7&cuid=7519663&ctp=1&tok=24.91b892cbba2c73d07f9fba69182b7960.2592000.1456136364.282335-7519663&qq-pf-to=pcqq.c2c
'''

需要测试一下语音合成效果的朋友可以点击这个链接

关于播放语音这个问题再补充点:

mpg123,mpg123是一个非常便捷高效的Linux命令行播放器,安装mpg123的命令是:

sudo apt-get install mpg123

man mpg123来查看基本使用,

我们可以试试这个命令,如果能听到悠扬的歌声,则说明你的mpg123 以及扬声器工作正常

mpg123 “http://music.baidutt.com/up/kwcawskw/dscskw.mp3”

我用的是百度的语音合成,百度的语音合成能够自定义音调,语速,男女声,这能够做出很多好玩的声音,百度语音的地址是: http://yuyin.baidu.com

你需要注册账号,注册一个新应用,获得一个id和key,然后用这个id和key获取token,然后就可以通过拼接url的方式来合成语音了,具体的拼接方式是:

http://tsn.baidu.com/text2audio?tex=大家好我是你懂得&lan=zh&per=0&pit=9&spd=9&cuid=***&ctp=1&tok=xxxxxxx

tex是要合成的语音内容,per是声音的性别,1是男,0是女,默认是女,pit是音调,spd是语速,调节范围都是1-9,最后的tok是你通过你的id和key获取到的token,具体的获取方式见百度语音的文档。总之,现在你直接在浏览器打开这个链接,就可以听到合成的语音了,你在树莓派里面输入命令

mpg123 “http://tsn.baidu.com/text2audio?tex=大家好我是机器人&lan=zh&per=0&pit=9&spd=9&cuid=***&ctp=1&tok=xxxxxxx”

就可以从树莓派的喇叭里面听到它说这句话了。

完成上面的程序之后,这样一来,我们只需要输入命令

python read.py 合成文字内容

来很方便的合成语音了。

http://tsn.baidu.com/text2audio?tex=城市名:杭州 更新时间:16-01-23 18:00 天气:多云 [无持续风向6-7级(34~43km/h)] 当前温度:-8 (0 —> -8)&lan=zh&per=0&pit=5&spd=7&cuid=7519663&ctp=1&tok=24.91b892cbba2c73d07f9fba69182b7960.2592000.1456136364.282335-7519663&qq-pf-to=pcqq.c2c

想要集成到python中使用则。。 当然要导入这个库拉 subprocess 使用方式,如果命令中有空格,则需要如下的方式用法。 subprocess.call([“mpg123″,”http://music.baidutt.com/up/kwcawskw/dscskw.mp3”])

原创文章,转载请注明: 转载自URl-team

本文链接地址: python根据ip获取地理位置再查询天气情况调百度语音合成朗读

Related posts:

  1. 学习—用 Python 和 OpenCV 检测和跟踪运动对象
  2. 使用pyaiml机器人模块快速做个和你智能对话的大脑
  3. 人脸识别考勤系统-第二版本研发手札
  4. 基于树莓派以及语音与人脸识别的迎宾机器人交互系统开发计划(已完结github中)
  5. 人脸识别考勤机开发计划
  6. 让树莓派开机运行Python脚本

0 人点赞