虽然是造轮子,不过还是挺好玩的。主要的困难点再于编码问题。还有一个是部分使用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:
- 学习—用 Python 和 OpenCV 检测和跟踪运动对象
- 使用pyaiml机器人模块快速做个和你智能对话的大脑
- 人脸识别考勤系统-第二版本研发手札
- 基于树莓派以及语音与人脸识别的迎宾机器人交互系统开发计划(已完结github中)
- 人脸识别考勤机开发计划
- 让树莓派开机运行Python脚本