百度的TTS API

房东的猫 提交于 2019-11-30 02:21:01

语音合成
代码是百度给的样例
修改你的TEXT,API_KEY和SECRET_KEY然后按注释修改参数得到想要的音频
很好使

# coding=utf-8

import sys
import json

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_KEY = 'oHxQ0B0HKOiZ1Zr5dEwNsECc'

SECRET_KEY = 'MjKl5nnYtbNHon90gefTWdnATd9xih3o'



TEXT = "图片中的花朵是:  玫 瑰 花"



# 发音人选择, 基础音库:0为度小美,1为度小宇,3为度逍遥,4为度丫丫,

# 精品音库:5为度小娇,103为度米朵,106为度博文,110为度小童,111为度小萌,默认为度小美 

PER = 0

# 语速,取值0-15,默认为5中语速

SPD = 4

# 音调,取值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 fetch_token():

    print("fetch token begin")

    params = {'grant_type': 'client_credentials',

              'client_id': API_KEY,

              'client_secret': SECRET_KEY}

    post_data = urlencode(params)

    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()
    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)

    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:
        if (IS_PY3):
            result_str = str(result_str, 'utf-8')
        print("tts api  error:" + result_str)


    print("result saved as :" + save_file)
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!