Loading...

文章背景图

OpenVoice:多语言即时声音克隆(音色复制)部署与使用指南

2025-04-19
0
- 字
- 分钟
|

OpenVoice:多语言即时声音克隆(音色复制)部署与使用指南

OpenVoice 是 MyShell 公司开源的即时声音克隆技术,论文见 arXiv:2312.01479,自 2023 年 5 月起一直在为 myshell.ai 提供即时声音克隆能力,到 2023 年 11 月该模型已被全球用户使用数千万次。它的技术路线不是"端到端直接克隆嗓音",而是把"基发声 TTS"与"音色转换器"解耦:先用一个多说话人基模型生成带目标语言韵律的语音,再用音色转换器把参考音频的音色精确搬过来,从而在任意语言间迁移音色。这种解耦带来两个直接后果:一是口音、情感、节奏、停顿、语调由基 TTS 决定,想换风格就换基模型;二是最难的音色转换部分官方已经训练好,接入新语言只需准备一个该语言的基 TTS。

技术原理与工作流程

从 demo 代码可以看出,OpenVoice 的运行时是三段式:第一步,用 se_extractor.get_se 对参考音频做 VAD 切分并提取说话人嵌入 target_se;第二步,用基说话人 TTS(V1 是 BaseSpeakerTTS,V2 是 MeloTTS)把目标文本合成为临时语音,这段语音的韵律、情感、口音由基模型决定;第三步,用 ToneColorConverter.convert 把临时语音的音色替换成 target_se 对应的音色,输出最终 wav。理解这一点,就能理解 README 里反复强调的"只克隆音色、不克隆口音情感"——因为口音情感在第二步就已经定型,第三步只搬音色。

权重目录也按这个流程组织:V1 的 checkpoints/base_speakers/EN 与 checkpoints/base_speakers/ZH 是基说话人模型,各自带 config.json、checkpoint.pth 以及若干预提取的说话人嵌入文件(en_default_se.pth 默认音色、en_style_se.pth 风格化音色、zh_default_se.pth 中文默认音色);checkpoints/converter 是音色转换器。V2 把基模型换成 MeloTTS,只保留 checkpoints_v2/converter。运行时 target_dir='processed' 目录会缓存参考音频的 VAD 切分结果,所以改名参考音频后必须删掉旧缓存,否则会用到上一条音频的嵌入。

这套架构的工程价值在于:基 TTS 负责"说得像",音色转换器负责"声音像",两者可以独立替换与升级。业务团队想接某种新语言,只要找一个该语言的基 TTS(开源或 OpenAI TTS 都行),无需重训音色转换器;想换情感风格,换一个对应风格的基说话人嵌入即可,整个过程不动转换器权重。这也是 OpenVoice 发布后迅速被社区接入 Windows、Docker、移动端等多种部署形态的原因——解耦带来的可替换性。截至 2023 年 11 月,该声音克隆模型已被全球用户使用数千万次,myshell.ai 平台上用户增长迅速,是开源声音克隆领域实际落地规模最大的项目之一。

一、项目官方信息

项目 信息
GitHub 仓库 myshell-ai/OpenVoice
官方网站 research.myshell.ai/open-voice
论文 arXiv:2312.01479
在线体验 Hugging Face Space
开源协议 MIT(2024 年 4 月起 V1 与 V2 均为 MIT,可免费商用)
主贡献者 Zengyi Qin(MIT)、Wenliang Zhao(清华大学)、Xumin Yu(清华大学)、Ethan Sun(MyShell)
技术底座 基于 coqui-ai/TTS、VITS 与 VITS2

二、官方图片

OpenVoice 仓库封面(本站封面):

OpenVoice

三、核心功能与版本差异

OpenVoice V1 的三大优势

  1. 精确的音色克隆:OpenVoice 能精确克隆参考音频的音色(tone color),并以多种语言、多种口音生成语音。这里的"音色"指的是说话人声带与声道带来的频谱特征,也就是"一听就知道是谁"的那部分;它不包含情绪与口音韵律,后者由基 TTS 控制。
  2. 灵活的语音风格控制:可以细粒度控制语音风格,包括情感、口音,以及节奏、停顿、语调等其他风格参数。在 demo 里这种控制通过选择不同的基说话人嵌入实现——例如英文默认音色用 en_default_se.pth,耳语风格用 en_style_se.pth,切换 speaker 参数(如 whispering)与 speed 参数即可改变听感。
  3. 零样本跨语言声音克隆:生成语音的语言与参考语音的语言,都不需要出现在大规模多说话人多语言训练数据集中。这意味着你拿一段没见过的语言录音当参考,也能用克隆出的音色去讲英语、中文等目标语言,无需为该语言专门训练音色转换器。

OpenVoice V2(2024 年 4 月发布)

V2 包含 V1 的全部功能,并带来三项改进:

  1. 更好的音质:采用不同的训练策略,音频质量明显提升;V2 把基 TTS 换成了 MeloTTS,生成临时语音这一步的自然度更高。
  2. 原生多语言支持:原生支持英语、西班牙语、法语、中文、日语、韩语六种语言,对应 MeloTTS 的语言代码 EN_NEWEST/EN/ES/FR/ZH/JP/KR,不再需要像 V1 那样只靠 EN/ZH 两个基模型外加第三方 TTS。
  3. 免费商用:从 2024 年 4 月起,V2 与 V1 均以 MIT 协议发布,商业使用免费,这对把声音克隆集成到产品里的团队是关键利好。

能力边界(务必先读)

OpenVoice 是一项技术而不是产品:对大多数嗓音正确使用时都能工作,但不要期望它在每个案例上都完美。它的目标用户是开发者与研究者,不是终端用户。团队明确表示:OpenVoice 只克隆参考说话人的音色,并不克隆口音与情感;口音与情感由基发声 TTS 模型控制,而不是音色转换器。想改变输出口音或情感,需要换一个带该口音的基说话人模型——OpenVoice 把最难的音色转换部分做好了,基说话人 TTS 相对容易训练,也可以直接用 OpenAI TTS 当基说话人。

四、环境要求与安装

该安装流程面向熟悉 Linux、Python 与 PyTorch 的研究者与开发者。V1 与 V2 安装命令完全相同:

conda create -n openvoice python=3.9
conda activate openvoice
git clone git@github.com:myshell-ai/OpenVoice.git
cd OpenVoice
pip install -e .
  • Python 版本:官方指定 3.9(conda 环境),用 conda 单独建 openvoice 环境是为了隔离 PyTorch 与 TTS 依赖,避免与系统环境冲突。
  • 权重:V1 与 V2 分开下载,分别解压到 checkpoints 与 checkpoints_v2 文件夹;两个压缩包都包含基说话人配置、音色转换器权重与预提取说话人嵌入。
  • V2 额外依赖 MeloTTS:
pip install git+https://github.com/myshell-ai/MeloTTS.git
python -m unidic download

python -m unidic download 是为日语 TTS 下载 UniDic 词典,V2 原生支持日语音色克隆时需要。

五、部署步骤

1. 免安装快速体验

不想配环境的,可直接用已部署的在线服务:MyShell 为九种口音/语言各提供了一个 Widget 链接,分别是英式英语、美式英语、印度英语、澳大利亚英语、西班牙语、法语、中文、日语与韩语;Hugging Face Space 也提供最小化 Demo。输入参考音频可以是任意语言,OpenVoice 会克隆其中音色,再用该音色讲多种语言。这种"参考音频任意语言、输出任意语言"的零样本能力,正是 V1 三大特性里"零样本跨语言声音克隆"的体现:参考音频的语言和输出语言都不需要出现在大规模多说话人多语言训练集里。

2. OpenVoice V1 部署

从 checkpoints_1226.zip 下载权重并解压到 checkpoints 文件夹:

  • 灵活风格控制:见 demo_part1.ipynb,演示如何对克隆出的嗓音做情感、口音、节奏、停顿、语调等风格调节。
  • 跨语言声音克隆:见 demo_part2.ipynb,演示 MSML 训练集中见过与没见过的语言的克隆效果。
  • 本地 Gradio Demo:运行 python -m openvoice_app --share 启动本地界面;遇到问题先看 demo_part1.ipynb、demo_part2.ipynb 与 QA 文档。

3. OpenVoice V2 部署

从 checkpoints_v2_0417.zip 下载权重并解压到 checkpoints_v2 文件夹,按上面装 MeloTTS 后见 demo_part3.ipynb。V2 原生支持英语、西班牙语、法语、中文、日语、韩语六种语言。

4. 其他平台安装(社区维护)

六、使用方法(V1 与 V2 代码示例)

V1:基 TTS + 音色转换器

import os
import torch
from openvoice import se_extractor
from openvoice.api import BaseSpeakerTTS, ToneColorConverter

ckpt_base = 'checkpoints/base_speakers/EN'
ckpt_converter = 'checkpoints/converter'
device = "cuda:0" if torch.cuda.is_available() else "cpu"
output_dir = 'outputs'

base_speaker_tts = BaseSpeakerTTS(f'{ckpt_base}/config.json', device=device)
base_speaker_tts.load_ckpt(f'{ckpt_base}/checkpoint.pth')

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

source_se = torch.load(f'{ckpt_base}/en_default_se.pth').to(device)

# 参考音频:你想克隆的嗓音
reference_speaker = 'resources/example_reference.mp3'
target_se, audio_name = se_extractor.get_se(reference_speaker, tone_color_converter, target_dir='processed', vad=True)

# 先用基 TTS 生成临时语音,再做音色转换
text = "This audio is generated by OpenVoice."
src_path = f'{output_dir}/tmp.wav'
base_speaker_tts.tts(text, src_path, speaker='default', language='English', speed=1.0)
tone_color_converter.convert(
    audio_src_path=src_path,
    src_se=source_se,
    tgt_se=target_se,
    output_path=f'{output_dir}/output_en_default.wav',
    message="@MyShell")

要点:source_se 是基说话人嵌入,英文默认用 en_default_se.pth、风格化(如 whispering 耳语)用 en_style_se.pth、中文基模型用 zh_default_se.pth;target_se 由 se_extractor.get_se 对参考音频做 VAD 切分后提取,vad=True 时会调用 Silero VAD;base_speaker_tts.tts 的 speaker 参数选基说话人风格(如 whispering),language 选 English/Chinese,speed 可调;message="@MyShell" 是转换时的水印信息。换中文时把 ckpt_base 换成 checkpoints/base_speakers/ZH,source_se 换成 zh_default_se.pth 即可。

V2:MeloTTS 基模型 + 音色转换器

import os, torch
from openvoice import se_extractor
from openvoice.api import ToneColorConverter

ckpt_converter = 'checkpoints_v2/converter'
device = "cuda:0" if torch.cuda.is_available() else "cpu"
tone_color_converter = ToneColorConverter(f'{ckpt_converter}/config.json', device=device)
tone_color_converter.load_ckpt(f'{ckpt_converter}/checkpoint.pth')

reference_speaker = 'resources/example_reference.mp3'
target_se, audio_name = se_extractor.get_se(reference_speaker, tone_color_converter, vad=True)

from melo.api import TTS
texts = {
    'EN_NEWEST': "Did you ever hear a folk tale about a giant turtle?",
    'EN': "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': "在这次vacation中,我们计划去Paris欣赏埃菲尔铁塔。",
    'JP': "彼は毎朝ジョギングをして体を健康に保っています。",
    'KR': "안녕하세요! 오늘은 날씨가 정말 좋네요.",
}
speed = 1.0
for language, text in texts.items():
    model = TTS(language=language, device=device)
    speaker_ids = model.hps.data.spk2id

V2 用 MeloTTS 的 melo.api.TTS 替代 V1 的 BaseSpeakerTTS,语言代码取 EN_NEWEST/EN/ES/FR/ZH/JP/KR,再把 MeloTTS 生成的临时语音送入 ToneColorConverter.convert 换成参考音色,语速 speed 可调。

七、使用要点

  • 三个 demo notebook 的分工:demo_part1.ipynb 演示灵活风格控制(英文默认/耳语/中文默认三套基说话人嵌入的切换);demo_part2.ipynb 演示跨语言克隆(训练集见过与没见过的语言);demo_part3.ipynb 是 V2 用法,展示 MeloTTS 六种语言一次循环生成后统一转音色。
  • 设备选择:代码里 device = "cuda:0" if torch.cuda.is_available() else "cpu",有 GPU 用 GPU,无 GPU 回退 CPU;基 TTS 与音色转换器都按这个 device 加载权重。
  • 输出目录:V1 输出到 outputs/,V2 输出到 outputs_v2/;临时文件 tmp.wav 是基 TTS 的中间产物,最终 wav 是音色转换后的结果。
  • 参考音频质量决定上限:必须干净无背景噪音、不能太短、只能一个人说话、不能有长空白段;改名参考音频后要删 processed 缓存。
  • 风格控制路径:想改口音/情感不是在音色转换器里调,而是换基发声 TTS;OpenVoice 允许简单替换官方基说话人模型,接入自己的基模型。
  • 加语言路径:只要有该语言的基说话人 TTS,OpenVoice 就支持该语言;不想训练基模型可直接用 OpenAI TTS 当基说话人。

八、常见问题 FAQ

Q:为什么克隆出来的语音口音和情感不像参考人? A:这是设计使然,不是 bug。OpenVoice 只克隆音色,口音与情感由基发声 TTS 模型决定;要特定口音/情感,需换带该口音的基说话人模型。

Q:生成语音音质差怎么排查? A:依次检查:参考音频是否干净无背景噪音;是否太短;是否有多个说话人;是否有长空白段;改名后是否忘了删 processed 文件夹。

Q:能加官方列表之外的语言吗? A:可以,只要有该语言的基说话人 TTS。音色转换器已由官方训练好,基模型相对容易训练,也可直接用 OpenAI TTS。

Q:V1 和 V2 能混用权重吗? A:不能。V1 权重解压到 checkpoints,V2 解压到 checkpoints_v2,且 V2 需额外装 MeloTTS 与 UniDic 词典;两套环境相互独立。

Q:商用授权清楚吗? A:2024 年 4 月起 V1 与 V2 均为 MIT 协议,商业与研究使用均免费;但要注意第三方依赖(TTS、VITS、VITS2、MeloTTS)各自的许可。

Q:它和端到端声音克隆有什么区别? A:OpenVoice 走"基 TTS + 音色转换"路线,优势是音色克隆精确、风格可控、跨语言零样本;代价是韵律受基模型约束,不是自由生成。它不要求你为目标语言训练一个完整的克隆模型,而是把最难的音色转换部分通用化,业务侧只需要准备文本与参考音频即可上线。

Q:Silero VAD 下载失败怎么办? A:se_extractor.get_se 首次运行会从 GitHub 下载 Silero VAD;机器访问不了 GitHub 时,手动下载 silero-vad 主分支 zip 解压到 ~/.cache/torch/hub/snakers4_silero-vad_master。

Q:输出音频里的水印 @MyShell 是什么? A:tone_color_converter.convert 的 message 参数会在转换时写入水印信息,默认值是 @MyShell,用于追溯模型来源;这是开源模型的使用规范,不要随意改动或移除。

Q:参考音频应该多长、什么格式? A:官方 QA 建议参考音频干净、单人、无长空白、不要太短;格式上支持常见音频格式,se_extractor 会用 VAD 自动切分有效语音段。多人说话或大段静音会让提取的说话人嵌入失真。

Q:为什么要强调"技术不是产品"? A:团队的定位很明确——OpenVoice 贡献的是一套通用即时声音克隆的技术路线,不是开箱即用的完美产品;把它工程化成稳定产品需要大量额外工作。它面向开发者与研究者,目标是加速开源社区在声音克隆方向的进展,让免费方案有朝一日能追平商用方案。

九、跳转链接

评论交流

文章目录