菜单

说话人编码器

相关源文件

目的和概述

说话人编码器是SV2TTS(说话人验证到文本到语音合成)语音克隆管道中的第一个组件。它的主要功能是将几秒钟的参考音频转换为一个固定长度的向量表示,称为语音嵌入。此嵌入捕捉说话人独特的发声特征,同时丢弃语言内容,使得系统能够仅凭一小段音频样本克隆语音。

有关此组件如何与整个系统集成的更多信息,请参阅系统架构

来源:encoder/inference.py1-179 toolbox/__init__.py9-14

组件架构

说话人编码器由多个关键组件协同工作,以创建区分性的语音嵌入。

  1. 音频预处理:将原始音频转换为标准化格式。
  2. 梅尔频谱生成:将音频转换为时频表示。
  3. LSTM网络:处理频谱以提取说话人特征。
  4. 嵌入层:输出一个代表说话人声音的固定维度向量。

编码器使用广义端到端(GE2E)损失进行训练,该损失优化嵌入,使其对于相同的说话人相似,而对于不同的说话人不同。

来源:encoder/inference.py38-56 encoder/audio.py19-66

神经网络架构

说话人编码器的核心是3层LSTM网络,用于处理梅尔频谱帧。

  1. 该网络接收可变长度的梅尔频谱作为输入。
  2. LSTM顺序处理帧,累积说话人特征。
  3. 最终的隐藏状态被投影到一个256维的嵌入。
  4. 应用L2归一化以将嵌入限制在单位超球面上。

这种架构允许模型处理任意长度的发音,同时生成固定大小的嵌入。

来源:encoder/inference.py42-55 encoder/inference.py110-154

处理管道

音频预处理

在创建嵌入之前,原始音频会经过几个预处理步骤。

  1. 加载:音频文件被加载或作为波形数组接收。
  2. 重采样:音频被重采样到16kHz(训练期间使用的采样率)。
  3. 音量归一化:音频被归一化到一致的音量级别。
  4. 静音修剪:使用WebRTC VAD(可选)移除过多的静音。

这些步骤确保了一致的音频质量,以获得可靠的嵌入。

来源:encoder/audio.py19-50 encoder/params_data.py

梅尔频谱生成

预处理后的音频被转换为梅尔频谱。

  1. 对窗口长度为25ms,步长为10ms的短时傅里叶变换进行应用。
  2. 生成的频谱通过具有40个通道的梅尔滤波器组。
  3. 输出是一个矩阵,其中每行代表一个时间帧,每列代表一个梅尔频率带。

这种时频表示捕捉了说话人识别所需的声学特性。

来源:encoder/audio.py53-65

部分发音和嵌入生成

为了获得可靠的嵌入,尤其是在较长的发音中,

  1. 发音被分割成重叠的固定长度的“部分发音”(通常为1.6秒)。
  2. 每个部分都通过LSTM网络处理以获得部分嵌入。
  3. 部分嵌入被平均化,以创建一个单一的发音嵌入。
  4. 对最终嵌入应用L2归一化。

这种方法提高了对发音长度和内容变化的鲁棒性。

来源:encoder/inference.py58-107 encoder/inference.py110-154

模型训练

数据集准备

编码器在大型多说话人数据集上进行训练。

  1. 来自LibriSpeech和VoxCeleb等数据集的音频经过预处理。
  2. 计算梅尔频谱并将其存储在分层目录结构中。
  3. 专门的数据加载器提供按说话人和发音组织的批次。

训练数据结构化,以有效地实现GE2E损失计算。

来源:encoder/preprocess.py58-184 encoder/data_objects/speaker_verification_dataset.py10-55

使用GE2E损失的训练过程

训练过程使用GE2E(广义端到端)损失来优化网络。

  1. 批次包含来自多个说话人的多个发音。
  2. 网络为所有发音生成嵌入。
  3. 计算每个发音与每个说话人中心点之间的相似度矩阵。
  4. GE2E损失鼓励与正确说话人之间的高度相似性,以及与其他说话人之间的高度不相似性。
  5. 反向传播更新网络权重。

这种方法创建了一个区分性的嵌入空间,其中同一说话人的发音聚集在一起。

来源:encoder/train.py18-125 encoder/data_objects/speaker_batch.py6-13

推理模式下的使用

加载模型

预训练的编码器模型可以轻松加载用于推理。

来源:encoder/inference.py14-35 toolbox/__init__.py313-321

创建语音嵌入

从新的音频样本创建嵌入涉及对音频进行预处理并将其通过模型。

来源:encoder/inference.py110-154 toolbox/__init__.py177-190

与SV2TTS系统的集成

在完整的语音克隆管道中,

  1. 说话人编码器处理参考音频以提取语音嵌入。
  2. 该嵌入与目标文本一起传递给合成器。
  3. 合成器生成匹配语音特征的梅尔频谱。
  4. 声码器将梅尔频谱转换为最终的音频波形。

该嵌入充当“语音身份卡”,指示合成器应该如何发声。

来源:toolbox/__init__.py196-222 toolbox/__init__.py225-311

可视化

工具箱提供了语音嵌入的可视化能力。

  1. 热力图可视化:将嵌入值显示为二维热力图。
  2. UMAP投影:将多个说话人的嵌入投影到二维空间,以可视化说话人聚类。

这些可视化有助于理解嵌入的区分性属性。

来源:encoder/inference.py161-178 toolbox/ui.py62-79 toolbox/ui.py97-135

技术规格

参数描述
嵌入大小256输出语音嵌入的维度
采样率16,000 Hz编码器使用的音频采样率
梅尔通道数40频谱中的梅尔频率带数量
窗口长度25毫秒用于频谱生成的STFT窗口长度
窗口步长10毫秒用于频谱生成的STFT跳跃长度
部分发音帧数160每个部分发音的帧数(约1.6秒)
模型类型3层 LSTM核心神经网络架构

来源:encoder/params_data.py encoder/inference.py110-154