使用腾讯云进行语音合成
TTS(Text to Speech)指在连接互联网的前提下(不能使用代理),我们可以输入一段文字,然后网络返回一段音频(朗读文字)。要使用腾讯云的TTS,你需要先注册账号,然后开启TTS服务,它就会给你一个纯数字ID(没什么用),一个
带字母的ID(这个是你请求中要有的ID)以及一个secretKey。你需要把这两个东西写入你的程序,然后运行本节给出的代码,就可以实现语音转文字了。这个类的使用方法很简单:
t=VoiceTTS()
t.GenVoice(“正在寻找设备,请连接设备网络,并将网络属性调整为专用后设备将自动连接”)在GenVoice中,可以设置语音参数,例如(下面的ID内容是随意写的,需要替换成自己的):
def GenVoice(self,voice_data,timbre=1003,voice_volume=4,speed=-1,
appID=13243451495, ID='AKIDRj6Yasdasdcsadfdco5', secretKey='C9t05sdfsdcassetdfdfasdasckvvu', server='tts.cloud.tencent.com/stream'):我们已经将相关的程序封装为一个Python的类,注意,目前这个类不支持MicroPython.
完整代码如下:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
'''
- Python SDK https://cloud.tencent.com/document/product/1073/37935
'''
import time
import os
import socket
import requests
import wave
import urllib.parse,base64,hmac,hashlib,uuid,json
class authorization:
def init(self):
pass
def init_auth(self, appid, secret_id, secret_key):
self.AppId = appid
self.SecretId = secret_id
self.SecretKey = secret_key
def generate_sign(self, request_data,url):
url = url
sign_str = "POST" + url + "?"
sort_dict = sorted(request_data.keys())
for key in sort_dict:
if isinstance(request_data[key], float):
sign_str = sign_str + key + "=" + urllib.parse.unquote('%g' % (request_data[key])) + '&'
else:
sign_str = sign_str + key + "=" + urllib.parse.unquote(str(request_data[key])) + '&'
sign_str = sign_str[:-1]
sign_bytes = sign_str.encode('utf-8')
key_bytes = self.SecretKey.encode('utf-8')
authorization = base64.b64encode(hmac.new(key_bytes, sign_bytes, hashlib.sha1).digest())
return authorization.decode('utf-8')
def TTSRequest(voice_data,timbre,voice_volume,speed,appID,ID,
secretKey,
server):
'''
语音合成请求
['Speed'] #语速,范围:[-2,2],分别对应不同语速:
#-2代表0.6倍
#-1代表0.8倍
#0代表1.0倍(默认)
#1代表1.2倍
#2代表1.5倍
#输入除以上整数之外的其他参数不生效,按默认值处理。
['Text'] #合成语音的源文本,最大支持500字符。
#音量大小,范围:[0,10],分别对应11个等级的音量,默认值为0,代表正常音量。没有静音选项。
['Volume'] #输入除以上整数之外的其他参数不生效,按默认值处理
['ProjectId'] #音色:
#0:亲和女声(默认)
#1:亲和男声
#2:成熟男声
#3:活力男声
#4:温暖女声
#5:情感女声
#6:情感男声
['PrimaryLanguage'] #主语言类型:
#1:中文(默认)
#2:英文
'''
request_data = dict()
request_data['Action'] = 'TextToStreamAudio'
request_data['AppId'] = appID
request_data['Codec'] = "pcm"
request_data['Expired'] = int(time.time()) + 3600
request_data['ModelType'] = 1
request_data['PrimaryLanguage'] = 1
request_data['ProjectId'] = 0
request_data['SampleRate'] = 8000
request_data['SecretId'] = ID
request_data['SessionId'] = str(uuid.uuid4())
request_data['Speed'] = speed
request_data['Text'] = voice_data
request_data['Timestamp'] = int(time.time())
request_data['VoiceType'] = timbre
request_data['Volume'] = voice_volume
auth=authorization()
auth.init_auth(appID,ID,secretKey)
signature=auth.generate_sign(request_data=request_data,url=server)
return signature,request_data
class VoiceTTS:
'''
语音合成类
'''
def __init__(self,cacheDir='voice_cache',timbre=1003):
self.timbre = timbre
if not os.path.exists(cacheDir):
os.mkdir(cacheDir)
self.__cacheDir=cacheDir
def GenVoice(self,voice_data,timbre=1003,voice_volume=4,speed=-1,
appID=1324714861,
ID='腾讯云的ID',
secretKey='腾讯云的secretKey',
server='tts.cloud.tencent.com/stream'):
'''请求语音合成'''
if timbre==0: timbre=self.timbre
#try:
uuid = hashlib.md5(voice_data.encode('utf-8')).hexdigest()
waveFile = os.path.join(self.__cacheDir, "{}.wav".format(uuid))
''' 如果缓存存在,则不需要继续下载'''
if os.path.exists(waveFile):
return
# 请求语音合成,并保存下来
signature, request_data = TTSRequest(voice_data, timbre,voice_volume,speed,appID,ID,secretKey,server)
url = "https://tts.cloud.tencent.com/stream"
header = {
"Content-Type": "application/json",
"Authorization": signature
}
r = requests.post(url, headers=header, data=json.dumps(request_data), stream=True)
if str(r.content).find("Error") != -1:
raise Exception("r.content")
pipeLine = wave.open(waveFile, 'wb')
pipeLine.setparams((1, 2, 16000, 0, 'NONE', 'NONE'))
for chunk in r.iter_content(1000):
pipeLine.writeframes(chunk)
pipeLine.close()
# 检测wave文件是否下载完成
if os.path.getsize(waveFile) == 0:
raise Exception("{} save has error!".format(waveFile))
if __name__=='__main__':
t=VoiceTTS()
t.GenVoice("正在寻找设备,请连接设备网络,并将网络属性调整为专用后设备将自动连接")
#t.GenVoice("")
作者:admin 创建时间:2024-04-24 10:16
最后编辑:admin 更新时间:2024-07-17 11:01
最后编辑:admin 更新时间:2024-07-17 11:01