
离线配音与有声故事工坊
这段时间,我一直在做一些能用到生活里的小工具:给老动画提高清晰度,把孩子画的小人变成动画,生成可以打印的迷宫和连点画。
这次,我想给故事加上声音。
把写好的睡前故事贴进去,让电脑读出来;录一小段自己的声音,再试着用熟悉的音色讲另一段故事。对家长来说,它可以是制作故事音频的小帮手;对老师和内容创作者来说,也可以拿来做朗读素材、课程旁白和视频配音。
于是,我把开源语音模型做成了一个 Windows 桌面软件:离线配音与有声故事工坊。目前整理到了 r5,也一并准备了完整 VS2022 源码。
不装 Python,也能在桌面上直接配音
软件基于 OpenMOSS 的 MOSS-TTS-Nano 。官方介绍其语音模型约 0.1B 参数,支持声音克隆,提供 ONNX CPU 推理方案,并输出 48 kHz 立体声音频。模型与原始算法来自开源团队;我做的是 C# 推理移植、WinForms 界面和 Windows 部署整理。官方项目(github.com/OpenMOSS/MO...
这一版使用 C# + .NET Framework 4.8 + ONNX Runtime CPU。运行时不需要安装 Python、PyTorch 或 CUDA,也不要求独立显卡;模型在本机运行,日常配音无需调用在线接口。

r5 界面布局展示
图为 r5 实际窗体布局的离屏渲染,未启动麦克风或模型;运行时会显示可用音色和电脑上的录音设备。
现在可以做这些事情:
- 直接使用预置声音:提供 18 个官方预置参考音色,先输入一段文字就能体验。
- 导入参考 WAV:用自己已有的录音作为声音参考,不需要单独训练模型。
- 在软件里录音:选择麦克风、录制、试听,满意后点击"用作克隆声音"。
- 导入整篇 TXT:按模型的 token 预算自动分段,逐段合成。
- 边生成边试听:也可以等完整生成后再播放,最后另存为 WAV。
- 调整 CPU 线程:电脑还要做其他工作时,可以降低线程数。
第一次用,先生成一段短故事
完整解压 r5 运行包,双击"启动软件.cmd"或软件 EXE。保留默认的 ./models,在"声音来源"里选择"官方预置音色",再选一个声音。
把下面这段话贴到"朗读内容":
小朋友们,晚上好!今天我们来听一个关于勇气和友谊的故事。森林里住着一只小兔子,它总是喜欢帮助别人。
先保持默认分段设置,CPU 线程可以从 2 或 4 开始,点击"开始生成"。首次生成需要加载模型,会比后续任务多一些等待。
结果默认保存在软件目录下:
workspace/
时间-任务编号/
配音.wav
......分段文本与任务统计
这里的相对路径都以 EXE 所在目录 为准。把整个软件文件夹挪到其他位置,不需要修改源码里的盘符。
想用自己的声音,怎么操作?
在"录下我的声音"区域选择麦克风,点击"开始录音",自然说一段话。建议录 5~15 秒,声音清楚、一个人讲话,尽量避开背景音乐。
停止后先"试听录音",满意再点"用作克隆声音"。软件会自动把声音来源切换到"参考 WAV 克隆",填入刚录好的文件。接下来输入新的文字,点击生成即可。
参考录音和最终配音的内容可以不同。录音的作用是提供音色与说话特征,而不是把录音原封不动地复制一遍。
已经录过了,也不用重新录。 在"声音来源"里选"参考 WAV 克隆",点击"选择音频",打开之前保存的 WAV 即可。软件自己的录音默认在 ./workspace/recordings/ 中。
目前录音最长 30 秒;参考 WAV 同样限制在 0.3~30 秒内,推荐选取清楚的短片段。克隆是否自然,与参考录音、文字和模型本身都有关系,生成后记得试听。请使用自己的声音或已获授权的声音素材。
它是怎样把文字变成声音的?

从文字与参考声音到 WAV 的推理流程
整个过程可以拆成四步。
第一步,处理文字。 软件先做可选的中文数字基础规范化,再用 SentencePiece 分词器把文字转成模型认识的 token。长文章会按照 token 预算拆开,因此界面里的"60 token"不等于"60 个汉字"。
第二步,准备声音参考。 使用预置音色时,可以直接读取已有参考编码;使用自己的 WAV 时,先把音频转换到模型需要的格式,再由音频编码模型提取声音信息。
第三步,生成音频编码。 语音模型结合文字和参考声音,逐步预测后续的音频 token。C# 代码在这一步管理推理会话和 KV 缓存,避免每一步都重复处理全部历史内容。
第四步,还原并写出音频。 音频解码模型把编码转换成 PCM 样本,软件逐块写入 WAV;开启试听时,同步送给播放缓冲。最终输出为 48 kHz、双声道、16 位 PCM WAV,方便后续剪辑。
长文本不需要一次性把整篇音频放进内存。软件逐块写盘、分段合成,同时保留分段文本,便于检查读法和定位问题。
CPU 跑起来是什么速度?
为了给大家一个具体参考,我用 Ryzen 7 7735H、4 个 CPU 线程,配合官方公开参考 WAV,测试了上面的故事。
| 项目 | 本次结果 |
|---|---|
| 生成音频时长 | 15.60 秒 |
| 生成阶段耗时 | 约 12.07 秒 |
| 首批 PCM 延迟 | 约 2.44 秒 |
| RTF(耗时 ÷ 音频时长) | 约 0.77 |
| 进程峰值工作集 | 约 1.21 GiB |
这一次的平均生成速度快于播放速度。上述生成计时不含主模型会话的首次构建,包含本次参考声音的编码处理;它是单次样例数据,不代表所有电脑、所有文本都能达到相同速度,也不意味着点下按钮立刻出声。
另外,0.1B 参数不等于整套软件只有 100 MB。实际还需要语音模型的不同推理图、音频编解码模型、外部权重、分词器与运行库。本项目随带模型约 728 MiB,使用时的内存也高于模型文件体积。
r5 花了功夫的地方:把桌面使用里的问题处理好
模型能跑起来之后,实际使用还会遇到录音、分段、取消任务和 DLL 加载等问题。
这一轮修正了中文多句拼接规则,避免人为插入空格改变模型输入;也调整了 Windows 原生运行库的加载顺序,处理"选择完文件后 ONNX Runtime 初始化失败"的情况。r5 会在显示界面、打开文件框之前初始化自身目录的 ORT 和 VC++ 运行库,语音模型仍等到生成任务再加载。
其他细节也一起保留:参考音频编码复用、推理会话复用、有界试听缓冲、取消清理、错误日志,以及分段达到时长上限时明确报错,避免悄悄把截断的结果当成成功文件。
现在的界面围绕文字、录音和 WAV 配音展开。MP3 导出、情绪面板和语速控制还没有加入;多音字、复杂数字读法和克隆音质也需要结合具体材料试听。
给 C# 开发者:完整 VS2022 源码也整理好了
工程保留熟悉的 MainForm.cs + MainForm.Designer.cs + MainForm.resx,可以继续用 WinForms 设计器调整界面。
源码包包含模型、离线 NuGet 依赖、原生运行库、示例和第三方许可。安装 VS2022 的".NET 桌面开发"和".NET Framework 4.8 目标包"后,打开解决方案,选择 Release | x64 ,即可生成;也提供了 Build.cmd。
对于想学习 C# 调用 ONNX 的朋友,这个项目可以连起来看:分词器怎么对齐、参考音频怎么编码、KV 缓存怎么传递、录音和播放怎么与推理配合,以及如何整理一份能交给别人使用的 Windows 软件。
完整运行包与完整源码包已经整理,适合分别用于直接体验和二次开发。上游模型与组件的许可说明也随包保留,分发时请一起带上。
如果你也喜欢做这类实用的小工具,欢迎加入 QQ群:天天代码码天天,群号 264292622,一起交流 C#、AI 桌面应用和开源项目实践。
我很喜欢这种感觉:一段自己写的文字,变成孩子能反复听的故事。工具还有继续打磨的空间,但先把第一段故事讲出来,就已经很有意思了。