0
点赞
收藏
分享

微信扫一扫

Python实现文字转语音

前言

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

创建应用

Python实现文字转语音_语音识别

点击创建应用,创建自己的应用。

Python实现文字转语音_百度_02

按照提示填入相应内容就好。

获取应用的API Key和Secret Key

Python实现文字转语音_百度_03

编写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 = '你的'

SECRET_KEY = '你的'

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 条评论