开始之前
声音克隆,是做出一个听起来像某个具体的人的合成声音。下面的开源模型示例里没有训练这一步:你给它一小段参考片段和新的文字,它就用这个声音把文字念出来。Chatterbox 的 README 把这叫作零样本(zero-shot)。文字转语音那一课讲怎样选内置音色,这一课从那里接着往下讲。
有两种东西都被叫作自定义声音。描述出来的声音由一段文字描述生成,没有谁被复制。克隆出来的声音由一个真人的录音生成,所以它就是那个人的声音肖像,这一课所有的规则都是从这一点来的。下面的步骤里,托管路线需要一个 OpenAI API 密钥,开源模型需要 Python。
不需要录音:用文字描述一个声音
OpenAI 的 prompt-to-voice 根据一段描述创建并保存一个声音,不需要参考录音,也不需要同意录音。它向所有 API 客户开放。保存下来的声音可以用在 GPT-Live 里,指南说它不支持文字转语音、Realtime 和 Chat Completions 这几个 API。创建一个不收费,在 GPT-Live 里使用它,按普通会话的费率计费。
你描述的是特质,不是某个人。指南列了九项,它们是写在提示词里的话,不是单独的 API 参数。指南还说,不要要求模仿某个具名的人、公众人物或虚构角色,也不允许儿童的声音。
curl --fail-with-body https://api.openai.com/v1/audio/voices \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "prompt",
"name": "Support assistant",
"prompt": "A calm, reassuring adult voice for a customer support assistant. Speak with an American English accent, a mid-range pitch, a smooth, warm tone, and a steady, conversational pace.",
"model": "auto"
}' \
-o voice.json- 照下面表格里的特质,用平常的话写一段描述。
- 发送上面的请求。每个成功的请求都会保存一个新声音,并返回它的元数据,其中有一个像
voice_123这样的id,不带音频,也没有试听。 - 保留这个
id和原来的描述。指南说,想在另一次会话里用同一个声音,就复用保存下来的声音。 - 在 GPT-Live 会话里试听,把
session.audio.output.voice.id设成这个id。为了让声音表现更好,指南说还要把这段描述放进session.instructions。 - 每次只改一项特质,用同一小段文字做对比。
| 特质 | 要描述什么 | 示例写法 |
|---|---|---|
| Accent 口音 | 地区发音和口音的强弱 | American English, with a strong accent |
| Age 年龄 | 听起来的年龄 | An adult in their 30s |
| Presentation 性别呈现 | 声音给人的性别印象 | Feminine |
| Pitch 音高 | 声音听起来偏低还是偏高 | Mid-range pitch |
| Timbre 音色 | 声音的质地 | Smooth and rich |
| Texture 质感 | 沙哑、嘶哑或清亮 | Smooth |
| Loudness 用力程度 | 发声的力度 | Moderate vocal effort |
| Speech rate 语速 | 说话有多快 | Medium pace |
| Distinctiveness 辨识度 | 这个声音的个人特色要有多突出 | Moderately distinctive |
用录音克隆声音:OpenAI 的同意流程
用录音生成声音,只向符合条件的客户开放。指南说要联系 OpenAI 的销售团队,组织开通之后,Audio 下面会出现 Voices 标签页。它需要同一个人的两段独立录音:一段是同意录音,说话人读一句固定的声明,另一段是样本录音,模型会尽力复制它。
指南列出了 16 种语言的声明,包括中文,并提醒,只要和台词有任何出入,上传就会失败。同一个说话人做不止一个声音时,同一份同意可以重复使用。英文声明是这样的:“I am the owner of this voice and I consent to OpenAI using this voice to create a synthetic voice model.”
curl https://api.openai.com/v1/audio/voice_consents \
-X POST \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-F "name=test_consent" \
-F "language=en" \
-F "recording=@$HOME/tmp/voice_consent/consent_recording.wav;type=audio/x-wav"
curl https://api.openai.com/v1/audio/voices \
-X POST \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-F "name=test_voice" \
-F "audio_sample=@$HOME/tmp/voice_consent/audio_sample_recording.wav;type=audio/x-wav" \
-F "consent=cons_123abc"- 先获得权限。没有权限,声音相关的接口会返回错误,比如 404。
- 在安静的房间里,原样录下那句同意声明。
- 带上名称和语言,把它上传到
/v1/audio/voice_consents。返回的内容里有一个同意 ID。 - 录样本,不超过 60 秒,格式可以是 mpeg、wav、ogg、aac、flac、webm 或 mp4。
- 用样本和同意 ID,在
/v1/audio/voices创建声音。 - 在 Realtime 会话里用
gpt-realtime-2.1-mini,或者在 GPT-Live 里,使用这个声音的 ID。要在开始时就选好,因为换一个声音需要开一个新会话。
样本该是什么样
指南说,质量取决于样本,并给出了录音建议:安静、回声小的空间,专业的 XLR 麦克风,离麦克风大约 7 到 8 英寸,中间加防喷罩,全程保持同样的距离。模型会原样复制它听到的东西,包括语气、节奏、精力、停顿和习惯,所以要录你希望克隆声音拥有的那种声音。样本里精力或口音忽高忽低,结果里也会忽高忽低。
开源模型给的建议少一些。Chatterbox 的 README 提醒,参考片段的语言和目标语言不同,会把口音带过去,并建议把 cfg_weight 设成 0 来减轻。XTTS-v2 的模型卡给出的片段长度是 6 秒。上面的建议出自 OpenAI 的指南,不过安静的房间和平稳的语气不花什么成本,录任何片段时都值得保留。
在自己的电脑上用开源模型克隆
开源模型不需要审批,也不会把东西发给哪家厂商,但同样没有同意这一步,所以责任在你身上。F5-TTS 有一个简单的命令行。它接受一段参考录音,如果有的话,再加上这段录音里说的话,然后用这个声音念新的文字。把参考文字留空,就由一个 ASR 模型来转写这段录音,代价是多占一些 GPU 内存。
Chatterbox 通过 Python 做同样的事:model.generate(text, audio_prompt_path="your_10s_ref_clip.wav"),README 示例里的文件名写着 10 秒,但 README 没有写明时长。它的 README 说,这个项目在 2026 年 8 月退役,不再维护,代码作为存档继续公开。权重的许可之间的差别,比命令之间的差别更大。
pip install f5-tts
# Leave --ref_text "" will have ASR model transcribe (extra GPU memory usage)
f5-tts_infer-cli --model F5TTS_v1_Base \
--ref_audio "provide_prompt_wav_path_here.wav" \
--ref_text "The content, subtitle or transcription of reference audio." \
--gen_text "Some text you want TTS model generate for you."| XTTS-v2 | Chatterbox | F5-TTS | |
|---|---|---|---|
| 需要你提供什么 | 约 6 秒的片段 | 一小段录音,README 没写时长(示例文件名里写着 10s) | 一段参考录音,可选再加上它的文字 |
| 语言 | 17 种 | Multilingual V3 支持 23 种以上 | Emilia 中英文模型,更多语言靠自定义推理 |
| 权重的许可 | Coqui Public Model License | MIT,见它的 Hugging Face 模型卡 | CC-BY-NC,非商业 |
| 能在自己的电脑上运行 | 是 | 是 | 是 |
| 是否给生成内容打标记 | 模型卡没有写 | 有,每个文件都带 PerTh 水印 | README 没有写 |
来源:Hugging Face: coqui/XTTS-v2 model card (2026年11月6日 查阅);GitHub: resemble-ai/chatterbox README (2026年11月6日 查阅);Hugging Face: ResembleAI/chatterbox model card (2026年11月6日 查阅);GitHub: SWivid/F5-TTS README (2026年11月6日 查阅)
克隆任何声音之前要守的规则
关于一个人的声音,法律因国家和州而异,这一课不讲法律。发布或出售克隆出来的音频之前,请先问律师。厂商自己定的规则更容易读懂。OpenAI 的页面把其中三条反复讲,拿来当任何克隆的底线都合适:说话人同意,不冒充任何人,告诉听众。
OpenAI 在 prompt-to-voice 下面的“负责任使用”清单里说了这几条。负责任地使用声音,不要冒充他人,使用成年人的声音。告诉听众这段语音是 AI 生成的,同时保留任何溯源元数据或水印。它还说,声音不保证是独一无二的,因为别人可能生成相似的声音。指南把这份清单印在描述声音那一节下面。对录音声音,它要求同意录音,并指向 Text-to-Speech Supplemental Agreement 看更多条款,所以让录音声音也照着整份清单做,是这一课的建议,不是指南在那里印出的话。
| 谁 | 它的要求或做法 |
|---|---|
| OpenAI,录音声音 | 说话人的同意录音,读的是一句固定的声明,样本要来自同一个人。指南指向它的 Text-to-Speech Supplemental Agreement 看更多条款 |
| OpenAI,描述声音 | 它的“负责任使用”清单要求成年人的声音、不得冒充、说明语音由 AI 生成,并保留溯源信号。它的提示词建议说,不要要求具名的人、公众人物或虚构角色 |
| Chatterbox | 每个文件都带 PerTh 水印,README 要求你不要用这个模型做坏事 |
| Kokoro | 它的模型卡说,训练中没有用开源 TTS 模型或“custom voice clones”(自定义声音克隆)生成的合成音频,这说的是它的训练数据,不是这个模型能做什么 |
| XTTS-v2 和 F5-TTS | 它们的页面给权重定了许可,没有提到同意,所以这份责任仍在你身上 |
检查一段音频,以及干净的结果意味着什么
OpenAI 的 Content Provenance API 会检查一个图片或音频文件里有没有它自己的溯源信号。把文件发给 POST /v1/content_provenance_checks,或者用 openai.com/verify 的网页工具。对音频来说,这个信号是 SynthID,一种嵌在音频本身里的水印,经过一些编辑后可能还在。C2PA Content Credentials 是图片上的签名元数据,编辑、转换或分享文件都可能把它去掉。
not_detected 的意思是工具没有找到支持的信号。如果元数据被去掉了、水印被削弱了、音频来自旧模型,或者早于这些信号出现,这段音频仍然可能出自 OpenAI。这个工具也检测不出其他公司的模型,页面还说它不是通用的 AI 检测器。Chatterbox 自己的水印有单独的检查办法:它的 README 给了一段短脚本,先用 perth.PerthImplicitWatermarker(),再调用 get_watermark,带水印的音频返回 1.0,没有则返回 0.0。
| 信号 | 适用于 | 检查什么 |
|---|---|---|
| C2PA Content Credentials | 图片 | 带签发者和 AI 使用信息的签名元数据 |
| SynthID | 图片和音频 | 直接嵌在受支持媒体里的水印 |
常见错误
- 因为工具没要求同意,就在没有说话人同意的情况下克隆声音。
- 凭记忆念同意声明。和台词有任何出入,OpenAI 都会拒绝。
- 在嘈杂或有回声的房间里录样本,或者用和想要的不一样的状态去录,因为模型两样都会复制。
- 把 F5-TTS 的 CC-BY-NC 权重用在收费的工作上。
- 参考片段用一种语言,目标文字用另一种,然后奇怪口音是怎么回事。
- 把
not_detected当成这段音频是真人的证明。 - 以为描述出来的声音能在文字转语音 API 里用,而指南把它限定在 GPT-Live。
动手试试
- 给一个声音写一段描述,用九项特质里的三项,再改其中一项,看看哪里变了。
- 读一遍上面的 F5-TTS 命令和 Chatterbox 那一行,写下这两个权重里,哪一个可以用在收费项目里。
- 在安静的房间里录一小段你自己的声音,用开源模型克隆它,再把结果标注为合成的。
- 用 openai.com/verify 的网页工具检查一小段音频,记下
not_detected的结果能说明什么、不能说明什么。
下一课:AI 音乐
声音念出来的是话。AI 音乐则把一种风格和几句歌词变成一整首歌,它也有自己的授权问题:模型、托管工具,以及你能发布什么。
自测一下
在 OpenAI 用录音生成声音之前,说话人必须做什么?
查看答案
B. 在单独的一段录音里读一句固定的同意声明 指南要求有一段同意录音,说话人在里面读它给的某一句声明,并说只要和台词有任何出入就会失败。
XTTS-v2 的模型卡说,多长的片段就足够克隆一个声音?
查看答案
C. 大约 6 秒 模型卡说,它用一段 6 秒的音频,就能把声音克隆到不同的语言里,不需要几个小时的数据。
关于 F5-TTS,下面哪句话是对的?
查看答案
A. 它的预训练模型是 CC-BY-NC,属于非商业许可 它的 README 把代码放在 MIT 之下,但因为 Emilia 训练数据,预训练模型采用 CC-BY-NC 许可。
OpenAI 的溯源检查对一段音频返回了 not_detected。这说明什么?
查看答案
D. 只说明没有找到受支持的信号 页面说,元数据被去掉、水印被削弱、旧模型或其他公司的模型,都可能返回 not_detected。
常见问题
AI 能用几秒钟的音频克隆我的声音吗?
部分开源模型可以。XTTS-v2 的模型卡说,一段 6 秒的短音频就能克隆,Chatterbox 的 README 把示例文件命名为 your_10s_ref_clip.wav,没有写明时长。OpenAI 对录音声音最长接受 60 秒,它的指南说,样本的质量决定声音的质量。
克隆别人的声音合法吗?
这取决于你住在哪里,以及克隆出来的声音怎么用,这一课不提供法律意见。厂商的要求要清楚得多。对录音声音,OpenAI 要求有说话人的同意录音;它对描述声音的“负责任使用”清单说只限成年人的声音、不得冒充。所以先取得说话人的同意。
可以克隆名人的声音吗?
用 OpenAI 的自定义声音不行。它的指南说不要冒充他人,对描述出来的声音,不要要求模仿具名的人、公众人物或虚构角色。录音声音也需要那个人自己的同意录音。开源模型的页面里没有这样的把关,所以决定要由你自己来做。
哪个开源的声音克隆模型可以免费商用?
Chatterbox 的 README 把代码放在 MIT 之下,它的 Hugging Face 模型卡把许可写成 MIT,不过这个项目已经退役。XTTS-v2 用的是 Coqui Public Model License,出售产出的内容之前要先读它的条款。F5-TTS 的代码是 MIT,但它的预训练模型是 CC-BY-NC,属于非商业许可。
怎样判断一段音频是不是 AI 做的?
对 OpenAI 的音频,可以上传到 openai.com/verify,或者发给 Content Provenance API,它会找 SynthID。得到 not_detected 说明不了多少,因为元数据被去掉、水印被削弱、以及其他公司的模型,都会得到这个结果。
资料来源
- OpenAI API docs: Custom voices https://developers.openai.com/api/docs/guides/custom-voices
- OpenAI API docs: Content provenance https://developers.openai.com/api/docs/guides/content-provenance
- Hugging Face: coqui/XTTS-v2 model card https://huggingface.co/coqui/XTTS-v2
- GitHub: resemble-ai/chatterbox README https://github.com/resemble-ai/chatterbox
- Hugging Face: ResembleAI/chatterbox model card https://huggingface.co/ResembleAI/chatterbox
- GitHub: SWivid/F5-TTS README https://github.com/SWivid/F5-TTS
- Hugging Face: SWivid/F5-TTS model card https://huggingface.co/SWivid/F5-TTS
- Hugging Face: hexgrad/Kokoro-82M model card https://huggingface.co/hexgrad/Kokoro-82M
