Python 打造一个语音合成系统 平时我们聊天的时候,也许会想着录制一些自己的声音,而且还想有点特色, 也就是所谓的变声,今天我们要说的就是这个变声器的制作, 说的高大上点就是语音合成系统。它能实现个性化语音的录制与存储。 开发需求 申请百度开放平台账号,使用sublime text 3 开发。 开发步骤 1.打开百度开放这个平台创建一个应用拿到关键参数,如图:
因为我们使用Python开发一款智能语音合成系统,所以需要PythonSDK ,可以在下图中找到:
找到之后可以看看他的使用说明:
然后创建一个应用:
这样就拿到了三个重要的参数: APP_ID:应用id API_KEY:应用钥匙 SECRET_KEY:安全码 2.下载百度Python api pip install baidu-aip
3.配置百度语音客户端 新建AipSpeechfrom aip import AipSpeech ? """ 你的 APPID AK SK """ APP_ID = '你的 App ID' API_KEY = '你的 Api Key' SECRET_KEY = '你的 Secret Key' ? client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
配置AipSpeech如果用户需要配置AipSpeech的网络请求参数(一般不需要配置),可以在构造AipSpeech之后调用接口设置参数,目前只支持以下参数: 接口说明setConnectionTimeoutInMillis建立连接的超时时间(单位:毫秒setSocketTimeoutInMillis通过打开的连接传输数据的超时时间(单位:毫秒) 4.建立链接,生成音频文件
可以看出,成功生成音频文件会返回二进制文件流。这样还只是生成一个最简单的音频文件, 我们还可以将它生成多种声音,参数如下: 参数类型描述是否必须textString合成的文本,使用UTF-8编码, 请注意文本长度必须小于1024字节是cuidString用户唯一标识,用来区分用户, 填写机器 MAC 地址或 IMEI 码,长度为60以内否spdString语速,取值0-9,默认为5中语速否pitString音调,取值0-9,默认为5中语调否volString音量,取值0-15,默认为5中音量否perString发音人选择, 0为女声,1为男声, 3为情感合成-度逍遥,4为情感合成-度丫丫,默认为普通女否 这就是人工智能中的语音合成技术,调用百度的SDK,只用了几分钟。就完成了一年的开发量。 当然有失败就避免不了成功,一般请求失败会有这几种情况: 错误返回格式若请求错误,服务器将返回的JSON文本包含以下参数: - error_code:错误码。
- error_msg:错误描述信息,帮助理解和解决发生的错误。
错误码错误码含义500不支持的输入501输入参数不正确502token验证失败503合成后端错误 看到上面这些参数是不是想跃跃欲试了了。哈哈,那就赶紧解放我们的双手吧。 程序实现因为我们是要将他打造成一个语音合成的系统,所以当然得有界面才好看啦, 1.编写程序主界面: class play: def __init__(self): self.root=tk.Tk()#初始化窗口 self.root.title("语音合成系统")#窗口名称 self.root.geometry("700x700")#设置窗口大小 self.root.resizable(width=True,height=True)#设置窗口是否可变,宽不可变,高可变,默认为True self.lb=tk.Label(self.root,text='请选择语音类型')#标签 self.tt=tk.Text(self.root,width=80,height=30)#多行文本框 self.cb=ttk.Combobox(self.root, width=12)#下拉列表框 #设置下拉列表框的内容 self.cb['values']=('请选择-----','甜美型','萝莉型','大叔型','精神小伙型') self.cb.current(0)#将当前选择状态置为0,也就是第一项 self.cb.bind("<>",self.go)#绑定go函数,然后触发事件 self.lb1=tk.Label(self.root,text='请输入文件名:') self.e=tk.Entry(self.root,width=30,show=None, font=('Arial', 12))#文本框 self.b1=tk.Button(self.root, text='生成音频文件', width=10,height=1,command=self.sc)#按钮 #各个组件的位置 self.b1.place(x=200,y=520) self.lb.place(x=30,y=30) self.cb.place(x=154,y=30) self.e.place(x=130,y=490) self.lb1.place(x=30,y=490) self.tt.place(x=30,y=60) self.root.mainloop()#启动主页面
这样就算完成了程序的主界面了,是不是很简单了,一起来看下它长啥样吧:
怎么样,是不是很简洁大气了。 2.绑定下拉列表框事件 在这里,我们需要对如何获取下拉列表框的选项要了解,废话少说。 直接上代码: def go(self,*arg): # *arg是为了接受多个如同列表的参数,还有个**kwarg能接受如同字典的参数 #百度api self.APP_ID = '18386899' self.API_KEY = 'OcPQ4cGoGBRtW23jemKvgmU5' self.SECRET_KEY = 'n2rGtvq9HmOGxgxG8H9a5kqFOes8ggHx' self.client = AipSpeech(self.APP_ID,self.API_KEY,self.SECRET_KEY)#初始化端口建立连接 if self.cb.get()=='请选择-----': self.tt.delete('1.0','end')#清除多行文本框的内容 elif self.cb.get()=='甜美型': #获取下拉列表框的选项来设置不同的音,下同 self.res=self.client.synthesis(self.tt.get('0.0','end'),'zh',1,{'vol':3,'spd':3,'pit':4,'per':0}) return self.res #返回音频信息,下同 elif self.cb.get()=='萝莉型': self.res=self.client.synthesis(self.tt.get('0.0','end'),'zh',1,{'vol':2,'spd':2,'pit':3,'per':0}) return self.res elif self.cb.get()=='大叔型': self.res=self.client.synthesis(self.tt.get('0.0','end'),'zh',1,{'vol':5,'spd':7,'pit':6,'per':1}) return self.res elif self.cb.get()=='精神小伙型': self.res=self.client.synthesis(self.tt.get('0.0','end'),'zh',1,{'vol':7,'spd':8,'pit':8,'per':1}) return self.res
3.判断内容的大小并生成文件 百度语音api里有个限制,就是单个音频生成是有限制的,不能超过1024字节, 所以我在这里做个判断: def sc(self): self.go()#引入go函数,不然下面的self.res 没法调用 aa=self.tt.get('0.0','end') #多行文本框内容为空 ab=os.path.dirname(sys.argv[0])+os.sep+self.e.get()+'.mp3'#文件名的地址,与程序同目录 if len(aa)>=1024: #判断长度是否超过1024 messagebox.showerror(title = '出错了!',message='^_^最多不超过1024个字节^_^') else: if not os.path.exists(ab):#如果没有这个文件则创建 with open(ab,'wb') as f: f.write(self.res)#将音频信息写入到文件 #生成结束给一个提示 messagebox.showinfo(title = '完毕!',message='生成完毕,文件在程序目录下') else: messagebox.showerror(title='出错了!',message='文件名已存在')#有这个文件就提示
接下来,我们只需将这几个功能写入到一个类中即可,然后启动这个类。 play()
当我输入一段话后,大家可以看到它就生成了一个音频文件, 而且读取的时候和我们输入的内容一模一样,比如我输入一段代码,见下图:
怎么样,是不是很完美了,哈哈哈!!!其实,有时候我们在写代码的时候 完全可以想到什么写什么,这样你才能学的更快更好。 |