1. 项目概述
最近在浏览中文配音作品时,我发现大多数高质量语音合成服务都需要付费。这让我想到:开源社区中其实已经有不少优秀的中文语音合成(TTS)工具,只是很多人不知道如何使用。于是,我决定开发一个完全免费、开箱即用的本地化中文语音合成工具,基于Kokoro-onnx中文语音库kokoro-v1.1-zh.onnx版本。
这个工具的特点在于:
- 完全本地运行,无需联网
- 支持中英文混合朗读
- 提供角色扮演功能,可为不同角色分配不同声音
- 图形化界面操作简单
- 输出音频质量高,接近商业产品水平
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与模型下载
2.1 系统要求
要运行这个工具,你的电脑需要满足以下基本配置:
- 操作系统:Windows 10/11或Linux(Mac需自行测试)
- Python版本:3.7及以上
- 内存:至少4GB(推荐8GB)
- 存储空间:至少2GB可用空间(用于存放模型文件)
2.2 模型文件下载
项目需要两个核心模型文件:
- kokoro-v1.1-zh.onnx(主模型)
- voices-v1.1-zh.bin(语音库)
可以从以下地址下载:
code复制https://github.com/thewh1teagle/kokoro-onnx/releases/tag/model-files-v1.1
下载后,请将这两个文件放在项目根目录下。
2.3 Python依赖安装
运行以下命令安装所需Python包:
bash复制pip install numpy soundfile tkinter scrolledtext
3. 核心功能解析
3.1 多语言混合朗读
工具能够智能识别中英文混合文本,并自动切换语音模型进行处理。这是通过正则表达式实现的:
python复制def split_text_by_language(text):
pattern = r'([^\x00-\x7f]+)|([\x00-\x7f]+)'
segments = []
for match in re.finditer(pattern, text):
non_ascii = match.group(1) # 非ASCII字符(中文)
ascii_part = match.group(2) # ASCII字符(英文)
if non_ascii and non_ascii.strip():
segments.append(('zh', non_ascii.strip()))
elif ascii_part and ascii_part.strip():
segments.append(('en', ascii_part.strip()))
return segments
3.2 角色语音分配
工具支持为不同角色分配不同声音。中文有100种声音可选(zf_001到zm_100),英文有3种(af_maple, af_sol, bf_vale)。
角色配置界面允许用户自定义12个角色的声音:
python复制# 中文语音列表
CHINESE_VOICES = [
'zf_001', 'zf_002', ..., 'zm_100' # 完整列表见源代码
]
# 英文角色映射
ENGLISH_ROLE_MAP = {'A': 'af_maple', 'B': 'af_sol', 'C': 'bf_vale'}
3.3 文本预处理
为确保合成质量,工具会对输入文本进行清理:
- 删除特殊符号(引号、破折号等)
- 处理省略号
- 移除不可见字符
- 清理多余空格
python复制def clean_text_for_tts(text):
# 删除中文引号
text = text.replace('\u201c', '').replace('\u201d', '')
# 删除破折号
text = text.replace('—', '').replace('–', '')
# 处理省略号
text = text.replace('…', '。').replace('...', '.')
# 更多清理逻辑...
return text.strip()
4. 使用教程
4.1 基本使用步骤
- 下载模型文件并放置在项目目录
- 安装Python依赖
- 运行主程序:
python tts_gui.py - 在"文本朗读"标签页输入要朗读的文本
- 点击"朗读"按钮生成音频
4.2 角色文本格式
要为不同角色分配不同声音,请使用以下格式:
code复制角色名: 要说的话
角色名: 第二句话
另一个角色: 他的发言
示例:
code复制A: Hello everyone!
B: 大家好,欢迎来到节目。
F: 今天我们要讨论人工智能。
4.3 高级功能
- 记事本功能:可以保存常用文本,快速复制到朗读区
- 音频导出:支持将合成的音频保存为WAV文件
- 批量处理:通过修改代码可以实现批量文本转语音
5. 常见问题解决
5.1 模型加载失败
如果遇到模型加载失败的问题,请检查:
- 模型文件是否下载完整
- 模型文件是否放在正确目录
- 文件权限是否正常
5.2 合成质量不佳
如果合成语音质量不理想,可以尝试:
- 清理输入文本中的特殊符号
- 为中文和英文分别指定更适合的声音
- 调整文本分段(适当添加标点)
5.3 性能优化
如果合成速度慢,可以考虑:
- 升级硬件配置(特别是CPU)
- 减少单次合成的文本长度
- 关闭其他占用资源的程序
6. 开发技巧与经验分享
6.1 音频处理技巧
在拼接多段音频时,我添加了短暂的静音间隔,使过渡更自然:
python复制SILENCE_DURATION = 0.2 # 200毫秒静音
silence = np.zeros(int(SAMPLE_RATE * SILENCE_DURATION), dtype=audio.dtype)
audio_chunks.append(silence)
6.2 多线程处理
为避免界面卡顿,合成过程放在单独线程中执行:
python复制thread = threading.Thread(target=self.synthesis_thread, args=(text,))
thread.daemon = True
thread.start()
6.3 文件命名策略
使用时间戳命名输出文件,避免重复:
python复制def generate_timestamp_filename():
now = datetime.now()
timestamp = now.strftime("%Y%m%d_%H%M%S_%f")[:-3] # 保留毫秒(3位)
return f"TTS_{timestamp}.wav"
7. 项目扩展思路
这个工具还有很大的扩展空间:
- 支持更多语言:目前主要支持中英文,可以扩展其他语言
- 语音效果调节:增加语速、音调等参数调节
- 批量处理功能:支持导入文本文件批量转换
- API接口:提供Web API供其他程序调用
- 移动端适配:开发手机APP版本
我在实际使用中发现,这个工具特别适合以下场景:
- 制作有声书
- 为视频配音
- 开发语音助手
- 语言学习辅助工具
通过这个项目,我深刻体会到开源语音技术的进步。虽然与顶级商业产品还有差距,但已经能满足大多数日常需求。随着技术的不断发展,相信开源语音合成会越来越成熟。
