前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python根据ip获取地理位置再查询天气情况调百度语音合成朗读

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

作者头像
十四君
发布2019-11-27 23:54:15
9340
发布2019-11-27 23:54:15
举报
文章被收录于专栏:UrlteamUrlteam

虽然是造轮子,不过还是挺好玩的。主要的困难点再于编码问题。还有一个是部分使用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 + "\r\n"
                output += "更新时间:" + ret_data["date"] + " " + ret_data["time"] + "\r\n"
                output += "天气:" + ret_data["weather"] + " [" + ret_data["WD"] + ret_data["WS"] + "]\r\n"
                output += "当前温度:" + ret_data["temp"] + " (" + ret_data["h_tmp"] + " ---> " + ret_data["l_tmp"] + ")\r\n"
                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
'''

QQ截图20160123135304
QQ截图20160123135304

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

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

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=%E5%9F%8E%E5%B8%82%E5%90%8D:%E6%9D%AD%E5%B7%9E%20%E6%9B%B4%E6%96%B0%E6%97%B6%E9%97%B4:16-01-23%2018:00%20%E5%A4%A9%E6%B0%94:%E5%A4%9A%E4%BA%91%20[%E6%97%A0%E6%8C%81%E7%BB%AD%E9%A3%8E%E5%90%916-7%E7%BA%A7(34~43km/h)]%20%E5%BD%93%E5%89%8D%E6%B8%A9%E5%BA%A6:-8%20(0%20—%3E%20-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脚本
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-01-232,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 整体框架:
  • get_ip.py
    • 1.天气查询.py
      • Related posts:
      相关产品与服务
      语音合成
      语音合成(Text To Speech,TTS)满足将文本转化成拟人化语音的需求,打通人机交互闭环。提供多场景、多语言的音色选择,支持 SSML 标记语言,支持自定义音量、语速等参数,让发音更专业、更符合场景需求。语音合成广泛适用于智能客服、有声阅读、新闻播报、人机交互等业务场景。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档