乐于分享
好东西不私藏

用AI做一个文本变有声书的软件

用AI做一个文本变有声书的软件

    前几天看到一个文章说的是 ,小米团队开源多语言TTS模型OmniVoice,支持600+语种零样本语音克隆。模型采用极简非自回归扩散架构,结合全码本随机Mask与LLM初始化技术,实现40倍实时推理速度。OmniVoice支持音色设计、音频去噪、副语言控制(如笑声)及发音纠正,在音质与语言覆盖度上达到SOTA水平,特别对低资源语言展现强泛化能力。

OmniVoice的主要功能

  • 超大规模多语言合成
    :支持 600+ 语种的零样本 TTS,覆盖从高频到低资源小语种,基于 58 万小时开源数据训练。
  • 零样本语音克隆
    :仅需 3-10 秒参考音频即可克隆任意说话人音色,支持自动转录(内置 Whisper)或手动提供文本。
  • 属性化音色设计
    :无需参考音频,通过自然语言描述(性别、年龄、音调、方言/口音、耳语风格等)直接生成定制声音。
  • 参考音频去噪
    :可处理带噪声或混响的参考音频,提取纯净说话人特征,避免合成语音携带环境杂音。
  • 副语言控制:插入 [laughter][sigh] 等标签添加笑声、叹气等情感

  • 发音纠正:用拼音(如 ZHE2)或 CMU 音素(如 [B EY1 S])纠正多音字和专有名词发音

 看了下来感觉很有意思,就在我本地那台破电脑(H60主板+E3处理器+p100-106显卡+ddr3的16G内存)上按照网上的教程折腾着安装起来了,在他原生的界面上生成了一些音频感觉效果还不错,想到以前听有声书都是在某些APP听的真人配音的,有时候会遇到喜欢的书找不到音频的问题,主流的听书软件基本都是小说的,其他类型的书很少,于是就萌生了让AI写个应用,将txt文本或者pdf文本提取文字切分之后按提取角色,给角色绑定音色,然后讲文字转换为音频的想法,于是说干就干。

核心功能

它是怎么工作的

第一步:角色识别

工具会扫描全文,用正则匹配 “张三说:”“李四笑道:” 这样的模式,提取出说话人。然后根据上下文线索——比如附近出现了”奶奶””姑娘”这类词——自动推断角色的性别和年龄段,并分配对应的音色模板。

第二步:对话拆分

一段文字里可能既有旁白又有多个角色的对话。比如:

张三摇了摇头,道:「你总是这么悲观。」李四叹道:「我也没办法。」

工具会先把 “张三摇了摇头,道:” 标准化为 “张三道:”,然后拆成三个独立片段:旁白、张三对话、李四对话,各自用对应角色的音色生成。

第三步:音色一致性保证

这是最核心的难点。每个角色绑定一个 voice_key,由角色名 + 性别 + 年龄 + 音色指令组成。同角色在任何位置都走同一条音色路径:

第四步:生成与合并

每个片段独立调用 OmniVoice 生成 wav,支持断点续传——中途中断,下次接着来。生成完成后,点击”合并音频”,碎片文件按字数阈值自动合并,比如每 800 字一个大音频,片段间插入 0.5 秒静音,听感自然流畅。

技术栈

PythonPyQt6OmniVoice TTSCUDA GPUPyMuPDFsoundfileNumPy

整个工具基于 OmniVoice 本地 TTS 模型运行,调用 GPU 加速推理,不依赖任何云端 API,数据完全不出本机。界面用 PyQt6 构建,支持实时查看生成进度和日志。

开发中踩过的坑

做角色识别的时候,“李四笑道” 里的 “笑” 会被错误地吃进人名,变成角色 “李四笑”。解决方案是把人名匹配限定为恰好 2 个纯中文字符,而 “笑道” 作为一个整体动词来匹配。

还有 “张三摇了摇头,道:” 这种说话人 + 动作描述 + 说话动词的模式,最初整段都被归为旁白。后来加了一个预处理器,把逗号前的动作描述剥离,只保留 “张三道:”,问题才解决。

最终生成的软件效果
只是我那破电脑目前跑这个项目还是比较吃力的,软件运行起来开始转换之后GPU使用率一直就是99%,一直是跑满的状态。后续只能看看有没有其他好的替代模型,不然这个项目没法运行,我测试了一个文本也就两章的内容,要跑半个多小时才行,要配完一本书不知道要到猴年马月去了
下面是生成的音频的效果,多人的时候还是有音色区分的
最后,我把软件打包上传到网盘了,有需要的可以关注公众号,在公众号的聊天框中输入关键字(长按复制后面蓝色字体内容)   EdOopYv2p2  获取