通过http方式 post天气,并合成语音

摘要:
#coding=utf-8importsysimportjsonimportpygameimporttimeIS_PY3=sys.version_info.major==3ifIS_PY3:importrequestsfromurllib.requestimporturluopenfromlib.requestimportrequestfromlib.errorportURLError
# coding=utf-8
import sys
import json
import pygame
import time

IS_PY3 = sys.version_info.major == 3
if IS_PY3:
    import requests
    from urllib.request import urlopen
    from urllib.request import Request
    from urllib.error import URLError
    from urllib.parse import urlencode
    from urllib.parse import quote_plus
else:
    import urllib2
    from urllib import quote_plus
    from urllib2 import urlopen
    from urllib2 import Request
    from urllib2 import URLError
    from urllib import urlencode

API_KEY = 'TutBVkq5Mv8gE7LqfulErVs9'
SECRET_KEY = 'U8qtLfZQQ3qR12TiS7ZLjTxrdXjiQiNU'

# 发音人选择, 基础音库:0为度小美,1为度小宇,3为度逍遥,4为度丫丫,
# 精品音库:5为度小娇,103为度米朵,106为度博文,110为度小童,111为度小萌,默认为度小美 
PER = 1
# 语速,取值0-15,默认为5中语速
SPD = 5
# 音调,取值0-15,默认为5中语调
PIT = 5
# 音量,取值0-9,默认为5中音量
VOL = 5
# 下载的文件格式, 3:mp3(default) 4: pcm-16k 5: pcm-8k 6. wav
AUE = 3

FORMATS = {3: "mp3", 4: "pcm", 5: "pcm", 6: "wav"}
FORMAT = FORMATS[AUE]

CUID = "123456PYTHON"

TTS_URL = 'http://tsn.baidu.com/text2audio'


class DemoError(Exception):
    pass


"""  TOKEN start """

TOKEN_URL = 'http://openapi.baidu.com/oauth/2.0/token'
SCOPE = 'audio_tts_post'  # 有此scope表示有tts能力,没有请在网页里勾选

def play():
    file = r'result.mp3'
    pygame.mixer.init()
    print("播放天气:")
    pygame.mixer.music.load(file)

    pygame.mixer.music.play()
    time.sleep(15)
    pygame.mixer.music.stop()
    print("播放完毕。")

def fetch_token():
    # print("fetch token begin")
    params = {'grant_type': 'client_credentials',
              'client_id': API_KEY,
              'client_secret': SECRET_KEY}
    post_data = urlencode(params)

    post_data = post_data.encode('utf-8')
    req = Request(TOKEN_URL, post_data)
    try:
        f = urlopen(req, timeout=5)
        result_str = f.read()
    except URLError as err:
        print('token http response http code : ' + str(err.code))
        result_str = err.read()

        result_str = result_str.decode()

    # print(result_str)
    result = json.loads(result_str)
    # print(result)
    if ('access_token' in result.keys() and 'scope' in result.keys()):
        if not SCOPE in result['scope'].split(' '):
            raise DemoError('scope is not correct')
        # print('SUCCESS WITH TOKEN: %s ; EXPIRES IN SECONDS: %s' % (result['access_token'], result['expires_in']))
        return result['access_token']
    else:
        raise DemoError('MAYBE API_KEY or SECRET_KEY not correct: access_token or scope not found in token response')


"""  TOKEN end """

if __name__ == '__main__':

    print("请输入要查询的天气:")

    r = requests.get('http://wthrcdn.etouch.cn/weather_mini?city=' + input())
    r.encoding='utf-8'
    weather = r.json()
    text_weather = '今日'+ weather['data']['city'] + ',' + weather['data']['forecast'][0]['type']  + ',' + weather['data']['forecast'][0]['date'] + ',' + 
    weather['data']['forecast'][0]['high']+ ',' + weather['data']['forecast'][0]['low'] + ',' + weather['data']['ganmao']

    token = fetch_token()
    tex = quote_plus(text_weather)  # 此处TEXT需要两次urlencode
    # print(tex)
    params = {'tok': token, 'tex': tex, 'per': PER, 'spd': SPD, 'pit': PIT, 'vol': VOL, 'aue': AUE, 'cuid': CUID,
              'lan': 'zh', 'ctp': 1}  # lan ctp 固定参数

    data = urlencode(params)
    # print('test on Web Browser' + TTS_URL + '?' + data)

    req = Request(TTS_URL, data.encode('utf-8'))
    has_error = False
    try:
        f = urlopen(req)
        result_str = f.read()

        headers = dict((name.lower(), value) for name, value in f.headers.items())

        has_error = ('content-type' not in headers.keys() or headers['content-type'].find('audio/') < 0)
    except  URLError as err:
        print('asr http response http code : ' + str(err.code))
        result_str = err.read()
        has_error = True

    save_file = "error.txt" if has_error else 'result.' + FORMAT
    with open(save_file, 'wb') as of:
        of.write(result_str)

    if has_error:
        result_str = str(result_str, 'utf-8')
        print("tts api  error:" + result_str)

    # print("result saved as :" + save_file)

    play()

  

免责声明:文章转载自《通过http方式 post天气,并合成语音》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇drf—— drf的请求与响应User-agent大全下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JavaScript键盘鼠标事件处理

监听键盘鼠标事件 监听某个按键事件 当键盘上的某个键被按下时,会依次触发一次下面的事件: onkeydown: 键盘按下这个动作(按下键盘) onkeypress: 键盘被按住(一直按着键盘不动) onkeyup: 键盘被弹起(松开键盘) 通过监听keydown事件既可以知道键盘被按下: document.onkeydown = function(ev...

Java NIO学习系列七:Path、Files、AsynchronousFileChannel

相对于标准Java IO中通过File来指向文件和目录,Java NIO中提供了更丰富的类来支持对文件和目录的操作,不仅仅支持更多操作,还支持诸如异步读写等特性,本文我们就来学习一些Java NIO提供的和文件相关的类: Java NIO Path Java NIO Files Java NIO AsynchronousFileChannel 总结 1....

layui动态创建Tab、Tab右键功能

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-...

使用PostgreSQL的bytea字段存读取文件及读取出错问题处理

  PostgreSQL中的bytea字段类型可以以二进制的形式存储数据,这样做的好处就是可以将原本存储在网站目录下的文件存储到数据库中,坏处就是如果文件过多、过大的话,就会导致数据库的数据量大大增加,备份和恢复的时候就会浪费大量的时间,而且数据也有可能会出错。个人觉得,在文件量小的情况下,使用这种存储方式还是很方便的。   言归正传,下面介绍一下使用by...

U_Net原理及tensorflow的实现

Unet——用于图像边缘检测,是FCN的改进 如上图是UNET的架构图,可以发现器输入图像和输出图像不一致,如果我们需要输入图像和输出图像一致时,在卷积时,使用padding=“SAME”即可,然后再边缘检测时,就相当与像素级别的二分类问题,用交叉熵做loss函数即可。但位置检测常用IOU作为loss函数。 个人觉得UNET的优点: 1.Unet的去除了...

为Office365增加密码过期自动提醒功能

最近有人和我反应,无法查看所有员工的Office365的密码过期时间。最好可以批量查看,如果能在过期前几天发个提醒邮件就更好了。 $pw = ConvertTo-SecureString 'your_pwd' -AsPlainText -Force $creds = New-Object -Typename System.Management.Automa...