用本地TTS零成本生成有声书朗读

你想听的小说迟迟没有有声版,播客平台上翻来翻去只有那种干巴巴的机器朗读——这事儿我也经历过。
后来发现,只需要一台有显卡的普通电脑,再加上一个叫 MOSS‑TTS 的开源模型,就能把任何电子书零成本转成自然流畅的真人感朗读,而且还能用自己的声音,或者你喜欢的任何音色。

这篇文章就是写给 不想为配音付费、又对语音质量有起码审美 的普通人。不一定需要你会编程,但我会把整个操作链路拆成“复制、粘贴、稍微改两行”的程度。


为什么是 MOSS‑TTS,而不是别家

市面上能用的免费 TTS 不少,但多数一开口就透着一股“电子味”:语调像心电图,字与字之间带着诡异的停顿,听久了会生理性难受。
MOSS‑TTS(来自 OpenMOSS 团队的 v1.5 版)是我实测下来,在免费、本地部署、中文效果三件事上平衡得最好的模型。它支持 零样本声音克隆——你录 3‑10 秒随便一个人说话的音频,它就能用那种音色、口吻去念一整本书。不需要漫长训练,也不需要标注数据。

打个比方:传统语音合成像用乐高搭积木,每个发音单元都是预先录制好的,拼接起来生硬;MOSS‑TTS 更像一个模仿演员,它学会了“声音的说话方式”,然后照着稿子临场表演,所以会更有轻重缓急。


从电子书到可听的有声文件,总共三步

你不需要懂深度学习,只需要会打开命令行(终端),把下面这几步跑一遍。全程都在你自己的电脑上,不联网,不花钱,不泄露任何文本。

1. 准备好文本,切成小段

MOSS‑TTS 一次能处理的文字长度有限制(大概两三百字比较稳),所以我们需要先把整本《三体》或者你想听的任意 txt 文件切分成自然段。
这是一个极简的切分思路,你可以直接存成一个 split_text.py 文件:

import re

with open("book.txt", "r", encoding="utf-8") as f:
    text = f.read()

# 按章节或者自然段切分,这里用连续两个换行作为段落边界
paragraphs = re.split(r'\n\s*\n', text)
paragraphs = [p.strip() for p in paragraphs if p.strip()]

# 把太长的段落再按句号等标点拆短
max_len = 300
short_paragraphs = []
for p in paragraphs:
    while len(p) > max_len:
        idx = max_len
        for sep in ['。', '!', '?', ';']:
            pos = p.rfind(sep, 0, max_len)
            if pos > 0:
                idx = pos + 1
                break
        short_paragraphs.append(p[:idx].strip())
        p = p[idx:].strip()
    short_paragraphs.append(p)

# 保存成每行一段
with open("paragraphs.txt", "w", encoding="utf-8") as f:
    for s in short_paragraphs:
        f.write(s + "\n")

跑完后你会得到一个 paragraphs.txt,一行就是一段话,供后面 TTS 逐个合成。

2. 安装 MOSS‑TTS,一键下载模型

这里假设你有一台英伟达显卡(6G 显存以上最好,纯 CPU 也能跑,只是慢),已经装好 Python 3.10 和 Git。
接下来用官方推理脚本,直接从 Hugging Face 拉取模型:

git clone https://github.com/OpenMOSS/MOSS-TTS.git
cd MOSS-TTS
pip install -r requirements.txt
# 模型会自动在第一次运行时下载,约2G

你完全可以把它当成一个“黑盒子”,不需要深究里面的神经网络怎么算。

3. 合成音频并拼接

用一段 Python 脚本逐行读取 paragraphs.txt,调用 MOSS‑TTS 生成对应 wav 文件,最后用 pydub 库把它们按顺序接起来。这里的关键是 保持音色统一——把参考声音那几秒的 wav 文件(比如你录的一句“大家好我是小美”)每段都用上,就能保证整本书听上去像同一个人在朗读。

import os
import subprocess
from pydub import AudioSegment

reference_wav = "reference.wav"   # 你的3秒参考音频
lines = open("paragraphs.txt", "r", encoding="utf-8").readlines()

parts = []
for i, line in enumerate(lines):
    out_file = f"temp_{i:04d}.wav"
    # 假设官方推理脚本支持 --ref_wav 和 --output 参数
    subprocess.run([
        "python", "inference.py",
        "--text", line.strip(),
        "--ref_wav", reference_wav,
        "--output", out_file
    ])
    parts.append(out_file)

# 拼接所有片段
combined = AudioSegment.empty()
for p in parts:
    seg = AudioSegment.from_wav(p)
    combined += seg
    os.remove(p)   # 清理临时文件

combined.export("audiobook.wav", format="wav")
print("有声书生成完毕:audiobook.wav")

对于一本 10 万字的书,在 RTX 3060 上大概一两个小时就能出成品。你可以边合成边去喝咖啡,甚至可以同时给另一本书跑另一个音色。


这条路跟其他方案比,到底好在哪

相比商业 TTS API(微软 Azure、阿里云等)
– 成本:API 按字符数收费,10 万字差不多要几十块甚至上百块,而本地 MOSS‑TTS 完全免费。
– 可控性:API 通常锁死音色列表,你没法用自己奶奶的声音;本地模型可以拿任何一段音频克隆音色,0 门槛。
– 隐私:你的文本不会上云,不用担心电子书内容被服务商记录下来。

相比自己录音
– 时间:录一本有声书少说几十个小时,反复 NG,普通人基本坚持不下来。
– 修改成本:如果后期发现某段读错了,真人要重录;AI 只需要改那一段文本重新合成。

当然,它也有不擅长的场合
– 情绪极度夸张的台词(大哭大笑那种),AI 处理得还不够细腻,可能会听起来像“端着”。
– 多角色对话时,它不能自动变声,需要你自己切出不同角色、配上不同参考音色,稍微多了点手工活。
– 如果电脑没有显卡,合成一本长书可能需要一整夜,急用时会有点煎熬。

但在 80% 的日常听书需求下——叙事、知识类、甚至带点温情的小说——MOSS‑TTS 的输出已经能让听者忘记这是 AI 的声音。


这意味着什么

过去想做一本有声书,你至少需要:
– 一位声音条件好的朗读志愿者或专业配音员
– 一个安静的录音棚
– 几天的后期剪辑

现在,只要你会调个 Python 脚本,一个周末就能给自己、孩子、甚至微信群里的朋友们做出专属于你口音的有声书仓库。这种方式把“高质量语音内容的生产权”拉回到了每个人手里。

下次遇到一本想“听”又没有官方配音的好书,不用等了。你手机里存一段自己的声音,晚上跑个脚本,第二天醒来,它已经在那里了。


皖ICP备2025105865号-2|皖公网安备34010402704739号