本文主要介绍如何用Python制作一个语音合成系统。文中的示例代码讲解的很详细,对我们学习Python很有帮助。感兴趣的朋友可以看看。
目录
背景语音合成系统准备步骤代码实现
背景
我一直对语音合成系统很感兴趣,总想给自己合成一些内容,比如合成小说,把我下载的电子书播给我听等等。
语音合成系统
其实是一个基于语音合成的工具。但是因为很多厂商都提供了API表单,这个东西的开发难度就大大降低了。只需要调用几个API就可以实现自己的语音合成工具。麻雀虽小,五脏俱全。说白了,这就是一个小型的语音合成系统。
准备工作
首先,我们需要把它安装在我们的电脑上。
AnacondaPython 3.7visual studio代码
步骤
这里我们选择讯飞开放平台的WebAPI接口。
首先,我们到控制台创建一个应用程序。
创建完成后,点击应用进入,有应用的详细栏目。
点击左边的语音合成,然后进入下一级在线语音合成(流版本)。
在右上角,我们需要3样东西:
APPIDAPISecretAPIKey
代码实现
好了,我们来实现代码吧。首先,安装我们需要的两个库。
pip安装web socket-客户端
pip安装播放声音
接下来,我们定义一个类play,它包含四个函数。
课堂游戏:
Def __init__(self): #初始化函数
Def play_sound(self):#播放音频功能
Select _ vcn (self,* arg): #选择下拉框设置扬声器。
Def Yun _ TTS (self): #用于语音合成
这里需要填写刚刚从讯飞开放平台控制台获取的appid、appkey、appsecret。
def __init__(self):
自我。APP_ID='xxx' #请填写您的appid。
自我。API_KEY='xxx' #请填写您自己的appkey
自我。SECRET_KEY='xxx' #请填写自己的appsecret。
Self.root=tk。Tk() #初始化窗口
Self.root.title('语音合成系统')#窗口名称
Self.root.geometry('600x550') #设置窗口大小
self.root.resizable(0,0)
#自我。根。Resizable (width=True,height=true) #设置窗口是否可变,宽度是否恒定,高度是否可变,默认值是否为True。
Self.lb=tk.label (self.root,text='请选择发音者')# label
Self.tt=tk.text (self.root,width=77,height=30) #多行文本框
self . CB=ttk.com Bobox(self . root,width=12) #下拉列表框
#设置下拉列表框的内容
Self.cb['values']=('甜美女声-小燕','善良男声-久久','知性女声-小平','萌童声-徐小宝','善良女声-小静')
Self.cb.current(0) #将当前选择状态设置为0,这是第一项
self.cb.bind('ComboboxSelected ',self.select_vcn)
self . tk _ TTS _ file=tk . label(self . root,text='生成的文件名')
Self.b1=tk.button (self.root,text='用于语音合成',width=10,height=1,command=self.xfyun _ TTS) # button
self . tk _ play=tk . button(self . root,text=' play ',width=10,height=1,command=self . play _ sound)# button
#每个组件的位置
self.tk_tts_file.place(x=30,y=500)
self.b1.place(x=300,y=500)
self.tk_play.place(x=400,y=500)
self.lb.place(x=30,y=30)
self.cb.place(x=154,y=30)
self.tt.place(x=30,y=60)
self.root.mainloop()
选择下拉列表时,设置相应的扬声器。
def select_vcn(self,*arg):
If.cb.get ()=='甜妹-小燕':
self.vcn='小燕'
Eliself.cb.get ()=='亲切的男声-久久':
self.vcn='aisjiuxu '
Eliself.cb.get ()=='知性女声-小平':
self.vcn='aisxping '
Eliself.cb.get ()=='可爱的童声-徐小宝':
self.vcn='aisbabyxu '
Eliself.cb.get ()=='善良的女孩-小静':
self.vcn='aisjinger '
打印(self.vcn)
接下来我们来看看魔变讯飞自带的Python demo,使用起来更方便。
# -*-编码:utf-8 -*-
#
#作者:科大讯飞
#
# 本演示测试时运行的环境为:Windows Python3.7
# 本演示测试成功运行时所安装的第三方库及其版本如下:
# cffi==1.12.3
# gevent==1.4.0
# greenlet==0.4.15
# pycparser==2.19
#六==1.12.0
# websocket==0.2.1
#网络套接字-客户端==0.56.0
# 合成小语种需要传输小语种文本、使用小语种发音人vcn、tte=unicode以及修改文本编码方式
# 错误码链接:https://www。xfyun。cn/document/错误代码(代码返回错误码时必看)
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
导入websocket
导入日期时间
导入哈希里布
导入base64
导入hmac
导入json
从urllib.parse导入urlencode
导入时间
导入安全套接层
从wsgiref.handlers导入格式日期时间
从日期时间导入日期时间
从时间导入mktime
作为线程导入线程
导入操作系统
进口波
状态_第一帧=0 #第一帧的标识
STATUS_CONTINUE_FRAME=1 #中间帧标识
状态_最后_帧=2 #最后一帧的标识
PCM_PATH=' ./demo.pcm '
Ws_Param类(对象):
# 初始化
def __init__(self):
及格
def set_tts_params(self,text,vcn):
如果文本!='':
自我。文本=文本
如果vcn!='':
self.vcn=vcn
# 业务参数(商务),更多个性化参数可在官网查看
自我BusinessArgs={'bgs':1,' aue': 'raw ',' auf ':' audio/L16;rate=16000 ',' vcn': self.vcn,' tte': 'utf8'}
#使用小语种须使用以下方式,此处的采用双字节对字符进行编码指的是utf16小端的编码方式,即UTF-16LE '”
#自我Data={'status': 2,' text ':str(base64。b 64编码(自编码).Text.encode('utf-16 '),' UTF8')}
自我Data={'status': 2,' text ':str(base64。b 64编码(自编码).Text.encode('utf-8 '),' UTF8')}
def set_params(self,appid,apiSecret,apiKey):
如果appid!='':
自我APPID=appid。
# 公共参数(常见)
自我CommonArgs={'app_id': self .APPID}
如果apiKey!='':
自我APIKey=apiKey。
if apiSecret!='':
自我。蜜蜂秘密=蜜蜂秘密
# 生成全球资源定位器(统一资源定位器)
定义创建url(自身):
URL=' WSS://TTS-API。xfyun。' cn/v2/TTS '
# 生成RFC1123格式的时间戳
now=datetime.now()
日期=格式日期时间(mktime(now.timetuple()))
# 拼接字符串
signature _ origin=' host:' ' ' ws-API。xfyun。cn ' ' \ n '
signature _ origin=' date:' date ' \ n '
signature _ origin=' GET ' '/v2/TTS ' ' HTTP/1.1 '
# 进行hmac-sha256进行加密
signature_sha=hmac.new(self .APISecret.encode('utf-8 '),signature_origin.encode('utf-8 '),
digestmod=hashlib.sha256).摘要()
signature _ sha=base64。b 64编码(签名_ sha).解码(编码='utf-8 ')
authorization _ origin=' API _ key=' % s ',算法='%s ',标头=' % s ',签名=“% s”%(
自我APIKey,' hmac-sha256 ','主机日期请求行,signature_sha)
授权=base64。b 64编码(authorization _ origin。编码(' utf-8 ').解码(编码='utf-8 ')
# 将请求的鉴权参数组合为字典
v={
'授权:授权,
'日期:日期,
主机:“ws-api.xfyun.cn”
}
url=url '?urlencode(v)
返回全球资源定位器(Uniform Resource Locator)
定义on_message(ws,消息):
尝试:
#打印(消息)
尝试:
message=json.loads(消息)
例外情况为e:
打印(“111”,e)
code=message['code']
sid=消息['sid']
音频=消息['数据']['音频]
audio=base64.b64decode(音频)
状态=消息['数据']['状态]
打印(代码、样本号、状态)
如果状态==2:
打印(“ws已关闭")
ws.close()
如果码!=0:
errMsg=message['message']
打印(' sid:%s调用错误:%s代码为:%s' % (sid,errMsg,code))
否则:
用打开(PCM_PATH,' ab ')作为女:
f .写(音频)
例外情况为e:
打印('接收消息,但分析异常:',e)
# 收到websocket错误的处理
def on_error(ws,error):
打印(' ###错误:',错误)
# 收到websocket关闭的处理
定义on_close(ws):
打印(' ###关闭### ')
# 收到websocket连接建立的处理
打开定义(ws):
定义运行(*args):
d={'common': wsParam .CommonArgs,
' business': wsParam .商业评论,
' data': wsParam .数据,
}
d=json.dumps(d)
打印('-开始发送文本数据)
ws.send
如果os.path。存在(PCM_PATH):
os.remove(PCM_PATH)
thread.start_new_thread(run,())
def text2pcm(appid,apiSecret,apiKey,text,vcn,fname):
wsParam.set_params(appid,apiSecret,apiKey)
wsParam.set_tts_params(text,vcn)
websocket.enableTrace(False)
wsUrl=wsParam.create_url()
ws=websocket .WebSocketApp(wsUrl,on_message=on_message,on_error=on_error,on_close=on_close)
ws.on_open=on_open
ws。run _ forever(SSL opt={ ' cert _ reqs ':SSL .证书_无})
pcm2wav(PCM_PATH,fname)
def pcm2wav(fname,dstname):
使用打开(fname,' rb ')作为pcmfile:
pcmdata=pcmfile.read()
打印(len(pcmdata))
使用wave.open(dstname,' wb ')作为wavfile:
wavfile.setparams((1,2,16000,0,’无','无'))
wavfile.writeframes(pcmdata)
wsParam=Ws_Param()
最终一个语音合成系统就这样实现了。
当前,各种云计算、云服务迅速发展,各大公司提供了丰富的资源,大大降低了人工智能开发的门槛,不需要懂语音合成的原理,竟然可以快速开发出一个语音合成工具出来!
到此这篇关于基于计算机编程语言编写一个语音合成系统的文章就介绍到这了,更多相关计算机编程语言语音合成内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。