Python实现文字转语音

2020-12-28 11:34:46 浏览数 (1)

参考链接: 在Python中将文本转换为语音

Python实现文字转语音

 前言创建应用获取应用的API Key和Secret Key编写python代码替换API Key和Secret Key生成的音频文件

前言 

因为该功能的实现,需要使用百度的语音合成技术,所以,首先需要注册并登陆百度AI: https://ai.baidu.com/tech/speech 

创建应用 

 点击创建应用,创建自己的应用。  按照提示填入相应内容就好。 

获取应用的API Key和Secret Key 

编写python代码 

# 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 = 'nu9r2plGFi3s1ugayDPSM6Mk'

SECRET_KEY = 'G62YGnq84eKTqu0mBgvdpmC6gNBzHdai'

TEXT = "三分钟前,由北京市顺义区二经路与二纬路交汇处北侧,北京首都国际机场T3航站楼 去往 东城区北三环东路36号喜来登大酒店(北京金隅店)"

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

"""  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 = {'tok': token, 'tex': tex, 'cuid': "quickstart",

              'lan': 'zh', 'ctp': 1}  # lan ctp 固定参数

    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)

    except  URLError 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 api  error:" result_str)

    print("file saved as : " save_file)

替换API Key和Secret Key 

将上面代码中的API_KEY 和SECRET_KEY,替换成自己应用中的API Key和Secret Key,运行代码。 

生成的音频文件 

生成的音频文件名为:大姚的订单信息.mp3。打开MP3听到的声音就是上面输入的文字。 

TEXT = "三分钟前,由北京市顺义区二经路与二纬路交汇处北侧,北京首都国际机场T3航站楼 去往 东城区北三环东路36号喜来登大酒店(北京金隅店)"

上面的文字可以替换成想自己想要转语音的其他文字。

0 人点赞