OpenVoice 秒级语音克隆实战指南5 分钟用一段录音复刻任何人的声音【免费下载链接】OpenVoiceInstant voice cloning by MIT and MyShell. Audio foundation model.项目地址: https://gitcode.com/GitHub_Trending/op/OpenVoice假设你要给一部播客做多语言版本还希望每个版本都用同一个主播的声音朗读——传统做法是重新配音而 OpenVoice 是 MIT 与 MyShell 开源的秒级语音克隆工具喂给它 10 秒左右的参考录音它就能借到这个人的音色让任意语言的 TTS 输出都听上去是同一个人在说话。整篇文章按先跑通、再搞懂、后调优的顺序展开面向初中级开发者。三步跑通第一次克隆V2 全流程我们的目标是用你手边的一段录音生成一条用这个人的声音念中文的音频。全程约 5 分钟GPU 可选CPU 能跑就是慢。先准备好环境。注意官方锁定了不少依赖版本比如 numpy1.22.0所以务必用 Python 3.9 建独立环境高版本 Python 装依赖大概率翻车conda create -n openvoice python3.9 conda activate openvoice git clone https://gitcode.com/GitHub_Trending/op/OpenVoice cd OpenVoice pip install -e .接着下载 V2 模型权重解压到项目根目录下的checkpoints_v2文件夹官方安装说明 docs/USAGE.md 里附了下载地址unzip checkpoints_v2_0417.zip -d checkpoints_v2V2 的基础 TTS 由同门的 MeloTTS 提供还需补两个依赖这一步会顺带下载日语词典pip install githttps://github.com/myshell-ai/MeloTTS.git python -m unidic download然后是一段能一次跑完全流程的代码保存成clone_demo.py直接运行即可import os import torch from melo.api import TTS from openvoice import se_extractor from openvoice.api import ToneColorConverter device cuda:0 if torch.cuda.is_available() else cpu out_dir outputs_v2 os.makedirs(out_dir, exist_okTrue) # 1. 加载音色转换器V2 权重 converter ToneColorConverter(checkpoints_v2/converter/config.json, devicedevice) converter.load_ckpt(checkpoints_v2/converter/checkpoint.pth) # 2. 从参考录音提取音色指纹 target_se内部会自动做 VAD 人声切分 target_se, _ se_extractor.get_se( resources/example_reference.mp3, converter, vadTrue ) # 3. 基础说话人MeloTTS 中文模型src_se 必须和实际用的说话人配对 model TTS(languageZH, devicedevice) spk_ids model.hps.data.spk2id src_id list(spk_ids.keys())[0] src_se torch.load( fcheckpoints_v2/base_speakers/ses/{src_id.lower().replace(_, -)}.pth, map_locationdevice, ) # 4. 先让基础 TTS 出声再换掉里面的音色 text 你好这是一段用 OpenVoice 克隆出来的语音。 model.tts_to_file(text, spk_ids[src_id], f{out_dir}/base.wav, speed1.0) converter.convert( audio_src_pathf{out_dir}/base.wav, src_sesrc_se, tgt_setarget_se, output_pathf{out_dir}/cloned_zh.wav, ) print(done -, f{out_dir}/cloned_zh.wav)跑完后听cloned_zh.wav内容和发音是 MeloTTS 生成的标准普通话但音色已经被搬成了参考录音里那个人的。这里有两处新手最容易踩的点先打预防针src_se必须和实际使用的基础说话人一一对应。转换器做的事不是凭空加音色而是把基础说话人的音色特征 A 替换成目标特征 BA 填错了输出音色就会跑偏。每段生成音频默认都带隐形水印。转换器通过message参数把文本编码进音频里方便溯源不需要水印时可以初始化时关闭enable_watermarkFalse。它是怎么工作的先分家再融合整条流水线可以拆成一唱一换两个角色基础说话人 TTSV1 自带模型 / V2 用 MeloTTS负责唱什么——文本变成带口音、情感、节奏、音高的语音。这部分完全不受克隆影响。音色转换器converter负责谁来唱——只动音色不碰其他属性。打个比方录音棚里乐手、编曲、情绪都是现成的基础 TTSOpenVoice 做的只是把主唱的声音换成你指定的人和声、鼓点、演唱情绪一律保留。这也解释了它的招牌能力之一——跨语言克隆参考音频是英语输出却是中文因为唱词和嗓音本来就没绑在一起。再看图里的关键组件组件做什么为什么这样设计Tone color extractor音色提取器把参考录音切成多段每段过ref_enc编码器得到一个 256 维音色向量再求平均多段平均能抹掉单句话的情感波动留下稳定的音色底色抗噪更稳Flow流匹配转换器在频谱特征空间做 A→B 的音色迁移流匹配对复杂分布建模比传统 GAN 稳定训练收敛快、细节不糊IPA 对齐特征转换前先把不同语言的音素在国际音标层面对齐英中日的音素表完全不同先对齐到 IPA 才能跨语言只换音色Encoder/Decoder把迁移后的频谱还原成波形复用 VITS 系架构音质有保障提取流程的源码在 openvoice/se_extractor.pyvadTrue时用 Silero VAD 把人声段挑出来、去掉静音再均分成约 10 秒的片段每个片段出一个向量最后torch.stack(gs).mean(0)平均。想看懂音色转换的数学细节可以翻 openvoice/transforms.py 里的SpectralTransformer。V1 和 V2 的关系一句话说明白V2 换了一套更激进的增强训练策略音色更自然并且原生内置多语言基础说话人不用你自己凑 TTS。两版都能商用MIT 协议。按场景实战风格化、多语言、批量跑通基础流程后下面三个场景按难度递进每个都给出可运行代码和关键参数说明。场景 A同一人多种情绪和语气V1 风格库V1 的英文基础说话人自带一组风格槽位default / friendly / cheerful / excited / sad / angry / terrified / shouting / whispering。每个风格槽位有自己专属的src_se文件这是新手最容易漏的一步。完整示例参考 demo_part1.ipynb。import torch from openvoice.api import BaseSpeakerTTS, ToneColorConverter device cuda:0 if torch.cuda.is_available() else cpu # V1 权重checkpoints/ 下下载地址同样在 docs/USAGE.md base BaseSpeakerTTS(checkpoints/base_speakers/EN/config.json, devicedevice) base.load_ckpt(checkpoints/base_speakers/EN/checkpoint.pth) converter ToneColorConverter(checkpoints/converter/config.json, devicedevice) converter.load_ckpt(checkpoints/converter/checkpoint.pth) # 参考音色只提取一次多风格复用 from openvoice import se_extractor target_se, _ se_extractor.get_se(resources/example_reference.mp3, converter, vadTrue) styles [ (default, checkpoints/base_speakers/EN/en_default_se.pth, 1.0), (cheerful, checkpoints/base_speakers/EN/en_style_se.pth, 1.1), (whispering, checkpoints/base_speakers/EN/en_style_se.pth, 0.9), ] text This is an OpenVoice style demo. for style, se_path, speed in styles: base.tts(text, tmp.wav, speakerstyle, languageEnglish, speedspeed) converter.convert(tmp.wav, src_setorch.load(se_path, map_locationdevice), tgt_setarget_se, output_pathfout_{style}.wav)参数含义speaker选择风格槽位决定情感/语气cheerful和whispering共用en_style_se.pth即可speed内部换算成length_scale 1/speed1.2就是 1.2 倍速languageV1 基础模型只认English和Chinese两个入口。场景 B一段参考音念出六种语言V2V2 的多语言不是靠转换出来的而是靠 MeloTTS 覆盖六种语言、每种语言还有多个不同口音的基础说话人。同一份target_se可以无限制复用。完整写法见 demo_part3.ipynb核心循环如下from melo.api import TTS from openvoice.api import ToneColorConverter import torch converter ToneColorConverter(checkpoints_v2/converter/config.json, devicedevice) converter.load_ckpt(checkpoints_v2/converter/checkpoint.pth) target_se, _ se_extractor.get_se(resources/example_reference.mp3, converter, vadTrue) samples { EN_NEWEST: Did you ever hear a folk tale about a giant turtle?, ES: El resplandor del sol acaricia las olas., FR: La lueur dorée du soleil caresse les vagues., ZH: 在这次旅程中我们计划去巴黎欣赏埃菲尔铁塔。, JP: 彼は毎朝ジョギングをして体を健康に保っています。, KR: 안녕하세요! 오늘은 날씨가 정말 좋네요., } for lang, text in samples.items(): model TTS(languagelang, devicedevice) # 基础 TTS 按语言加载 spk model.hps.data.spk2id key list(spk.keys())[0] se torch.load( fcheckpoints_v2/base_speakers/ses/{key.lower().replace(_, -)}.pth, map_locationdevice) model.tts_to_file(text, spk[key], tmp.wav, speed1.0) converter.convert(tmp.wav, src_sese, tgt_setarget_se, output_pathfout_{lang}.wav)两个值得知道的细节换language参数就等于换了整套基础说话人target_se完全不用动——这就是音色与语言解耦的实际收益想要特定口音比如英式、澳式、印度英语把key换成spk2id里对应的说话人即可src_se文件名跟着换。场景 C把一整本书克隆成同一个人批量 并发长文本直接喂 TTS 容易超时且不好管理实用做法是先按句切好、逐句生成再拼接。下面这个脚本读一个lines.txt一行一句多线程批量出片import os from concurrent.futures import ThreadPoolExecutor import torch from melo.api import TTS from openvoice.api import ToneColorConverter device cuda:0 if torch.cuda.is_available() else cpu converter ToneColorConverter(checkpoints_v2/converter/config.json, devicedevice) converter.load_ckpt(checkpoints_v2/converter/checkpoint.pth) target_se, _ se_extractor.get_se(resources/example_reference.mp3, converter, vadTrue) model TTS(languageEN, devicedevice) spk model.hps.data.spk2id key list(spk.keys())[0] src_se torch.load(fcheckpoints_v2/base_speakers/ses/{key.lower()}.pth, map_locationdevice) def one_line(idx, sentence, out_dir): base_path, final_path f{out_dir}/b{idx}.wav, f{out_dir}/s{idx:04d}.wav model.tts_to_file(sentence, spk[key], base_path, speed1.0) converter.convert(base_path, src_sesrc_se, tgt_setarget_se, output_pathfinal_path) os.makedirs(batch_out, exist_okTrue) with open(lines.txt, encodingutf-8) as f: lines [l.strip() for l in f if l.strip()] # GPU 上线程数别开太大4 条左右即可 with ThreadPoolExecutor(max_workers4) as pool: pool.map(lambda i: one_line(i, lines[i], batch_out), range(len(lines)))生成后可以用pydub.AudioSegment按文件名排序拼接成整轨。如果要在公开服务里用保留水印参数message你的署名这是官方对防滥用的建议。遇到问题怎么办报错、不像、调不好安装和运行期的高频报错pip install -e .卡在 numpy / gradio 编译十有八九是 Python 版本不对。官方环境锁的是 Python 3.9numpy1.22.0在 3.11 上没有预编译包。调用get_se时卡在 Silero 模型下载se_extractor依赖 Silero VAD它要从网络拉取模型。机器没网时手动下载官方 FAQ docs/QA.md 里提到的压缩包解压到~/.cache/torch/hub/snakers4_silero-vad_master目录即可。assert num_splits 0, input audio is too shortVAD 切完人声后连 1 秒都不到参考音频太短或噪音太大。换 5~15 秒的干净单人录音重试。显存吃紧MeloTTS 推理本身不大主要是 Whisper/Silero 预处理占内存CPU 上跑get_se会明显变慢建议 GPU 提取一次se.pth后缓存复用extract_se支持se_save_path存盘。本地 Gradio 界面V1 附了极简网页 demo安装好 V1 权重后执行python -m openvoice_app --share即可在浏览器里上传参考音频试听出问题先翻 demo_part1.ipynb 和 docs/QA.md。声音不像的正确排查思路这是社区问得最多的一类问题官方 FAQ 给过明确答案OpenVoice 只克隆音色tone color不克隆口音和情感。输出的口音、情绪、节奏全部来自基础说话人 TTS。所以想让输出带英式口音去换英式口音的基础说话人而不是指望从参考音频里吸过来想让输出更激动换cheerful / excited风格槽位或换一个情感更足的基础说话人。排查清单按命中率排序参考音频是否干净——有背景音、多人说话、大段静音都会污染音色向量参考音频是否够长——太短则向量不稳官方建议 5 秒以上、10 秒左右最稳文件名是否与旧缓存撞车——processed/目录按文件名缓存已提取的se.pth同名文件复用时会直接加载旧向量。改换参考音但忘了清理缓存是怎么调都不像的最隐蔽原因src_se是否和当前基础说话人严格配对见场景 A 的坑V2 训练时用了更强的数据增强同一参考音下 V2 通常比 V1 更像条件允许优先 V2。关键参数速查参数推荐值影响speed0.9 ~ 1.2基础 TTS 的语速内部换算为length_scale1 变快speaker/ 说话人 key按需决定情感、语气、口音换它就要同步换src_sevadget_seTrueSilero 切人声False 改走 Whisper 切句需 CUDA fp16tauconvert默认 0.3音色融合强度调大会让音色替换更彻底也可能牺牲自然度messageconvert建议填署名写入音频隐形水印便于溯源参考音频5~15s 单人干净录音决定target_se质量上限怎么调参都补不回来能用在哪些地方有声书与播客的多语言发行。同一个主播的声音覆盖全部语种听众换语言不换人品牌感统一。给机器人和助手换上指定的人声。OpenVoice 的克隆能力已经嵌进 myshell.ai 的 Workshop创建 Bot 后在语音设置里通过克隆功能生成自定义声音再绑定到机器人上。快速体验 TTS 模型选型。如果暂时不需要克隆、只是想试听各家 TTS 音色可以在 Widget Center 的 TTS 分类里直接点选不同语言、不同模型的声音试听选定了再回头做克隆。无障碍阅读。把文档朗读换成本人/家属的声音长时间听读更不疲劳语速建议放在 1.0~1.1配合default风格最耐听。合规提醒克隆他人声音用于公开发布前请确认你已获得授权。保留水印、填好message署名是对自己和被克隆者都负责的做法。进阶路线与资源学习节奏建议分四步走跑通完成本文三步跑通听出像和不像的差异控风格把场景 A 的风格槽位全部生成一遍建立对speaker/speed/src_se三者的肌肉记忆上规模用场景 C 的批量脚本处理真实语料顺手研究 openvoice/models.py 里voice_conversion的推理链路造轮子给冷门语言自训一个基础说话人 TTS 接进来转换器不用动或者把水印检测能力接进你的发布管线。常用入口官方安装说明docs/USAGE.md官方 FAQ质量、语言、安装三大类docs/QA.md示例代码风格控制 demo_part1.ipynb、跨语言 demo_part2.ipynb、V2 多语言多口音 demo_part3.ipynb核心模块API 入口 openvoice/api.py、音色提取 openvoice/se_extractor.py把一段 10 秒的录音变成可复用的声音资产这就是 OpenVoice 的全部魔法——剩下的事就看你想让它念多少种语言了。【免费下载链接】OpenVoiceInstant voice cloning by MIT and MyShell. Audio foundation model.项目地址: https://gitcode.com/GitHub_Trending/op/OpenVoice创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考