百度语音合成tty

# coding=utf-8
import sys
import json

#判断python版本 从而加载库
IS_PY3 = sys.version_info.major == 3   
if IS_PY3:
    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的接口
API_KEY = '4E1BG9lTnlSeIf1NQFlrSq6h'
SECRET_KEY = '544ca4657ba8002e3dea3ac2f5fdd241'

#合成的文本
TEXT = "欢迎使用百度语音合成。"

# 发音人选择, 0为普通女声,1为普通男生,3为情感合成-度逍遥,4为情感合成-度丫丫,默认为普通女声
PER = 4
# 语速,取值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]

#用户唯一标识,用来区分用户,计算UV值。建议填写能区分用户的机器 MAC 地址或 IMEI 码,长度为60字符以内。
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能力,没有请在网页里勾选

#f获取令牌开始
def fetch_token():
    print("fetch token begin")
    #参数收集
    params = {'grant_type': 'client_credentials',
              'client_id': API_KEY,
              'client_secret': SECRET_KEY}  
     #对服务器请求数据进行编码 基于字符编码
    post_data = urlencode(params)
    #判断 如果是python3 进行字符串转码
    if (IS_PY3):
        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()
    if (IS_PY3):
        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__':
    token = fetch_token()
    #quote_plus()将url数据获取之后,并将其编码,从而适用与URL字符串中,使其能被打印和被web服务器接受
    tex = quote_plus(TEXT)  # 此处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)  #转换合成数据 
    #浏览器测试 +url+数据
    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
#保存文件  + 格式 {3: "mp3", 4: "pcm", 5: "pcm", 6: "wav"}
    save_file = "error.txt" if has_error else 'result.' + FORMAT   
#写文件    
    with open(save_file, 'wb') as of:
        of.write(result_str)

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

    print("result saved as :" + save_file)

百度语音-语音识别 API-百度智能云
https://cloud.baidu.com/doc/SPEECH/ASR-API.html#.E6.8E.A5.E5.8F.A3.E8.BF.94.E5.9B.9E.E5.8F.82.E6.95.B0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值