用tkinter
写的界面,需要自己申请百度智能云的APP_ID、API_KEY 、SECRET_KEY 效果图如下:
实现代码如下:
import tkinter as tk
import tkinter.ttk as ttk
import tkinter.filedialog
import tkinter.messagebox
import requests
from pygame import mixer
from aip import AipSpeech
class Application:
def __init__(self,master):
self.master = master
# 变量名
self.network_status = tk.StringVar()
self.file_path = tk.StringVar()
# self.filename = ""
# 文字
self.data = ""
# 语速
self.spd = tk.StringVar()
self.spd.set("5")
# 音调
self.pit = tk.StringVar()
self.pit.set("5")
# 音量
self.vol = tk.StringVar()
self.vol.set("5")
# 发音人
self.per = tk.StringVar()
self.per_dict={
"女生":"0",
"男生":"1",
"度逍遥":"2",
"度丫丫":"3",
}
self.per.set("女生")
# 需要自己申请百度智能云的APP_ID、API_KEY 、SECRET_KEY 然后替换下面对应的******
self.APP_ID = ******
self.API_KEY = ******
self.SECRET_KEY = ******
self.client = AipSpeech(self.APP_ID, self.API_KEY, self.SECRET_KEY)
# 画界面
self.initWidgets()
def initWidgets(self):
self.master.title("TextToSpeech")
tk.Button(self.master,text="测试网络",command=self.isConnected).grid(row=0,column=0,padx=5,pady=5,sticky=tk.W+tk.E)
tk.Entry(self.master,textvariable=self.network_status,state="readonly",width=8).grid(row=0,column=1,padx=5,pady=5,columnspan=6,sticky=tk.W+tk.E)
tk.Button(self.master,text="设置",command=self.set_dialog).grid(row=0,column=7,padx=5,pady=5,sticky=tk.W+tk.E)
tk.Button(self.master,text="关闭",command=self.master.destroy,width=8).grid(row=0,column=8,padx=5,pady=5,sticky=tk.W+tk.E)
tk.Button(self.master,text="选择文件",command=self.get_file_path).grid(row=1,column=0,padx=5,pady=5,sticky=tk.W+tk.E)
tk.Entry(self.master,textvariable=self.file_path,state="readonly",width=56).grid(row=1,column=1,padx=5,columnspan=6,sticky=tk.W+tk.E)
tk.Button(self.master,text="生成mp3",command=self.product_mp3,width=8).grid(row=1,column=7,padx=5,pady=5,sticky=tk.W+tk.E)
tk.Button(self.master,text="播放",command=self.playback,width=8).grid(row=1,column=8,padx=5,pady=5,sticky=tk.W+tk.E)
tk.Label(self.master,text="语 速:",relief="groove").grid(row=2,column=0,padx=5,pady=5,sticky=tk.W+tk.E)
tk.Label(self.master,textvariable=self.spd,relief="sunken",width=6).grid(row=2,column=1,padx=5,pady=5,sticky=tk.W+tk.E)
tk.Label(self.master,text="音 调:",relief="groove").grid(row=2,column=3,padx=5,pady=5,sticky=tk.W+tk.E)
tk.Label(self.master,textvariable=self.pit,relief="sunken",width=6).grid(row=2,column=4,padx=5,pady=5,sticky=tk.W+tk.E)
tk.Label(self.master,text="音 量:",relief="groove").grid(row=2,column=5,padx=5,pady=5,sticky=tk.W+tk.E)
tk.Label(self.master,textvariable=self.vol,relief="sunken",width=6).grid(row=2,column=6,padx=5,pady=5,sticky=tk.W+tk.E)
tk.Label(self.master,text="发音人:",relief="groove",width=8).grid(row=2,column=7,padx=5,pady=5,sticky=tk.W+tk.E)
tk.Label(self.master,textvariable=self.per,relief="sunken",width=8).grid(row=2,column=8,padx=5,pady=5,sticky=tk.W+tk.E)
def playback(self):
top = tk.Toplevel(self.master)
mixer.init()
mixer.music.load('audio.mp3')
top.title("播放mp3")
tk.Button(top,text="播放",command=lambda:mixer.music.play()).grid(row=0,column=0,padx=5,pady=5,sticky=tk.W+tk.E)
tk.Button(top,text="暂停",command=lambda:mixer.music.pause()).grid(row=0,column=1,padx=5,pady=5,sticky=tk.W+tk.E)
tk.Button(top,text="恢复",command=lambda:mixer.music.unpause()).grid(row=0,column=2,padx=5,pady=5,sticky=tk.W+tk.E)
tk.Button(top,text="停止",command=lambda:mixer.music.stop()).grid(row=0,column=3,padx=5,pady=5,sticky=tk.W+tk.E)
tk.Button(top,text="关闭",command=top.destroy).grid(row=0,column=4,padx=5,pady=5,sticky=tk.W+tk.E)
def set_dialog(self):
top = tk.Toplevel(self.master)
top.title("设置")
tk.Label(top,text="语速:").grid(row=0,column=0,padx=5,pady=5)
cb_spd = ttk.Combobox(top,textvariable=self.spd)
cb_spd["value"] = ("0","1","2","3","4","5","6","7","8","9")
cb_spd.grid(row=0,column=1,padx=5,pady=5)
tk.Label(top,text="音调:").grid(row=1,column=0,padx=5,pady=5)
cb_pit = ttk.Combobox(top,textvariable=self.pit)
cb_pit["value"] = ("0","1","2","3","4","5","6","7","8","9")
cb_pit.grid(row=1,column=1,padx=5,pady=5)
tk.Label(top,text="音量:").grid(row=2,column=0,padx=5,pady=5)
cb_vol = ttk.Combobox(top,textvariable=self.vol)
cb_vol["value"] = ("0","1","2","3","4","5","6","7","8","9")
cb_vol.grid(row=2,column=1,padx=5,pady=5)
tk.Label(top,text="发音:").grid(row=3,column=0,padx=5,pady=5)
cb_per = ttk.Combobox(top,textvariable=self.per)
cb_per["value"] = ( "女生", "男生", "度逍遥", "度丫丫")
cb_per.grid(row=3,column=1,padx=5,pady=5)
tk.Button(top,text="关闭",command=top.destroy).grid(row=4,columnspan=2,padx=5,pady=5,sticky=tk.W+tk.E)
def get_file_path(self):
_file_path = tk.filedialog.askopenfilename()
if _file_path.endswith('.txt'):
self.file_path.set(_file_path)
# self.filename = _file_path.split("/")[-1].split('.')[0]
else:
tk.messagebox.showinfo(title="文件格式不对",message="请选择记事本格式的文件!")
def isConnected(self):
try:
requests.get("http://www.baidu.com",timeout=2)
except:
self.network_status.set("无网络连接!")
else:
self.network_status.set("网络连接正常")
def _get_file_content(self):
if self.file_path.get() == "":
tk.messagebox.showinfo(title="无文本",message="请先选择记事本格式的文件!")
else:
with open(self.file_path.get(),'r',encoding='utf-8') as f:
self.data = f.read()
def product_mp3(self):
self._get_file_content()
flag = True
if len(self.data) < 1024:
result = self.client.synthesis(self.data, 'zh', 1, {
'spd':self.spd.get(),
'pit':self.pit.get(),
'vol':self.vol.get(),
'per':self.per_dict[self.per.get()]
})
# 识别正确返回语音二进制 错误则返回dict 参照下面错误码
if not isinstance(result, dict):
with open('audio.mp3', 'wb') as f:
f.write(result)
else:
while self.data:
if flag:
flag=False
result = self.client.synthesis(self.data[:1023], 'zh', 1, {
'spd':self.spd.get(),
'pit':self.pit.get(),
'vol':self.vol.get(),
'per':self.per_dict[self.per.get()]
})
# 识别正确返回语音二进制 错误则返回dict 参照下面错误码
if not isinstance(result, dict):
with open('audio.mp3', 'wb') as f:
f.write(result)
self.data = self.data[1023:]
else:
result = self.client.synthesis(self.data[:1023], 'zh', 1, {
'spd':self.spd.get(),
'pit':self.pit.get(),
'vol':self.vol.get(),
'per':self.per_dict[self.per.get()]
})
# 识别正确返回语音二进制 错误则返回dict 参照下面错误码
if not isinstance(result, dict):
with open('audio.mp3', 'ab') as f:
f.write(result)
self.data = self.data[1023:]
tk.messagebox.showinfo(title="生成mp3中",message="生成mp3成功!")
def run(self):
self.master.mainloop()
if __name__ == "__main__":
root = tk.Tk()
display = Application(root)
display.run()