没多的话直接贴代码(python):
import tkinter as tk
from tkinter import filedialog
from tkinter import messagebox
import requests
import base64
class GetVoice:
headers = {
"accept": "*/*",
"accept-language": "en-US,en;q=0.9",
"referer": "https://www.google.com/",
"sec-ch-ua": "\"Chromium\";v=\"124\", \"Google Chrome\";v=\"124\", \"Not-A.Brand\";v=\"99\"",
"sec-ch-ua-arch": "\"x86\"",
"sec-ch-ua-bitness": "\"64\"",
"sec-ch-ua-full-version": "\"124.0.6367.208\"",
"sec-ch-ua-full-version-list": "\"Chromium\";v=\"124.0.6367.208\", \"Google Chrome\";v=\"124.0.6367.208\", \"Not-A.Brand\";v=\"99.0.0.0\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-model": "\"\"",
"sec-ch-ua-platform": "\"Windows\"",
"sec-ch-ua-platform-version": "\"15.0.0\"",
"sec-ch-ua-wow64": "?0",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
"x-dos-behavior": "Embed"
}
# 代理选填
'''proxies = {
"http": "http://127.0.0.1:7890",
"https": "http://127.0.0.1:7890",
}'''
@staticmethod
def write_speech(text, language, outputfile):
if not outputfile.lower().endswith(".mp3"):
outputfile += ".mp3"
text = text.replace(",", "%2C")
text = requests.utils.quote(text)
url = f"https://www.google.com/async/translate_tts?&ttsp=tl:{language},txt:{text},spd:1&cs=0&async=_fmt:jspb"
response = requests.get(url, headers=GetVoice.headers)
#response = requests.get(url, headers=GetVoice.headers, proxies=GetVoice.proxies)
try:
response.raise_for_status()
except requests.exceptions.HTTPError:
return False
response_body = response.text
response_body = response_body[response_body.find("[\"") + 2:response_body.rfind("\"]")]
try:
data = base64.b64decode(response_body)
with open(outputfile, "wb") as file:
file.write(data)
return True
except Exception as e:
print(e)
return False
class Language:
Chinese = "zh-CN"
English = "en"
class App:
def __init__(self, root):
self.root = root
self.root.title("Text to Speech Converter")
tk.Label(root, text="Enter Text:").pack()
self.text_input = tk.Text(root, height=10, width=50)
self.text_input.pack()
tk.Label(root, text="Select Language:").pack()
self.language_var = tk.StringVar(root)
self.language_var.set("English") # default value
languages = ("English", "Chinese")
self.language_option = tk.OptionMenu(root, self.language_var, *languages)
self.language_option.pack()
self.save_button = tk.Button(root, text="Save as MP3", command=self.save_as)
self.save_button.pack()
def save_as(self):
text = self.text_input.get("1.0", "end-1c")
language = self.language_var.get()
lang_code = Language.English if language == "English" else Language.Chinese
outputfile = filedialog.asksaveasfilename(
defaultextension=".mp3",
filetypes=[("MP3 files", "*.mp3")],
)
if outputfile:
success = GetVoice.write_speech(text, lang_code, outputfile)
if success:
messagebox.showinfo("Success", f"语音文件已成功保存为 {outputfile}")
else:
messagebox.showerror("Error", "语音文件生成失败")
if __name__ == "__main__":
root = tk.Tk()
app = App(root)
root.mainloop()
运行效果
.
注意:无法直连google的需要修改下代理