这篇也主要是 向各位介绍下,顺便交流
说明:
1 暂时
[color=]仅支持 英文
,(中文还不支持 还在研发中)
2 模型地址:
https://hf-mirror.com/hexgrad/Kokoro-82M (镜像地址,可直接访问)
3 用的新的辅助三方库 kokoro-onnx,仓库地址:https://github.com/thewh1teagle/kokoro-onnx
4 模型文件 kokoro-v0_19.onnx 体积 329MB (fp32 精度的版本)(可以通过 hf 或 github 找链接下载)
模型应该还可以量化,比如fp16,int8之类,未来可以期待一波
5 还有个 voices.json 文件, 这个是 kokoro-onnx仓库自己的操作,将模型发布带的 voicepack 转过来的 (需要从github下载)
---分割---
这个本来是个测试,不过AI辅助很方便,那么就顺手写个 GUI,(简陋勿怪,仅为测试)
* 需要 先安装 kokoro-onnx
[color=]pip install kokoro-onnx
* 两个文件放在脚本 同目录即可
mulu.PNG (12.91 KB, 下载次数: 0)
下载附件
2025-1-21 00:15 上传
* 简单的界面
screenshot01.PNG (14.5 KB, 下载次数: 0)
下载附件
2025-1-21 00:16 上传
---代码---
[Python] 纯文本查看 复制代码
import tkinter as tk
from tkinter import ttk, scrolledtext, messagebox
from kokoro_onnx import Kokoro
import soundfile as sf
import threading # For running TTS in a separate thread
import time
from functools import wraps
from datetime import datetime
# 获取当前时间
now = datetime.now()
formatted_time = now.strftime('%Y%m%d_%H%M')
def timeit(func):
"""
一个用于测量函数运行时间的装饰器。
Args:
func: 要装饰的函数。
Returns:
一个封装了计时功能的函数。
"""
@wraps(func)
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
execution_time = end_time - start_time
print(f"函数 '{func.__name__}' 运行时间: {execution_time:.2f} 秒")
return result
return wrapper
VOICE_NAME = [
'af', # Default voice is a 50-50 mix of Bella & Sarah
'af_bella', 'af_sarah', 'am_adam', 'am_michael',
'bf_emma', 'bf_isabella', 'bm_george', 'bm_lewis',
'af_nicole', 'af_sky',
]
#暂时语言仅 英语
LANG_NAME =[
"en-us", # English
"en-gb", # English (British)
"fr-fr", # French
"ja", # Japanese
"ko", # Korean
"cmn", # Mandarin Chinese
]
class TTSApp:
def __init__(self, root):
self.root = root
self.root.title("Kokoro TTS GUI")
self.kokoro = None # Initialize Kokoro instance
self.create_widgets()
def create_widgets(self):
# --- Text Area ---
ttk.Label(self.root, text="Text to Speak:").grid(row=0, column=0, sticky="w", padx=5, pady=5)
self.text_area = scrolledtext.ScrolledText(self.root, wrap=tk.WORD, width=60, height=10)
self.text_area.grid(row=1, column=0, columnspan=3, padx=5, pady=5)
# --- Voice Parameter ---
ttk.Label(self.root, text="Voice:").grid(row=2, column=0, sticky="w", padx=5, pady=5)
self.voice_var = tk.StringVar(value="af") # Default value
self.voice_combobox = ttk.Combobox(self.root, textvariable=self.voice_var, values=VOICE_NAME)
self.voice_combobox.grid(row=2, column=1, sticky="ew", padx=5, pady=5)
# --- Speed Parameter ---
ttk.Label(self.root, text="Speed (0.5-2.0):").grid(row=3, column=0, sticky="w", padx=5, pady=5)
self.speed_var = tk.DoubleVar(value=1.0) # Default speed
self.speed_entry = ttk.Entry(self.root, textvariable=self.speed_var)
self.speed_entry.grid(row=3, column=1, sticky="ew", padx=5, pady=5)
# --- Language Parameter ---
ttk.Label(self.root, text="Language:").grid(row=4, column=0, sticky="w", padx=5, pady=5)
self.lang_var = tk.StringVar(value="en-us")
self.lang_entry = ttk.Entry(self.root, textvariable=self.lang_var)
self.lang_entry.grid(row=4, column=1, sticky="ew", padx=5, pady=5)
# --- Run Button ---
self.run_button = ttk.Button(self.root, text="Generate Speech", command=self.run_tts)
self.run_button.grid(row=5, column=0, columnspan=3, pady=10)
self.root.columnconfigure(1,weight=1) # Make column expand
def run_tts(self):
text = self.text_area.get("1.0", "end-1c").strip()
voice = self.voice_var.get()
try:
speed = float(self.speed_var.get())
if not 0.5