Python 编译Edge-TTS
利用PIP Edge-tts库来实现Azure 神经网络自然语音转MP3, 这应该是微软给老百姓们一个共享前沿科技大餐。(edge_tts)
找了网上的很多源代,现在利用现有公开的代码混编译一个个人的学习工具。代码仅供学习研究。
from tkinter import *
from tkinter.filedialog import *
from tkinter.messagebox import *
from tkinter import scrolledtext
import os
import edge_tts
import asyncio
import win32clipboard as w
import win32con
def gettext1():
gt= textPad.get(1.0, END)
TEXT=gt
VOICE = "en-GB-LibbyNeural"
if __name__ == "__main__":
asyncio.run(_main(VOICE))
def gettext2():
gt= textPad.get(1.0, END)
TEXT=gt
VOICE = "en-GB-MaisieNeural"
if __name__ == "__main__":
asyncio.run(_main(VOICE))
def gettext3():
gt= textPad.get(1.0, END)
TEXT=gt
VOICE = "en-GB-en-GB-RyanNeural"
if __name__ == "__main__":
asyncio.run(_main(VOICE))
def gettext4():
gt= textPad.get(1.0, END)
TEXT=gt
VOICE = "en-GB-SoniaNeural"
if __name__ == "__main__":
asyncio.run(_main(VOICE))
def gettext5():
gt= textPad.get(1.0, END)
TEXT=gt
VOICE = "en-GB-ThomasNeural"
if __name__ == "__main__":
asyncio.run(_main(VOICE))
def gettext6():
gt= textPad.get(1.0, END)
TEXT=gt
VOICE = "en-GB-MaisieNeural"
if __name__ == "__main__":
asyncio.run(_main(VOICE))
def gettext7():
gt= textPad.get(1.0, END)
TEXT=gt
VOICE = "en-HK-SamNeural"
if __name__ == "__main__":
asyncio.run(_main(VOICE))
def gettext8():
gt= textPad.get(1.0, END)
TEXT=gt
VOICE = "en-HK-YanNeural"
if __name__ == "__main__":
asyncio.run(_main(VOICE))
def gettext9():
gt= textPad.get(1.0, END)
TEXT=gt
VOICE = "en-US-AnaNeural"
if __name__ == "__main__":
asyncio.run(_main(VOICE))
def gettext10():
gt= textPad.get(1.0, END)
TEXT=gt
VOICE = "en-US-AriaNeural"
if __name__ == "__main__":
asyncio.run(_main(VOICE))
def gettext11():
gt= textPad.get(1.0, END)
TEXT=gt
VOICE = "en-US-ChristopherNeural"
if __name__ == "__main__":
asyncio.run(_main(VOICE))
def gettext12():
gt= textPad.get(1.0, END)
TEXT=gt
VOICE = "en-US-EricNeural"
if __name__ == "__main__":
asyncio.run(_main(VOICE))
def gettext13():
gt= textPad.get(1.0, END)
TEXT=gt
VOICE = "en-US-GuyNeural"
if __name__ == "__main__":
asyncio.run(_main(VOICE))
def gettext14():
gt= textPad.get(1.0, END)
TEXT=gt
VOICE = "en-US-JennyNeural"
if __name__ == "__main__":
asyncio.run(_main(VOICE))
def gettext15():
gt= textPad.get(1.0, END)
TEXT=gt
VOICE = "en-US-MichelleNeural"
if __name__ == "__main__":
asyncio.run(_main(VOICE))
def gettext16():
gt= textPad.get(1.0, END)
TEXT=gt
VOICE = "en-US-RogerNeural"
if __name__ == "__main__":
asyncio.run(_main(VOICE))
def gettext17():
gt= textPad.get(1.0, END)
TEXT=gt
VOICE = "en-US-SteffanNeural"
if __name__ == "__main__":
asyncio.run(_main(VOICE))
def gettext18():
gt= textPad.get(1.0, END)
TEXT=gt
VOICE = "zh-CN-YunyangNeural"
if __name__ == "__main__":
asyncio.run(_main(VOICE))
def gettext19():
gt= textPad.get(1.0, END)
TEXT=gt
VOICE = "zh-TW-YunJheNeural"
if __name__ == "__main__":
asyncio.run(_main(VOICE))
def gettext20():
gt= textPad.get(1.0, END)
TEXT=gt
VOICE = "zh-TW-HsiaoChenNeural"
if __name__ == "__main__":
asyncio.run(_main(VOICE))
def gettext21():
gt= textPad.get(1.0, END)
TEXT=gt
VOICE = "zh-TW-HsiaoYuNeural"
if __name__ == "__main__":
asyncio.run(_main(VOICE))
def gettext22():
gt= textPad.get(1.0, END)
TEXT=gt
VOICE = "zh-CN-XiaoxiaoNeural"
if __name__ == "__main__":
asyncio.run(_main(VOICE))
def gettext23():
gt= textPad.get(1.0, END)
TEXT=gt
VOICE = "zh-CN-XiaoyiNeural"
if __name__ == "__main__":
asyncio.run(_main(VOICE))
def gettext24():
gt= textPad.get(1.0, END)
TEXT=gt
VOICE = "zh-CN-YunjianNeural"
if __name__ == "__main__":
asyncio.run(_main(VOICE))
OUTPUT_FILE = "test.mp3"
WEBVTT_FILE = "test.vtt"
async def _main(VOICE) -> None:
communicate = edge_tts.Communicate(textPad.get(1.0, END), VOICE)
submaker = edge_tts.SubMaker()
with open(OUTPUT_FILE, "wb") as file:
async for chunk in communicate.stream():
if chunk["type"] == "audio":
file.write(chunk["data"])
elif chunk["type"] == "WordBoundary":
submaker.create_sub((chunk["offset"], chunk["duration"]), chunk["text"])
with open(WEBVTT_FILE, "w", encoding="utf-8") as file:
file.write(submaker.generate_subs())
def new_file(*args):
global top, filename, textPad
top.title("未命名文件")
filename = None
textPad.delete(1.0, END)
def open_file(*args):
global filename
filename = askopenfilename(defaultextension=".txt")
if filename == "":
filename = None
else:
top.title(""+os.path.basename(filename))
textPad.delete(1.0, END)
f = open(filename, 'r', encoding="utf-8")
textPad.insert(1.0, f.read())
f.close()
def click_open(event):
global filename
top.title("" + os.path.basename(filename))
textPad.delete(1.0, END)
f = open(filename, 'r', encoding="utf-8")
textPad.insert(1.0, f.read())
f.close()
def save(*args):
global filename
try:
f=open(filename, 'w', encoding="utf-8")
msg=textPad.get(1.0, 'end')
f.write(msg)
f.close()
except:
save_as()
def save_as(*args):
global filename
f = asksaveasfilename(initialfile="未命名.txt", defaultextension=".txt")
filename = f
fh = open(f, 'w', encoding="utf-8")
msg = textPad.get(1.0, END)
fh.write(msg)
fh.close()
top.title(""+os.path.basename(f))
def rename(newname):
global filename
name = os.path.basename(os.path.splitext(filename)[0])
oldpath = filename
newpath = os.path.dirname(oldpath)+'/'+newname+'.txt'
os.rename(oldpath, newpath)
filename = newpath
refresh()
def rename_file(*args):
global filename
t = Toplevel()
t.geometry("300x80+200+250")
t.title('重命名')
frame = Frame(t)
frame.pack(fill=X)
lable = Label(frame, text="文件名")
lable.pack(side=LEFT, padx=5)
var = StringVar()
e1 = Entry(frame, textvariable=var)
e1.pack(expand=YES, fill=X, side=RIGHT)
botton = Button(t, text="确定", command=lambda: rename(var.get()))
botton.pack(side=BOTTOM, pady=10)
def delete(*args):
global filename, top
choice = askokcancel('提示', '要执行此操作吗')
if choice:
if os.path.exists(filename):
os.remove(filename)
textPad.delete(1.0, END)
top.title("记事本")
filename = ''
def cut():
global textPad
textPad.event_generate("<<Cut>>")
def copy():
global textPad
textPad.event_generate("<<Copy>>")
def paste():
global textPad
textPad.event_generate("<<Paste>>")
def undo():
global textPad
textPad.event_generate("<<Undo>>")
def redo():
global textPad
textPad.event_generate("<<Redo>>")
def select_all():
global textPad
textPad.tag_add("sel", "1.0", "end")
def mypopup(event):
global editmenu
editmenu.tk_popup(event.x_root, event.y_root)
def refresh():
global top, filename
if filename:
top.title(os.path.basename(filename))
else:
top.title("浩读系列-edge-tts")
top = Tk()
top.title("浩读系列-edge-tts")
top.geometry("640x480")
menubar = Menu(top)
filemenu = Menu(top)
filemenu.add_command(label="新建", accelerator="Ctrl+N", command=new_file)
filemenu.add_command(label="打开", accelerator="Ctrl+O", command=open_file)
filemenu.add_command(label="保存", accelerator="Ctrl+S", command=save)
filemenu.add_command(label="另存为", accelerator="Ctrl+shift+s", command=save_as)
filemenu.add_command(label="重命名", accelerator="Ctrl+R", command=rename_file)
filemenu.add_command(label="删除", accelerator="Ctrl+D", command=delete)
menubar.add_cascade(label="文件", menu=filemenu)
editmenu = Menu(top)
editmenu.add_command(label="撤销", accelerator="Ctrl+Z", command=undo)
editmenu.add_command(label="重做", accelerator="Ctrl+Y", command=redo)
editmenu.add_separator()
editmenu.add_command(label="剪切", accelerator="Ctrl+X", command=cut)
editmenu.add_command(label="复制", accelerator="Ctrl+C", command=copy)
editmenu.add_command(label="粘贴", accelerator="Ctrl+V", command=paste)
editmenu.add_separator()
editmenu.add_command(label="全选", accelerator="Ctrl+A", command=select_all)
menubar.add_cascade(label="编辑", menu=editmenu)
aboutmenu = Menu(top)
aboutmenu.add_command(label="en-GB-LibbyNeural", command=gettext1)
aboutmenu.add_command(label="en-GB-MaisieNeural", command=gettext2)
aboutmenu.add_command(label="en-GB-en-GB-RyanNeural", command=gettext3)
aboutmenu.add_command(label="en-GB-SoniaNeural", command=gettext4)
aboutmenu.add_command(label="en-GB-ThomasNeural", command=gettext5)
aboutmenu.add_command(label="en-GB-MaisieNeural", command=gettext6)
aboutmenu.add_command(label="en-HK-SamNeural", command=gettext7)
aboutmenu.add_command(label="en-HK-YanNeural", command=gettext8)
aboutmenu.add_command(label="en-US-AnaNeural", command=gettext9)
aboutmenu.add_command(label="en-US-AriaNeural", command=gettext10)
aboutmenu.add_command(label="en-US-ChristopherNeural", command=gettext11)
aboutmenu.add_command(label="en-US-EricNeural", command=gettext12)
aboutmenu.add_command(label="en-US-GuyNeural", command=gettext13)
aboutmenu.add_command(label="en-US-JennyNeural", command=gettext14)
aboutmenu.add_command(label="en-US-MichelleNeural", command=gettext15)
aboutmenu.add_command(label="en-US-RogerNeural", command=gettext16)
aboutmenu.add_command(label="en-US-SteffanNeural ", command=gettext17)
aboutmenu.add_command(label="zh-CN-YunyangNeural", command=gettext18)
aboutmenu.add_command(label="zh-TW-YunJheNeural", command=gettext19)
aboutmenu.add_command(label="zh-TW-HsiaoChenNeural", command=gettext20)
aboutmenu.add_command(label="zh-TW-HsiaoYuNeural", command=gettext21)
aboutmenu.add_command(label="zh-CN-XiaoxiaoNeural", command=gettext22)
aboutmenu.add_command(label="zh-CN-XiaoyiNeural", command=gettext23)
aboutmenu.add_command(label="zh-CN-YunjianNeural", command=gettext24)
menubar.add_cascade(label="转成MP3", menu=aboutmenu)
top['menu'] = menubar
shortcutbar = Frame(top, height=25, bg='Silver')
shortcutbar.pack(expand=NO, fill=X)
textPad=Text(top, undo=True)
scroll=Scrollbar(textPad,width=15)
textPad.config(yscrollcommand=scroll.set,wrap="word",borderwidt=10,font=25)
scroll.config(command=textPad.yview)
textPad.pack(expand=YES, fill=BOTH)
textPad.bind("<Control-N>", new_file)
textPad.bind("<Control-n>", new_file)
textPad.bind("<Control-O>", open_file)
textPad.bind("<Control-o>", open_file)
textPad.bind("<Control-S>", save)
textPad.bind("<Control-s>", save)
textPad.bind("<Control-D>", delete)
textPad.bind("<Control-d>", delete)
textPad.bind("<Control-R>", rename_file)
textPad.bind("<Control-r>", rename_file)
textPad.bind("<Control-A>", select_all)
textPad.bind("<Control-a>", select_all)
textPad.bind("<Button-3>", mypopup)
top.mainloop()
注:以上代码进行二次编译合并。请安装相关的库才能使用。如有版权请通知删除。(edge_tts)