OpenVoice:让任意文本拥有你的声音,本地即时语音克隆三步跑通
【免费下载链接】OpenVoiceInstant voice cloning by MIT and MyShell. Audio foundation model.项目地址: https://gitcode.com/GitHub_Trending/op/OpenVoice
当你需要一段用"某个人嗓音"读出来的旁白,又不想亲自进录音棚——OpenVoice 做的就是即时语音克隆:用几秒参考音频提取音色,再用这个音色朗读任意文本,且支持零样本跨语言。它是 MIT 与 MyShell 开源的音频基础模型,V1/V2 均为 MIT 协议。本文带你把本地部署和第一个克隆效果跑起来。
🚀 语音克隆的最短路径跑通
目标:5 分钟拿到一个 Web 页面,上传几秒录音、输入文字,听到克隆结果。
- 建环境并安装。Python 3.9(
setup.py要求>=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 .-e安装会带齐 librosa、faster-whisper、gradio 等依赖(见requirements.txt)。
放模型权重。V1 含中英 base speaker 加 converter,V2 音色质量更好且原生支持六种语言。下载对应的 checkpoint 压缩包(V1 为
checkpoints_1226.zip,V2 为checkpoints_v2_0417.zip),解压到项目根目录的checkpoints/(V2 解到checkpoints_v2/),下载地址见 docs/USAGE.md。模型权重不在仓库里,这步不能省。启动本地 Web 服务:
python -m openvoice_appopenvoice_app.py是 Gradio 演示,启动时会一次性加载 EN/ZH 两个 base speaker 和 converter。打开终端打印的本地地址,输入文本、选风格、上传参考音频(可直接用仓库里的resources/demo_speaker1.mp3试听),点 Send 就出结果。
不想本地部署的话,MyShell 官方平台有在线语音克隆工作坊,流程如下图:
如果想在自己的代码里用,最小脚本长这样(V1 英文):
import torch from openvoice import se_extractor from openvoice.api import BaseSpeakerTTS, ToneColorConverter device = "cuda:0" if torch.cuda.is_available() else "cpu" base_tts = BaseSpeakerTTS('checkpoints/base_speakers/EN/config.json', device=device) base_tts.load_ckpt('checkpoints/base_speakers/EN/checkpoint.pth') conv = ToneColorConverter('checkpoints/converter/config.json', device=device) conv.load_ckpt('checkpoints/converter/checkpoint.pth') target_se, _ = se_extractor.get_se('my_reference.mp3', conv, vad=True) base_tts.tts('这是OpenVoice语音克隆演示。', 'tmp.wav', speaker='default', language='English') conv.convert(audio_src_path='tmp.wav', src_se=torch.load('checkpoints/base_speakers/EN/en_default_se.pth').to(device), tgt_se=target_se, output_path='output.wav', message='@MyShell')四步:建两个模型、提一次音色向量、TTS 生成中间音频、converter 换音色。
⚙️ 语音克隆是怎么工作的:音色与风格分离
为什么拆成两个模型?因为"谁在说"(音色)和"怎么说"(情感、口音、语速)是互相独立的维度。混在一个模型里,换个情绪就得重新克隆一次声音。OpenVoice 的拆法:Base Speaker TTS 负责"怎么说",音色转换器(Tone Color Converter)只负责把"谁在说"换掉。好处是零样本跨语言——converter 与语言无关,参考音频和目标文本可以是不同语言(README 三大特性之一)。
输入→处理→输出的链条:
- 输入,两路并行:文本带着风格参数(用哪个说话人、哪种情绪)进 Base Speaker TTS;几秒参考音频进音色提取器。参考音频先过 VAD(voice activity detection,语音活动检测,作用是把人声从音频里切出来、去掉静音),
extract_se()对每段提取的音色向量取平均,压成单个音色向量 se(speaker embedding,白话:这段声音"像谁"的数学表示)。 - 处理:TTS 先合成一段"默认嗓音"的中间音频。converter 把它和参考音色编码到同一特征空间,在 IPA(国际音标)对齐的中间特征上做替换。对齐意味着两路音频的音素内容被锁定,只换音色相关特征。
- 输出:解码器合成波形,并按默认加一层音频水印(wavmark,由
message参数标记内容)——demo 里传message='@MyShell'就是写进波形里的标识。
这个拆分对效果的意义:情感和口音完全由 base speaker 决定,converter 不碰它们。所以"换情绪不用重新提取音色"是设计使然;反过来,参考音频里没有的情绪也克隆不出来,后文踩坑处会展开。
🎛️ 语音克隆效果调优
按"我想要的效果"组织,每个只给关键开关。
想换情绪/口音:不动 converter,改BaseSpeakerTTS.tts()的speaker参数。英文支持 9 种风格:default、whispering、cheerful、excited、sad、angry、terrified、shouting、friendly(选项清单见openvoice_app.py第 86 行)。中文 base speaker 目前只有 default(同文件第 71 行)。
想快一点或慢一点:tts()的speed参数,默认 1.0,代码里以length_scale=1/speed传给模型(api.py第 91 行),1.2 就是加快 20%。
想音色更像参考音频:convert()有tau参数,默认 0.3,控制目标音色替换强度。克隆"不够像"时从这里和参考音频质量两边同时查。
想要更高音质:换 V2 权重,ToneColorConverter改加载checkpoints_v2/converter。README 明确 V2 采用不同训练策略、音质更好。
想省资源:get_se(vad=True)走 Silero VAD 切分,不加载额外大模型;vad=False会走 faster-whisper 的 medium 模型做对齐,需要 GPU 且首次要下载 Whisper 模型(se_extractor.py第 143-146 行)。保持默认 True 即可。
不想加水印:构造 converter 时传enable_watermark=False,api.py就不会加载 wavmark 模型。
🧩 进阶玩法:如何做多语言语音克隆
玩法一:跨语言——英文参考音频说中文
- 需求:参考录音是英文,产出要中文。
- 思路:音色向量和 base speaker 各司其职。用 ZH base speaker 合成中文中间音频,再用同一个
target_se替换音色,converter 环节一行不改。 - 关键配置:
BaseSpeakerTTS路径换成checkpoints/base_speakers/ZH,src_se加载zh_default_se.pth(openvoice_app.py第 32 行就是这个用法),tts()传language='Chinese'。 - 注意:带过去的只有音色,口音和情感继承自中文 base speaker。这是 docs/QA.md 写明的设计边界,不是 bug。完整示例看
demo_part2.ipynb。
玩法二:V2 + MeloTTS——原生六种语言
- 需求:V1 只有 EN/ZH 两个 base speaker,你想要英、西、法、中、日、韩原生支持(README 的 V2 特性)。
- 思路:用 MeloTTS 充当 base speaker。V2 checkpoint 在
checkpoints_v2/base_speakers/ses/目录为每个 MeloTTS 说话人预存了配套的source_se,循环" MeloTTS 合成 + convert 换音色"即得同一音色多语言结果。 - 关键配置:按 docs/USAGE.md 的 V2 章节安装 MeloTTS,跑
python -m unidic download准备日语分词;converter 加载checkpoints_v2/converter。 - 注意:
source_se必须与所用 MeloTTS 说话人一一对应,配错会导致中间音频音色和向量不匹配、听感漂移。完整脚本见demo_part3.ipynb。
⚠️ 语音克隆踩坑预警
现象:生成语音的情绪/口音和参考音频不一样原因:OpenVoice 只克隆音色,不克隆情绪和口音,这两项由 base speaker 决定(QA.md 明确说明)。 解法:接受 base speaker 的风格,或换成带该口音的 base speaker 模型。
现象:首次跑get_se报 Silero 下载失败原因:vad=True路径的get_vad_segments首次运行要从 GitHub 拉 silero-vad 模型,网络受限时直接挂。 解法:手动下载 silero-vad 的 zip,解压到~/.cache/torch/hub/snakers4_silero-vad_master(QA.md 安装一节)。
现象:参考音频换了,出来的音色还是旧的原因:se 提取结果按"文件名+内容哈希"落在processed/目录,同名音频会命中旧缓存(demo_part1.ipynb 有专门提醒)。 解法:给参考音频改个文件名,或清掉processed/重新提取。
现象:报 "input audio is too short",或音质差原因:VAD 切分要求人声段足够长(se_extractor.py有断言);背景噪声、多人说话、长静音都会污染音色向量(QA.md 音质一节列了四项检查)。 解法:用干净、单人、人声连续的音频,避开长静音。
现象:Gradio 页面拒绝输入原因:demo 限制文本 2-200 字符,且只认 zh/en 两种语言(openvoice_app.py第 97-114 行)。 解法:长文本直接走BaseSpeakerTTS的 API,它会自动按句切分后逐句合成。
📚 接下来去哪
- 安装细节与 V1/V2 checkpoint 下载:docs/USAGE.md
- 音质、多语言、Silero 问题排查:docs/QA.md
- 三个递进示例:demo_part1.ipynb(风格控制)、demo_part2.ipynb(跨语言)、demo_part3.ipynb(V2 多语言)
- 核心源码:openvoice/api.py(TTS 与音色转换两个类)、openvoice/se_extractor.py(参考音频预处理)
OpenVoice 是 MIT 协议的即时语音克隆基础模型:音色可克隆、风格可控、语言可换,替换 base speaker 即可适配任意语言场景。
【免费下载链接】OpenVoiceInstant voice cloning by MIT and MyShell. Audio foundation model.项目地址: https://gitcode.com/GitHub_Trending/op/OpenVoice
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考