用Python打造一个语音合成系统

击上方“Python爬虫与数据挖掘”,进行关注

回复“书籍”即可获赠Python从入门到进阶共10本电子书

大弦嘈嘈如急雨,小弦切切如私语。

/前言/

   平时我们聊天的时候,也许会想着录制一些自己的声音,而且还想有点特色,也就是所谓的变声,今天我们要说的就是这个变声器的制作,说的高大上点就是语音合成系统。

    这个语音合成系统,能实现个性化语音的录制与存储。

/软件依赖/

使用sublime text 3 开发,申请百度开放平台账号进行开发。

/具体实现/

1、打开百度开放这平台创建一个应用拿到关键参数,如图所示:

2、因为我们使用Python开发一款智能语音合成系统,所以需要Python SDK ,可以在下图中找到:

3、找到之后可以看看它的使用说明。

4、然后创建一个应用,步骤依次如下图所示:

5、之后如下图所示:

6、再按照下图所示进行操作:

7、这样就拿到了三个重要的参数:

APP_ID:应用id

API_KEY:应用钥匙

SECRET_KEY:安全码

拿到以上关键参数之后,接下来就可以开始淦了!

/下载和配置百度语音客户端/

1、下载百度Python api

pip install  baidu-aip

    
    
2、配置百度语音客户端,具体步骤如下。

    
    

3、新建AipSpeech,代码如下。


    
    
  1. from aip import AipSpeech
  2. """ 你的 APPID AK SK """
  3. APP_ID = '你的 App ID'
  4. API_KEY = '你的 Api Key'
  5. SECRET_KEY = '你的 Secret Key'
  6. client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)

4、配置AipSpeech。如果用户需要配置AipSpeech的网络请求参数(一般不需要配置),可以在构造AipSpeech之后调用接口设置参数,目前只支持以下参数:

接口说明
setConnectionTimeoutInMillis建立连接的超时时间(单位:毫秒
setSocketTimeoutInMillis通过打开的连接传输数据的超时时间(单位:毫秒)

5、建立链接,生成音频文件,如下图所示。

6、可以看出,成功生成音频文件会返回二进制文件流。这样还只是生成一个最简单的音频文件,我们还可以将他生成多种声音,参数如下表所示:

参数类型描述是否必须
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,只用了几分钟,就完成了一年的开发量。

7、当然有失败就避免不了成功,一般请求失败会有这几种情况:

1)错误返回格式

若请求错误,服务器将返回的JSON文本包含以下参数:

  • error_code:错误码。

  • error_msg:错误描述信息,帮助理解和解决发生的错误。

2)错误码

错误码含义
500不支持的输入
501输入参数不正确
502token验证失败
503合成后端错误

    看到上面这些参数是不是想跃跃欲试了了。哈哈,那就赶紧解放我们的双手吧!

/程序实现/

    因为我们是要将它打造成一个语音合成的系统,所以当然得有界面才好看,具体实现如下。

1、编写程序主界面,具体代码实现如下。


    
    
  1. class play:
  2. def __init__(self):
  3. self.root=tk.Tk() #初始化窗口
  4. self.root.title( "语音合成系统") #窗口名称
  5. self.root.geometry( "700x700") #设置窗口大小
  6. self.root.resizable(width=True,height=True) #设置窗口是否可变,宽不可变,高可变,默认为True
  7. self.lb=tk.Label( self.root,text= '请选择语音类型') #标签
  8. self.tt=tk.Text( self.root,width= 80,height= 30) #多行文本框
  9. self.cb=ttk.Combobox( self.root, width= 12) #下拉列表框
  10. #设置下拉列表框的内容
  11. self.cb[ 'values']=( '请选择-----', '甜美型', '萝莉型', '大叔型', '精神小伙型')
  12. self.cb.current( 0) #将当前选择状态置为0,也就是第一项
  13. self.cb.bind( "<<ComboboxSelected>>", self.go) #绑定go函数,然后触发事件
  14. self.lb1=tk.Label( self.root,text= '请输入文件名:')
  15. self.e=tk.Entry( self.root,width= 30,show=None, font=( 'Arial', 12)) #文本框
  16. self.b1=tk.Button( self.root, text= '生成音频文件', width= 10,height= 1,command= self.sc) #按钮
  17. #各个组件的位置
  18. self.b1.place(x= 200,y= 520)
  19. self.lb.place(x= 30,y= 30)
  20. self.cb.place(x= 154,y= 30)
  21. self.e.place(x= 130,y= 490)
  22. self.lb1.place(x= 30,y= 490)
  23. self.tt.place(x= 30,y= 60)
  24. self.root.mainloop() #启动主页面

这样就算完成了程序的主界面了。

2、一起来看下它长啥样,如下图所示:

小伙伴们,是不是觉得很简洁大气呢?

3、绑定下拉列表框事件

在这里,我们需要对如何获取下拉列表框的选项要了解。言归正传,直接上代码:


    
    
  1. def go(self,*arg): # *arg是为了接受多个如同列表的参数,还有个**kwarg能接受如同字典的参数
  2. #百度api
  3. self.APP_ID = '18386899'
  4. self.API_KEY = 'OcPQ4cGoGBRtW23jemKvgmU5'
  5. self.SECRET_KEY = 'n2rGtvq9HmOGxgxG8H9a5kqFOes8ggHx'
  6. self.client = AipSpeech( self.APP_ID, self.API_KEY, self.SECRET_KEY) #初始化端口建立连接
  7. if self.cb.get()== '请选择-----':
  8. self.tt.delete( '1.0', 'end') #清除多行文本框的内容
  9. elif self.cb.get()== '甜美型': #获取下拉列表框的选项来设置不同的音,下同
  10. self.res= self.client.synthesis( self.tt.get( '0.0', 'end'), 'zh', 1,{ 'vol' : 3, 'spd' : 3, 'pit' : 4, 'per' : 0})
  11. return self.res #返回音频信息 ,下同
  12. elif self.cb.get()== '萝莉型':
  13. self.res= self.client.synthesis( self.tt.get( '0.0', 'end'), 'zh', 1,{ 'vol' : 2, 'spd' : 2, 'pit' : 3, 'per' : 0})
  14. return self.res
  15. elif self.cb.get()== '大叔型':
  16. self.res= self.client.synthesis( self.tt.get( '0.0', 'end'), 'zh', 1,{ 'vol' : 5, 'spd' : 7, 'pit' : 6, 'per' : 1})
  17. return self.res
  18. elif self.cb.get()== '精神小伙型':
  19. self.res= self.client.synthesis( self.tt.get( '0.0', 'end'), 'zh', 1,{ 'vol' : 7, 'spd' : 8, 'pit' : 8, 'per' : 1})
  20. return self.res

4、判断内容的大小并生成文件

百度语音api里有个限制,就是单个音频生成是有限制的,不能超过1024字节。鉴于此,所以需要在这里做个判断:


    
    
  1. def sc(self):
  2. self.go() #引入go函数,不然下面的self.res 没法调用
  3. aa= self.tt.get( '0.0', 'end') #多行文本框内容为空
  4. ab=os.path.dirname(sys.argv[ 0])+os.sep+ self.e.get()+ '.mp3' #文件名的地址,与程序同目录
  5. if len(aa)>= 1024: #判断长度是否超过1024
  6. messagebox.showerror(title = '出错了!',message= '^_^最多不超过1024个字节^_^')
  7. else:
  8. if not os.path.exists(ab): #如果没有这个文件则创建
  9. with open(ab, 'wb') as f:
  10. f.write( self.res) #将音频信息写入到文件
  11. #生成结束给一个提示
  12. messagebox.showinfo(title = '完毕!', message= '生成完毕,文件在程序目录下')
  13. else:
  14. messagebox.showerror(title= '出错了!',message= '文件名已存在') #有这个文件就提示

5、接下来,我们只需将这几个功能写入到一个类中即可,然后启动这个类。

play()

    
    

6、当我输入一段话后,大家可以看到它就生成了一个音频文件。而且读取的时候和我们输入的内容一模一样,比如我输入一段代码,见下图:

7、之后会得到下图所示的情形。

8、最后的效果如下图所示。

完美收工,哈哈哈!

/小结/

1、本文基于Python编程语言,结合百度开放平台,通过调用其接口,打造了一款简易的语音合成系统,方法行之有效,欢迎小伙伴们积极尝试。

2、需要本文代码的小伙伴可以在后台回复“语音合成”四个字进行获取。

    想学习更多关于Python的知识,可以参考学习网址:http://pdcfighting.com/,点击阅读原文,可以直达噢~

------------------- End -------------------

往期精彩文章推荐:

欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持

想加入Python学习群请在后台回复【入群

万水千山总是情,点个【在看】行不行

/今日留言主题/

随便说一两句吧~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值