OpenVoice:三秒克隆音色的即时语音合成,跨语言也能保留情感

OpenVoice:三秒克隆音色的即时语音合成,跨语言也能保留情感

AI 音频

📖 简介

OpenVoice 由 MyShell 开源,37.8k Stars,主打极低成本的音色克隆与跨语言音色迁移。它把"音色"与"语调情感"解耦,因此用中文样本克隆的音色可以直接说英文而不失语气,是做多语言配音与数字人时最实用的一环。

📝 详细介绍

这篇教程带你完成什么

跟着走一遍,你会在本地跑通一个完整的 OpenVoice V2 音色克隆 Demo:给一段 3~10 秒的参考人声,用 MeloTTS 合成一句话,再把音色迁移过去,最后拿到一个和你参考音频音色一致、内容任意可控的 wav 文件。

前置条件

  • 操作系统:Linux 或 macOS 最省事;Windows 请用 WSL2,原生 Windows 下 MeloTTS 的依赖容易编译失败。
  • Python 3.9(官方推荐版本,3.10+ 部分依赖轮子对不上)。
  • Conda 或 Miniconda,用来隔离环境,避免和系统里的 torch 打架。
  • 硬件:有 NVIDIA GPU(建议 ≥8GB 显存)会快很多;纯 CPU 也能跑,就是合成一句话要等几十秒。
  • 磁盘:预留 5GB 左右,V2 的 checkpoint 加 MeloTTS 的模型差不多这个量级。
  • 一段干净的参考音频:单人说话、无背景音乐、无混响,3~10 秒最佳。

安装部署

第一步:拉代码、建环境

git clone https://github.com/myshell-ai/OpenVoice.git
cd OpenVoice
conda create -n openvoice python=3.9 -y
conda activate openvoice
pip install -e .

仓库是 MIT 协议,商用没有额外授权门槛。

第二步:装 MeloTTS 并初始化

OpenVoice V2 的“基础朗读”这一步交给了 MeloTTS,必须单独装,还要下一个日语分词词典(即使你只用英文也得下,否则 import 就会炸)。

pip install git+https://github.com/myshell-ai/MeloTTS.git
python -m unidic download

第三步:下载 V2 权重

wget https://myshell-public-repo-host.s3.amazonaws.com/openvoice/checkpoints_v2_0417.zip
unzip checkpoints_v2_0417.zip

解压后目录结构应该是 checkpoints_v2/converter/ 和 checkpoints_v2/base_speakers/ses/。确认这两个路径存在再往下走。

第四步:启动官方 Web 界面(可选)

python openvoice_app.py

浏览器打开终端里提示的端口,可以先拖一段音频试试手感,确认整条链路没问题。

第一个 Demo:三行核心逻辑跑通音色克隆

步骤 1:建脚本骨架,加载转换器

新建 demo.py。OpenVoice 的转换器是 ToneColorConverter,它负责“把 A 的音色套到 B 的内容上”。

import os
import torch
from openvoice import se_extractor
from openvoice.api import ToneColorConverter
from melo.api import TTS

device = "cuda:0" if torch.cuda.is_available() else "cpu"

ckpt_converter = "checkpoints_v2/converter"
tone_color_converter = ToneColorConverter(f"{ckpt_converter}/config.json", device=device)
tone_color_converter.load_ckpt(f"{ckpt_converter}/checkpoint.pth")

output_dir = "outputs"
os.makedirs(output_dir, exist_ok=True)

步骤 2:从参考音频里提取音色向量

这一步把参考音频压缩成一个 speaker embedding(SE),后面转换全靠它。vad=True 会先做静音检测切出有效人声段。

reference_speaker = "resources/example_reference.mp3"  # 换成你自己的音频
target_se, audio_name = se_extractor.get_se(
    reference_speaker, tone_color_converter, vad=True
)
print("提取到的音色标签:", audio_name)

步骤 3:用 MeloTTS 生成中性朗读音频

先不管音色,只把文字读出来,产出一个“素材音”。

model = TTS(language="EN", device=device)
speaker_ids = model.hps.data.spk2id

src_path = f"{output_dir}/tmp.wav"
model.tts_to_file(
    "This audio is generated by OpenVoice V2.",
    speaker_ids["EN-US"],
    src_path,
    speed=1.0,
)

步骤 4:做音色迁移,输出成品

source_se = torch.load(
    "checkpoints_v2/base_speakers/ses/en-newest.pth", map_location=device
)

save_path = f"{output_dir}/output_v2.wav"
tone_color_converter.convert(
    audio_src_path=src_path,
    src_se=source_se,
    tgt_se=target_se,
    output_path=save_path,
    message="@MyShell",
)
print(f"生成完成: {save_path}")

预期输出:终端打印 生成完成: outputs/output_v2.wav,目录里同时出现 tmp.wav(中性音色)和 output_v2.wav(克隆音色)。对比听一下,如果 output 的说话人已经变成了你参考音频里那个人,链路就通了。

配置与调优

参考音频决定效果上限

音色像不像,90% 取决于输入。优先选 5~10 秒、单一说话人、无背景音的片段;带 BGM 的素材建议先过一遍人声分离,或者靠 vad=True 让模型自己切,但效果不如手动裁干净。采样率不用刻意转,OpenVoice 内部会重采样。

用 speed 控制语速,用源音频控制情感

model.tts_to_file(..., speed=1.0) 里的 speed 直接调语速,0.9 更沉稳,1.15 更急促。情感不来自 text,而来自你喂给 get_se 的参考音频——想保留某种情绪,就挑一段本身就带情绪、语速接近目标效果的参考音。这也是它跨语言还能保住语气的原因。

跨语言克隆:换 language,不换音色向量

把 TTS(language="EN") 改成 TTS(language="ZH"),speaker 换成 speaker_ids["ZH"],参考音频仍然用那段英文人声——输出的就是中文内容 + 英文说话人的音色。中英混读建议用 ZH 模型,它的中英混排处理更稳。

常见坑与排错

报错信息原因解决办法
ModuleNotFoundError: No module named 'melo' MeloTTS 没装,或者装在了别的 conda 环境里 pip install git+https://github.com/myshell-ai/MeloTTS.git,确认 which python 指向 openvoice 环境
LookupError: unidic dictionary not found 日语分词词典没下载,MeloTTS 初始化时就会用到 执行 python -m unidic download,网络不通就挂代理重试
FileNotFoundError: checkpoints_v2/converter/config.json 权重没下,或者 unzip 多套了一层目录 检查当前目录下是否直接存在 checkpoints_v2/converter/,多一层就 mv 上来
torch.cuda.OutOfMemoryError 显存不够,参考音频过长时 SE 提取阶段峰值更高 把 device 改成 "cpu",或把参考音频裁到 5 秒以内

下一步

  • 包成服务:把 demo.py 的逻辑封成一个 FastAPI 接口,接收参考音频 URL + 文本,返回 wav,方便接到自己的产品里。官方 openvoice_app.py 可以直接抄它的参数组织方式。
  • 批量与并发:ToneColorConverter 和 MeloTTS 模型加载一次就该常驻内存,别每个请求 load 一遍;再按 GPU 显存做请求排队。
  • 往上游走:看 openvoice/api.py 和 se_extractor.py 的实现,理解 SE 提取和 tone color 转换的解耦设计,然后可以试着接自己的 TTS 前端,或者用自采数据微调 converter。
🚀

AI 项目推荐

AI 音频
标签
#语音克隆 #音色转换 #TTS #跨语言 #MyShell
浏览
👁️ 3
发布日期
2026-10-05