Alize 声纹识别 学习笔记 失败了

源码地址

https://github.com/ALIZE-Speaker-Recognition/alize-core
https://github.com/ALIZE-Speaker-Recognition/LIA_RAL
https://gitcode.com/ibillxia/VoicePrintReco/tree/master

项目目录

目录简介

LIA_RAL_2.0 里面
为了更好地满足每个人的需求,ALIZÉ采用了多层架构。
基础层是 ALIZE-Core,这是一个低级库,包括使用高斯混合所需的所有函数,以及各种文件格式的 I/O 函数。
在这个核心之上构建了LIA_RAL,这是一个提供更高级别功能的工具包。LIA_RAL本身由几个组件组成:

LIA_SpkDet
一组工具,用于完成说话人身份验证系统所需的所有任务 - 模型训练、特征归一化、分数归一化等。
LIA_SpkSeg
说话人日记化工具。
LIA_Utils
用于操作 ALIZÉ 中使用的各种数据格式的实用程序 — GMM、特征等。
LIA_SpkTools
其他部分所基于的库;它在 ALIZE-core 之上提供高级功能。
同时,LIA_RAL还包括一个名为 SimpleSpkDetSystem 的库,该库为希望在其应用程序中轻松嵌入说话人验证或识别的开发人员提供了一个简单的高级 API。还开发了此 API 的 Java 版本,针对 Android 应用程序开发。

基础知识

声纹识别算法

高斯混合模型-全局背景模型(GMM-UBM),联合因子分析JFA和i-vector
i-vector 适合长语音,跨信道
GMM-UBM 适合短语音,安静,同信道
2014 之后
深度神经网络(Deep Neural NetWorks DNN)
DNN代替了GMM 推出 DNN i-vector
2017 之后
x-vector框架,前端提取的特征送人延时神经网络,Time-Delay Neural Networks TDNN
依靠NDD学习能力正式进入DNN时代

提取声学特征(采用FBank和MFCC)

送入声纹模型,提取说话人的表征(i-vector或x-vector),然后后端判别(采用余弦Cosine或概率线性区分分析PLDA)
FBank:采用对数功率输出,保留较多原始特征,适合神经网络
MFCC:采用离散余弦变换DCT得到紧凑的特征向量

声纹识别系统框架

声学特征提取过程

声纹模型可采用基于 GMM 的 i-vector 或基于神经网络的 x-vector

i-vector 是基于单一空间的跨信道算法,该空间既包含了说话人空间的信息也包含了信道空间信息。
i-vector 是生成式建模,泛化性较好,但对短语音(5 秒以内)性能不佳,一般建模语音要 40 秒以上,测试语音要 10 秒以上。

x-vector 的模型结构,主要包含三部分:
• 帧级别:处理时序语音信息;
• Statistics Pooling:学习数据的全局统计信息;
• 段级别:进一步提取全局信息。
x-vector 网络输出节点对应说话人的 ID,是区分性建模,其优点是短语音性能较好,神经网络可以训练大数据,但泛化性较差,未见的说话人领域性能会下降很多。

x-vector

声纹识别以 x-vector 为主流框架,其关键技术涉及数据准备,损失函数,模型的架构和学习方法,以及后端分类器,通过数据加噪、模拟远场、Specaugment、Online 扩增,可有效提高声纹模型的鲁棒性。针对模型的网络结构、池化(pooling)方式、学习方法等多方面的改进,仍然是目前学术界的研究热点。由于采用 AM-Softmax、AAM-Softmax 等带 Margin 的损失函数,使得提取到的 x-vector 已具备较强的区分性,因此后端分类器已较多采用 Cosine 打分,其复杂度非常低,识别效率远超过 PLDA 打分。但针对跨领域的自适应,PLDA 更有优势。

声纹识别开源工具ASV-Subtools



环境配置

Kaldi 安装
//下载kaldi源码
git clone https://github.com/kaldi-asr/kaldi.git
//编译tools
cd kaldi/tools
extras/check_dependencies.sh
make -j 4
//编译kaldi
cd ../src
./configure --shared
make depend -j 8
make -j 8
//检查是否安装成功,输出显示如下即为安装成功
cd ../egs/yesno/s5
sh run.sh


Subtools 安装

1、构建工程目录,这里推荐构建四级目录,以 Kaldi 为第一级目录开始计算 , 在 上 节 中 已 经 将 Kaldi 安装至 /work 下 , 因 此 四 级 目 录 结 构 为/work/kaldi/egs/xmuspeech/example。其中[xmuspeech]为自定义目录,[example]为工程目录。通过 shell 命令,创建工程目录。

mkdir -p /work/kaldi/egs/xmuspeech/example
cd /work/kaldi/egs/xmuspeech/example
git clone https://github.com/Snowdar/asv-subtools.git subtools
安装 Pytorch

安装依赖库,相关依赖库的列表在 subtools/requirements.txt 有列出,通过pip 命令完成安装即可。

pip install torch
pip install -r subtools/requirements.txt

为 subtools 配置 Kaldi 路径。若 subtools 的路径按上述步骤在第四级目录,例如/work/kaldi/egs/xmuspeech/example/,则无需更改 path 路径,否则需要编辑 subtools/path.sh 配置 KALDI_ROOT,具体要求可按 subtools/path.sh 内容进行修改。
以上,就已完成 subtools 的环境安装。

入门使用—Voxceleb1 训练和测试

VoxCeleb4是一个英文数据集,包括两个子集 VoxCeleb1 和 Voxceleb2,在数据下载完成之后需要准备数据映射文件,分别为 wav.scp、utt2spk、spk2utt,这三种文件的格式分别为:

wav.scp:utt-id utt-path
utt2spk:utt-id spk-id
spk2utt:spk-id utt-id

以数据存放位置为/data1/voxceleb1/dev,结合 shell 命令为例,这里提供一种生成以上三个文件的范例:
1.创 建 数 据 文 件 夹 , 在 第 4 章 中 构 建 工 程 的 路 径 为/work/kaldi/egs/xmuspeech/example,通过 shell 命令在 example 下构建 data 目录用于存放数据映射文件。

mkdir -p data/voxceleb1_train

2、利用 find 命令获取该文件夹下所有 wav 文件的绝对路径并保存至 temp.lst中。

find /data1/voxceleb1/dev -name *.wav > data/ voxceleb1_train/temp.lst

此 时 temp.lst 文 件 里 保 存 了 所 有 dev 的 语 音 的 绝 对 路 径 , 例 :/data1/voxceleb1/dev/id10001/1zcIwhmdeo4/00001.wav

awk '{split($1,a,"/");{split(a[7],b,”.”)}print a[5]"-"a[6]"-"b[1],$1}' 
data/ voxceleb1_train/temp.list > data/ voxceleb1_train/wav.scp

利用 awk 命令将 temp.lst 中的每一行进行切分并重新组合构建 wav.scp,输出格式为:

id0001-1zcIwhmdeo4-00001 /data1/voxceleb1_dev/id10001/1zcIwhmdeo4/00001.wav

3、同样利用 awk 命令生成 utt2spk 和 spk2utt 两个文件。

awk '{split($1,a,"/");{split(a[7],b, ".")};print a[5]"-"a[6]"-"b[1],a[5]}' 
data/ voxceleb1_train/temp.lst > data/ voxceleb1_train/utt2spk
awk '{split($1,a,"/");{split(a[7],b,”.”)}print a[5], a[5]"-"a[6]"-"b[1]}' 
data/ voxceleb1_train/temp.lst > data/ voxceleb1_train/spk2utt

格式分别为:

utt2spk: id0001-1zcIwhmdeo4-00001 id0001
spk2utt: id0001 id0001-1zcIwhmdeo4-00001

至此,就生成 Voxceleb1 训练集的三个映射文件。但是此时的三个文件的顺序并不是有序的,因此需要对文件夹进行过滤和筛选,利用命令完成

sh subtools/kaldi/utils/fix_data_dir.sh data/ voxceleb1_train

特别地,对于 Voxceleb 数据集,subtools 集成了 perl 语言的脚本用于生成上述三个映射文件,脚本存放于 subtools/recipe/voxceleb/prepare 中,还是以Voxceleb1 数据存放于/data1/voxceleb1 中为例,构建训练集只需执行命令:

subtools/recipe/voxceleb/prepare/make_voxceleb1_v2.pl /data1/voxceleb1/dev
dev data/voxceleb1_train

而对于测试集,同样执行一下命令,就能完成映射文件的生成以及测试列表trials。

subtools/recipe/voxceleb/prepare/make_voxceleb1_v2.pl /data1/voxceleb1/test
test data/voxceleb1_test

特征提取

下面将利用Alize+SPro进行简单的GMM-Based的说话人识别的基本流程总结如下:

1.Features extraction 特征提取
sfbcep.exe(MFCC)或slpcep.exe(LPCC)
这里两个可执行文件 可以使用ASV-Subtools工具去特征提取
根据官方给出的 四个例子,先将第一个例子跑起来,再研究第三方的代码,可能官方的已经满足需求了呢。。。

2.Silence removal 静音检测和去除
NormFeat.exe 先能量规整
EnergyDetector.exe 基于能量检测的静音去除

3.Features Normalization 特征规整
NormFeat.exe 再使用这个工具进行特征规整

4.World model training
TrainWorld.exe 训练UBM

5.Target model training
TrainTarget.exe 在训练好UBM的基础上训练training set的GMM

6.Testing
ComputeTest.exe 将testing set在training set的GMM上进行测试和打分

7.Score Normalization
ComputeNorm.exe 将得分进行规整

  1. Compute EER 计算等错误率
    你可以查查计算EER的matlab代码,NIST SRE的官网上有下载DETware_v2.1.tar.gz 。_
posted @ 2024-03-21 10:53  8848-自律即自由  阅读(61)  评论(0编辑  收藏  举报