这是一个由GE2E损失训练的把发言人语音嵌入(d-vector)的PyTorch实现。
原始关于GE2E损失的论文在这里:Generalized End-to-End Loss for Speaker Verification。
本文档由原始英文文档翻译修订而来。 注意:dvector脚本目前仅支持linux,放在win上面会报错
使用方法
#音频处理
import torch
import torchaudio
wav2mel = torch.jit.load("wav2mel.pt")
dvector = torch.jit.load("dvector.pt").eval()
wav_tensor, sample_rate = torchaudio.load("example.wav")
mel_tensor = wav2mel(wav_tensor, sample_rate) # shape: (frames, mel_dim)
emb_tensor = dvector.embed_utterance(mel_tensor) # shape: (emb_dim)
单次训练已修改为读取文件夹,注意在读取文件的时候文件数要大于聚类数,不然会报错
~python3 demo.py --file ./train.wav --mode register~
python3 demo.py --file ./train --mode register
python3 demo.py --file ./value.wav --mode recognize
你也可以一次嵌入一个发言人的多句话:
emb_tensor = dvector.embed_utterances([mel_tensor_1, mel_tensor_2]) # shape: (emb_dim)
当然你也可以一次测试多个准确率,只需要在test.py中修改目标文件夹:
python3 test.py
我使用的测试数据包为Free ST Chinese Mandarin Corpus
这个语料库是用手机在室内安静的环境中录制的。它有855个speakers。每个演讲者有120个话语。所有的话语都经过人仔细的转录和核对。保证转录精度
语料库包含: 1音频文件; 2转录; 3元数据;
2)链接
下载:(8.2G)
http://www.openslr.org/resources/38/ST-CMDS-20170001_1-OS.tar.gz
国内镜像:
http://cn-mirror.openslr.org/resources/38/ST-CMDS-20170001_1-OS.tar.gz
这个例子中有两个模块:
-
wav2mel.pt
是预处理模块,由两个子模块组成:sox_effects.pt
用于标准化音量,去除静音,将音频重采样为16 KHz,16位,并将所有通道混合为单通道。log_melspectrogram.pt
用于将波形转换为对数梅尔(MEL)频谱图。
-
dvector.pt
是发言人编码器。
由于所有模块都使用TorchScript编译,所以你可以简单地加载它们并在任何地方使用,无需任何依赖。
预训练模型和预处理模块
你可以从Releases页面下载它们。
评估模型性能
你可以使用等错误率(equal error rate)来评估模型的性能。例如,从VoxCeleb1数据集下载官方测试切分(veri_test.txt和veri_test2.txt),然后运行以下命令:
python equal_error_rate.py VoxCeleb1/test VoxCeleb1/test/veri_test.txt -w wav2mel.pt -c dvector.pt
到目前为止,发布的检查点只在VoxCeleb1上进行了训练,没有进行任何数据增强。它在VoxCeleb1的官方测试切分上的性能如下:
测试切分 | 等错误率 | 阈值 |
---|---|---|
veri_test.txt | 12.0% | 0.222 |
veri_test2.txt | 11.9% | 0.223 |
从头开始训练
-
预处理训练数据 要使用此处提供的脚本,您必须按以下方式组织原始数据:
来自同一人的所有语音都放在对应发言人目录下 所有发言人目录都放在根目录 发言人目录可以有子目录,语音可以放在子目录下
您可以从多个根目录中提取话语,例如
python preprocess.py VoxCeleb1/dev LibriSpeech/train-clean-360 -o preprocessed
如果你需要修改一些音频预处理超参数,直接修改data/wav2mel.py。
预处理后,3个预处理模块将保存在输出目录中:
wav2mel.pt
sox_effects.pt
log_melspectrogram.pt
第一个模块wav2mel.pt由第二和第三模块组成。这些模块都使用TorchScript编译,可以在任何地方用于预处理音频数据。
-
训练模型
你必须指定存储检查点和日志的位置,例如:
python train.py preprocessed <model_dir>
在训练过程中,日志将放在
<model_dir>/logs
下,检查点将放在<model_dir>/checkpoints
下。更多细节,可以使用python train.py -h
查看使用方法。 -
使用不同的发言人编码器
默认情况下,我使用的是带有注意力池化的3层LSTM作为发言人编码器,但你可以使用不同架构的发言人编码器。更多信息,请查看
modules/dvector.py
。 -
可视化语音嵌入
你可以使用训练好的d-vector来可视化语音嵌入。注意,你必须像预处理一样组织语音的目录。例如:
python visualize.py LibriSpeech/dev-clean -w wav2mel.pt -c dvector.pt -o tsne.jpg
更多详细信息,请参阅GitHub项目页面。