使用腾讯云进行语音合成

  • 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'):
  • 详情参考:https://cloud.tencent.com/document/product/1073/37935

  • 我们已经将相关的程序封装为一个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