OpenVoice 语音克隆实战:从一段10秒参考音到六语配音的完整路径
【免费下载链接】OpenVoiceInstant voice cloning by MIT and MyShell. Audio foundation model.项目地址: https://gitcode.com/GitHub_Trending/op/OpenVoice
想让自己的声音"替你朗读一整本小说",最大的障碍往往不是文本,而是怎么找到一个配得上你嗓音的音色。OpenVoice 是 MyShell(MIT)开源的语音克隆技术:给你一段 10 秒左右的参考音频,它就能提取出发声者的音色特征向量(SE 向量,可以理解为一张"声音指纹",用来唯一表征这个人是谁),再让任意 TTS 引擎用这个音色把新文本读出来。和需要几分钟录音、还要自己训练模型的端到端克隆方案相比,它的差异点在于即时克隆——不训练、不微调,参考音频甚至可以是任何语言。
一段声音的完整旅程:从文本到克隆语音
OpenVoice 把"生成声音"拆成两件职责不同的事:基础说话人 TTS(Base Speaker)负责"说什么、什么情绪、多快",音色转换器 ToneColorConverter 负责"用谁的声音说"。
文本进来之后,先经过基础说话人 TTS——V1 用内置的BaseSpeakerTTS,V2 则接入 MeloTTS 这个多语言引擎——产出一段"中间音频"。这句话的内容、节奏、情绪都对了,但说话人是模型自带的固定基础音色,不是你要克隆的那个人。与此同时,你的参考音频被 VAD(语音活动检测,用来自动切出有人说话的片段)切成分段,每段转成梅尔频谱(一种把声音画成"时间×频率"二维图的表示),送入 ref_enc 编码器,压缩出目标 SE 向量。
关键的戏法在下一步。中间音频同样走编码器—Flow—解码器结构,其中 Flow 部分使用 IPA 对齐的中间特征(国际音标对齐,保证跨语言时音素级别对得上)把"音色"从音频里剥离出去,同时保留情绪、节奏、语调;源 SE(基础说话人)和目标 SE(被克隆的人)被注入解码器,最终输出的音频就变成"用被克隆人的音色,说着基础说话人的内容"。所以同一个克隆音色,既能说英语也能说中文,还不串味。整条链路的核心代码都在 openvoice/api.py 里。
⚠️ 容易忽略的一点:OpenVoice 只克隆"音色",不克隆口音和情绪。口音和情绪由基础说话人 TTS 决定,克隆出来的声音带着基础音色口音是设计如此,不是 bug。
从零到第一句克隆音:装好就跑的清单
环境三行搞定:建 Python 3.9 环境、克隆仓库、装依赖。
conda create -n openvoice python=3.9 && conda activate openvoice git clone https://gitcode.com/GitHub_Trending/op/OpenVoice cd OpenVoice && pip install -e .然后按 docs/USAGE.md 里的说明下载对应的 checkpoint 压缩包,解压到checkpoints(V1)或checkpoints_v2(V2)文件夹。V2 还需要按文档里的命令额外安装 MeloTTS 多语言引擎。两个版本值得先花 10 秒区分一下:
| V1 | V2 | |
|---|---|---|
| 基础 TTS | 内置 BaseSpeakerTTS | MeloTTS 多语言引擎 |
| 语言 | 英语、中文 | 英语(多口音)、西、法、中、日、韩 |
| Checkpoint 目录 | checkpoints/ | checkpoints_v2/ |
| 定位 | 快速体验风格控制 | 音质更好,原生六语 |
最小可跑示例的核心其实就四件事:加载转换器、提取目标音色、生成基础音频、转换音色。
import torch from openvoice import se_extractor from openvoice.api import ToneColorConverter device = "cuda:0" if torch.cuda.is_available() else "cpu" tone_color_converter = ToneColorConverter('checkpoints_v2/converter/config.json', device=device) tone_color_converter.load_ckpt('checkpoints_v2/converter/checkpoint.pth') target_se, _ = se_extractor.get_se('reference.mp3', tone_color_converter, vad=True)接着用任意 TTS(比如 MeloTTS 的tts_to_file)把目标文本读成tmp.wav,再调convert完成换音色:
tone_color_converter.convert( audio_src_path='tmp.wav', src_se=source_se, # 基础说话人的 SE 向量(checkpoints_v2/base_speakers/ses/ 下) tgt_se=target_se, # 参考说话人的 SE 向量 output_path='cloned.wav', message="@MyShell")message参数会往音频里写入一个不可闻的水印,官方明确保留检测能力,公开发布内容时建议保留。完整可运行的版本直接看 demo_part3.ipynb。
三种玩法
跨语言播报:换语言不换声音
V2 的跨语言关键在于:目标 SE 向量跟语言无关,提取一次反复用。循环里只换 MeloTTS 的语言参数和对应的源 SE 文件,克隆音色保持不变。
from melo.api import TTS texts = { 'EN': "This voice was cloned by OpenVoice.", 'ZH': "你好,这是被克隆的声音。", 'JP': "こんにちは、これはクローンされた声です。", } for language, text in texts.items(): model = TTS(language=language, device=device) speaker_ids = model.hps.data.spk2id speaker_key = list(speaker_ids.keys())[0] model.tts_to_file(text, speaker_ids[speaker_key], 'tmp.wav') source_se = torch.load(f'checkpoints_v2/base_speakers/ses/{speaker_key.lower().replace("_", "-")}.pth', map_location=device) tone_color_converter.convert('tmp.wav', source_se, target_se, output_path=f'out_{language}.wav')注意最后一行 SE 文件的命名规则与 demo_part3.ipynb 完全一致,以该文件为准。同一段参考音,可以让"同一个人"说出英语、中文、日语;参考音频本身也可以是任何语言,不必和输出语言一致。
情感化配音:同一声音也能耳语
V1 的基础说话人 TTS 内置了 9 个风格说话人:default、friendly、cheerful、excited、sad、angry、terrified、shouting、whispering。换情绪只需要改speaker参数,语速则由speed控制。
base_speaker_tts.tts(text, 'tmp.wav', speaker='whispering', language='English', speed=0.9)💡 一个不显眼的坑:切换
speaker后,src_se必须换成该风格对应的 SE(例如checkpoints/base_speakers/EN/下的en_style_se.pth),否则换色会不准。每个风格在 checkpoint 包里都有配套算好的 SE 文件,参考 demo_part1.ipynb 的用法。
批量合成:文本列表进,整套音频出
批量本质上就是循环:一条文本生成一次基础音频、转换、落盘。长文本交给 TTS 自行分句(V1 的tts内部会自动切句并加停顿拼接)。GPU 显存紧张时,把转换器切到device="cpu"即可,音质不变,只是慢一些。
踩坑速查:按现象对号入座
- 报 "input audio is too short":VAD 切不出任何语音段。换成 3–10 秒的干净单人录音,去掉长静音段。
- 口音/情绪不像参考人:设计如此,只克隆音色。想要不同口音,换对应口音的基础说话人,详见 docs/QA.md 第一部分。
- 同名音频复用,结果像没变:
get_se会把 SE 按音频名缓存在processed文件夹。换个文件名,或给get_se传一个新的target_dir。 - Silero VAD 下载失败(机器访问不了 GitHub):按 docs/QA.md 的 Silero 一节,手动下载压缩包放到 torch 的 hub 缓存目录。
- CUDA out of memory:
device="cpu"兜底,或缩短参考音频减少分段数量。
它不擅长的部分
OpenVoice 自己定位为"技术"而非"产品":它不保证对每副嗓子都出完美的音色,参考音频的挑选和预处理仍要你自己把关。风格词表也被基础模型自带的说话人数框住,口音和情绪则完全不在克隆范围内。值得持续关注的方向是 V2 的音质迭代与原生语言集扩展——而基础说话人本身是可插拔的,你换上哪个开源 TTS,语言覆盖的上限就是哪。
【免费下载链接】OpenVoiceInstant voice cloning by MIT and MyShell. Audio foundation model.项目地址: https://gitcode.com/GitHub_Trending/op/OpenVoice
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考