当前位置: 首页 > 后端技术 > Python

Python语音合成指南北(一)

时间:2023-03-26 01:40:42 Python

文章来源:凡凡的Python学习之路作者:一粒米语音合成概述一般来说,语音合成是一种通过机械和电子方式产生人工语音的技术。其中,TTS是Text-To-Speech的缩写,即“从文本到语音”,是人机对话的一部分。属于语音合成,是一种将计算机自身或外部输入产生的文本信息,转换成可理解、流畅的语音输出的技术。本文提到的语音合成是指TTS。日常生活中使用的林志玲导航和郭德纲导航都是基于TTS的。语音合成方法这里简单讨论语音合成的传统方法和近年来基于深度学习的合成方法。对这部分不感兴趣的同学可以直接跳过,不影响后面的阅读。传统方法传统的语音合成方法可分为拼接法和参数化法。拼接,拼接方法是指从语音数据库中选择需要的语音片段,合成完整的语音。该方法需要大量的语音数据,灵活性差,不能合成新的语音片段。参数化,参数化方法是指使用录制的人声和带参数的函数,通过调整函数参数来改变声音。这种传统方法的工作量比较大。基于深度学习的方法今年随着神经网络的不断发展,深度学习技术也广泛应用于语音合成,大致包括以下几个方向:WaveNet:原始音频生成模型,WaveNET是一种基于音频生成模型在PixelCNN上,它能够产生类似于人类发出的声音。论文地址是Tacotron:end-to-endspeechsynthesis。Tacotron是一个seq2seq模型,包括一个编码器、一个基于注意力的解码器和一个后端处理网络。该论文的链接是DeepVoice1:Real-timeNeuralText-to-Speech,这是一个使用深度神经网络开发的文本转语音系统。论文链接到DeepVoice2:Multi-SpeakerNeuralText-to-Speech,它与DeepVoice1类似,但音频质量有显着提高。该模型能够从每个说话者不到半小时的语音数据中学习数百种独特的声音。论文链接DeepVoice3:ScaleText-to-SpeechConversionwithConvolutionalSequenceLearning,作者提出了一个全卷积的character-to-spectral框架,可以实现完全并行计算。该框架是一个基于注意力的序列到序列模型。该模型是在LibriSpeechASR数据集上训练的。论文链接ParallelWaveNet:FastHigh-FidelitySpeechSynthesis,来自谷歌的模型,它引入了一种称为概率密度蒸馏的方法,从训练好的WaveNet训练出一个并行前馈网络。该方法是通过结合逆自回归流(IAFS)和波形网络(WaveNet)的最佳特征构建的。这些特征代表了WaveNet的高效训练和IAF网络的高效采样。论文链接使用了小样本神经网络语音克隆,这是百度的一个模型,它介绍了一种神经语音克隆系统,可以通过学习从少量音频样本中合成人的声音。论文链接VoiceLoop:SpeechFittingandSynthesisviaSpeechLoops,一篇来自Facebook的论文,介绍了一种神经文本转语音(TTS)技术,可将文本从野外收集的声音转换为语音。链接到Google和加州大学伯克利分校的MelGraphPrediction使用条件WaveNet的自然TTS合成。他们推出了Tacotron2,一种用于文本到语音合成的神经网络架构。它由一个循环的序列到序列特征预测网络组成,该网络将字符嵌入到梅尔尺度图集中。然后是一个修改后的WaveNet模型,它充当声码器,使用频谱图在时域中合成波。使用Python进行语音合成的方法有很多种。在这里,我们比较了几个典型的开源库和国内的语音平台,供同学们参考。由于谷歌的服务不能直接使用,所以不在比较列表之内,而Windows独有的语音合成方式也不在比较范围之内??。开源库,_pyttsx3_pyttsx3是一个开源的离线语音合成库,只要用pip安装就可以使用。安装命令如下:$pipinstallpyttsx3优点:免费,简单易用缺点:合成语音效果一般2.科大讯飞KedaxunFly提供丰富的发音类别合成特殊语音,通过API进行语音合成接口,可以提供和弦字符、无声停顿、数字、英文发音的控制标记。优点:语音合成效果更好,可以灵活控制和弦字、静音、英文的发音。缺点:免费使用接口有500次限制,实际使用时往往不够用。3、腾讯腾讯有多个平台提供语音合成接口,包括腾讯AILab、腾讯优图、腾讯云。其中,腾讯AI开放平台综合效果一般;腾讯优图目前免费试用,没有请求次数限制,但不保证QPS;腾讯云的语音合成效果也不错,免费合成额度是每月100万字,相当于一本书的《西游记》字数。免费额度每个月1号重置,一般够用了。优点:选择多,其中腾讯优图和腾讯云的语音合成效果更好。缺点:无法控制和弦字、数字、英文和停顿的发音。模式,按次数计费。优点:语音合成效果更好,语音模型丰富。缺点:使用官方产品还是要花钱的。5、百度支持在线语音合成和离线语音合成。离线语音合成只能在个人认证后在两个终端上使用。在线语音合成有QPS和有效期限制。具体如下:优点:合成语音效果还不错,使用比较简单,免费额度够开发测试用。缺点:使用官方产品还是要花钱的。示例开发这里我们以腾讯云的语音合成为例,实现一个简单的语音合成脚本。登录,登录腾讯云官网,还没有注册的先注册一个账号。实名认证。如果您还没有进行实名认证,可以在腾讯云账号中心进行实名认证。打开语音合成服务,进入语音合成控制台,激活语音合成功能。4、进入密钥管理界面,点击新建密钥,生成SecretId和SecretKey,用于API调用时生成签名。5、使用Python调用语音合成接口,其中APP_ID、SECRET_ID、SECRET_KEY是上一步获取到的,代码如下:`#coding=UTF-8importrequestsimportwaveimportjsonimportbase64importtimeimportcollectionsimporturllibimportbase64importhmacimporthashlibimportuuidimportosTCLOUD_APP_SEXIDX=XXXXTCLOUD"TCLOUD_SECRET_KEY="XXXX"OUTPUT_PATH="./audio"defgenerate_sign(request_data):url="tts.cloud.tencent.com/stream"sign\_str="POST"+url+"?"sort\_dict=sorted(request\_data.keys())forkeyinsort\_dict: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=TCLOUD\_SECRET\_KEY.encode('utf-8')authorization=base64.b64encode(hmac.new(key\_bytes,sign\_bytes,hashlib.sha1).digest())returnauthorization.decode('utf-8')deftext2wav(content):request\_data={"Action":"TextToStreamAudio","AppId":TCLOUD\_APP\_ID,#返回音频格式:PythonSDK只支持pcm格式#pcm:返回二进制pcm音频,使用方便,但数据量大"Codec":"pcm","Expired":int(time.time())+3600,#modeltype,1:defaultmodel"ModelType":1,#Primarylanguagetype:#1:Chinese(default)#2:English"PrimaryLanguage":1,#ProjectID,用户自定义,默认为0。"ProjectId":0,#Audiosamplingrate:#16000:16k(默认)#8000:8k"SampleRate":16000,"SecretId":TCLOUD\_SECRET\_ID,"SessionId":str(uuid.uuid1()),#Speechrate,range:\[-2,2\],对应不同的语速:#-2代表0.6倍#-1代表0.8倍#0代表1.0倍(默认)#1代表1.2倍#2代表1.5倍#输入除以上整数以外的参数都会不生效,按默认值处理。"Speed":0,"Text":content,"Timestamp":int(time.time()),#timbre:#0:友善的女声(默认)#1:友善的男声#2:成熟的男声#3:活跃的男声#4:温暖的女声#5:感性的女声#6:感性的男声"VoiceType":5,#Volumesize,range:\[0,10\],对应11级音量,默认值为0,表示正常音量。没有静音选项。"Volume":5,}signature=generate\_sign(request\_data)#print(f"signature:{signature}")header={"Content-Type":"application/json","Authorization":signature}url="https://tts.cloud.tencent.com/stream"#print(request\_data)r=requests.post(url,headers=header,data=json.dumps(request\_data),stream=True)#print(r)i=1t=int(time.time()\*1000)output\_file=os.path.join(OUTPUT\_PATH,f"{t}.wav")print(f"生成音频file:{output\_file}")wavfile=wave.open(output\_file,'wb')wavfile.setparams((1,2,16000,0,'NONE','NONE'))forchunkinr.iter\_content(1000):if(i==1)&(str(chunk).find("Error")!=-1):print(chunk)返回""i=i+1wavfile.writeframes(chunk)wavfile.close()returnoutput\_fileif__name__=="__main__":print(text2wav("你好"))`也可参考官方提供的SDK_参考资料_:https://zhuanlan.zhihu.com/p/...https://pypi.org/project/pytt...https://www.xfyun.cn/services..._ttshttps://cloud.tencent.com/pro...