YouCam 发表于 2022-6-29 22:37:47

对接百度语音合成API出现请求连接不合法问题

使用百度云的在线语音合成时,出现以下错误:

tts apierror:{"error_code":100,"error_msg":"Invalid parameter"}
file saved as : error.txt
Press any key to continue . . .


代码源码:

# -*- coding: UTF-8 -*-

import sys
import json

# 保证兼容python2以及python3
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
API_KEY = 'xxxxxxxxxxxxxxxxx'

# 替换你的 SECRET_KEY
SECRET_KEY = 'xxxxxxxxxxxxxxxxxxx'

# 大姚的订单信息内容文本
TEXT = ''内容已省去'''



TTS_URL = 'https://aip.baidubce.com/rpc/2.0/tts/v1/create'

"""TOKEN start """

TOKEN_URL = 'http://openapi.baidu.com/oauth/2.0/token'


"""
    获取token
"""
def fetch_token():
    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()


    result = json.loads(result_str)

    if ('access_token' in result.keys() and 'scope' in result.keys()):
      if not 'audio_tts_post' in result['scope'].split(' '):
            print ('please ensure has check the tts ability')
            exit()
      return result['access_token']
    else:
      print ('please overwrite the correct API_KEY and SECRET_KEY')
      exit()


"""TOKEN end """

if __name__ == '__main__':

    token = fetch_token()

    tex = quote_plus(TEXT)# 此处TEXT需要两次urlencode

    params = {
             'access_token':token,
             'text': tex,
             'format':"mp3-48k",
             'voice':5003,
            'lang': "zh"
            }

    data = urlencode(params)

    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)
    exceptURLError as err:
      print('http response http code : ' + str(err.code))
      result_str = err.read()
      has_error = True

    save_file = "error.txt" if has_error else u'大姚的订单信息.mp3'

    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 apierror:" + result_str)

    print("file saved as : " + save_file)

应该是请求的链接不合法,有没有大神知道如何写合法链接?万分感谢!

这是相关文档:

https://ai.baidu.com/ai-doc/REFERENCE/Ck3dwjhhu
https://cloud.baidu.com/doc/SPEECH/s/1ku59x8ey

hrpzcf 发表于 2022-6-30 01:47:20

返回值不是写着无效参数吗?为什么会是链接不合法?

YouCam 发表于 2022-6-30 10:15:54

hrpzcf 发表于 2022-6-30 01:47
返回值不是写着无效参数吗?为什么会是链接不合法?

我不懂,参数无效的话,浏览器请求的链接也就不合法了吧?
页: [1]
查看完整版本: 对接百度语音合成API出现请求连接不合法问题