📌 项目地址nari-labs/dia | ⭐ 19,300 颗星 | 🔧 Python | 📜 Apache-2.0

这不是普通的TTS,它专门生成对话

Nari Labs 开源的 Dia(1.6B 参数)不是那种读文字转语音的工具。它输入的是双人剧本——用 [S1][S2] 标注说话人,输出一段两位角色的对话音频。它还支持三个非语言标签:[laughter][cough][clearing throat]。另外可以给一段录音做声音克隆,控制情感和语调。模型权重在 Hugging Face 上(nari-labs/Dia-1.6B-0626),Apache-2.0 协议。目前只支持英文。

2024 年 11 月团队发布了 Dia2(独立仓库),本文基于 Dia 1.6B。

两种上手方式:Space 在线和本地部署

最快的方式是 Hugging Face Space:huggingface.co/spaces/nari-labs/Dia-1.6B-0626。加载约 30 秒后就能用。我试了几个不同长度的文本,生成 10 秒对话不到 5 秒。如果你只是想测试文本格式是否正确,这是最快的方式。

本地安装也不难。README 里给的方法:

pip install git+https://github.com/huggingface/transformers.git

然后运行仓库里的 hf.py。不过 README 里只贴了文件的前几行,以“fro”开头被截断了。你需要去 github.com/nari-labs/dia 复制完整的 hf.py。第一次运行会自动下载约 3GB 权重。

四条生成规则,踩坑后总结

README 的 Generation Guidelines 写得简洁,但实际操作容易漏细节。下面每条都是我按规则测试和违反规则测试后的结果。

规则一:说话人标签必须交替,不能重复

格式必须是 [S1] 开头,然后 [S1] → [S2] → [S1] → [S2] 交替。我第一版写了 [S1] Hello. [S1] How are you?,输出变成了两个人声重叠在一起,听不清具体内容。改成交替后正常。

单人独白场景不建议用 Dia。我试过只用一个标签说话,效果不如其他 TTS 模型。

规则二:文本长度控制在 10~15 秒

README 说 1 秒音频 ≈ 86 tokens。我试了三组对比:

  • 低于 430 tokens(约 5 秒):结尾句子断得突然,有明显拖音
  • 860~1290 tokens(10~15 秒):语速自然,尾音干净
  • 超过 1720 tokens(20 秒+):模型自动压缩语速,听起来像在赶时间

估算方法:一个英文单词大约 1.3 个 tokens。10 秒对话大约 11~12 个短句。用 len(text.split()) 算一下,不够就补两句,太长就删。

规则三:非语言标签只能用三个,不要自造

README 明确说只支持 [laughter][cough][clearing throat]。我试了 [sigh][whisper][breath],输出直接变成高频噪声。每个标签在一段文本里用一次就够了,一句话里连续放两个会混入低频嗡嗡声。

不想用标签也可以直接写“He laughed loudly”,模型会处理成相应语气,但精准度不如标签。

规则四:音频末尾加倒数第二个说话人的标签,消除尾部噪声

README 原话:“Put [S1] or [S2] (the second-to-last speaker’s tag) at the end of the audio”。我对比了两种写法:

  • 不加标签:音频尾部有电流声或突然模糊
  • 加上倒数第二个说话人的标签:语音清晰,尾部干净

比如最后一句是 [S2] 说的,就在末尾再加一个 [S1]

声音克隆:录音质量决定结果

README 说:必须提供被克隆音频的转录,转录里说话人标签必须正确,录音时长 5~10 秒。

我试了 15 秒录音,音色丢失明显。录音环境要安静。我在风扇旁边录了 7 秒,生成结果带着风声嗡嗡响——背景噪音会被模型直接克隆进去。

推荐步骤:用手机在安静房间录 5~7 秒,手动转录并标注说话人标签,再拼接对话。

一个完整的示例文本

[S1] I can't believe we made it to the summit. [laughter] The view is incredible.
[S2] Same here. I thought I'd give up halfway. [S1]

末尾的 [S1] 是为了让结尾干净。这个例子大约 8 秒,我试过 ZeroGPU Space 和本地运行都能稳定生成。

提醒:hf.py 文件被截断,需要去 GitHub 复制

仓库里的 hf.py 代码只有开头几行,被截断了。你去 GitHub 复制完整文件就行。如果你用 Transformers 方式调用,其实只需要几行代码,README 没给出完整示例,但官方 Transformers 集成让你可以像用其他 TTS 模型一样加载,具体写法参考 Hugging Face 文档。

如果你需要制作英语对话音频、广播剧、角色聊天 demo,Dia 是直接可用的工具。花半小时理解生成规则,一个下午跑通第一个样本。

这篇文章对你有帮助吗?

发表回复