Python调用API打造一个语音合成系统(百度智能云)
将文字转换成各种不同味道(大叔型,萝莉音,精神小伙型等)的语音。
申请一个百度智能云账号
使用Python开发一款智能语音合成系统,所以需要Python SDK
进去可以看到它的使用说明
创建一个应用
下面就显示你创建成功
创建后按我这样申请免费额度
这样就可以获得三个重要的参数
APP_ID:应用id
API_KEY:应用钥匙
SECRET_KEY:安全码
所用软件
Pycharm.3
下载和配置百度语音客户端
1:下载百度Python api
pip install baidu-aip
2:配置百度语音客户端,具体步骤如下:
A:新建AipSpeech
from 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)
B:新建一个py文件运行
import osimport sysimport tkinter as tkfrom tkinter import ttkfrom tkinter import messageboxfrom aip import AipSpeechclass play:def __init__(self):self.root=tk.Tk() #初始化窗口self.root.title("语音合成系统") #窗口名称self.root.geometry("700x700") #设置窗口大小self.root.resizable(width=True,height=True)#设置窗口是否可变,宽不可变,高可变,默认为Trueself.lb=tk.Label(self.root,text='请选择语音类型')#标签self.tt=tk.Text(self.root,width=80,height=30) #多行文本框self.cb=bobox(self.root, width=12) #下拉列表框#设置下拉列表框的内容self.cb['values']=('请选择-----','甜美型','萝莉型','大叔型','精神小伙型')self.cb.current(0) #将当前选择状态置为0,也就是第一项self.cb.bind("<<ComboboxSelected>>",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()#启动主页面def go(self, *arg): # *arg是为了接受多个如同列表的参数,还有个**kwarg能接受如同字典的参数# 百度apiself.APP_ID = '你的 App ID'self.API_KEY = '你的 Api Key'self.SECRET_KEY = '你的 Secret Key'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.reselif 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.reselif 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.resdef 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: # 判断长度是否超过1024messagebox.showerror(title='出错了!', message='^_^最多不超过1024个字节^_^')else:if not os.path.exists(ab): # 如果没有这个文件则创建with open(ab, 'wb+') as f:f.write(str(self.res).encode('utf-8')) # 将音频信息写入到文件# 生成结束给一个提示messagebox.showinfo(title='完毕!', message='生成完毕,文件在程序目录下')else:messagebox.showerror(title='出错了!', message='文件名已存在') # 有这个文件就提示play()
生成的结果
在目录下生成如下的MP3
亟待解决的问题
搞出来的MP3不能播放,MP3用记事本打开显示是这样的:
(如果有知道的伙伴可以在底下评论写下解决方案,方便大家)