Kaldi说话人识别:基于x-vector 的plda自适应

语音学习-kaldi在虚拟机上的安装详解 kaldi在Linux上安装与编译 (经过自己慢慢的摸索,终于在虚拟机上把kaldi给装好了,并运行了最简单的yesno,这个过程自己一个人弄还是收获挺多的) 首先安装kaldi需要准备的环境 1,装好Vmware Workstation, 2,在VM上创建一个新的虚拟机 3,虚拟机的创建记得把硬盘容量设大点(50G以上) 在上面的环境准备好之后,就可以在虚拟机上安装Kladi了 开启虚拟机,开启... 阅读详情

1. 自适应

做了说话人识别,就一直就一些疑问:

什么是 (领域)自适应(domain adaption)?它跟 迁移学习(Transfer Learning) 有什么区别?

做自适应最终的效果能到什么程度?

PLDA是什么?跟自适应的关系是什么?

作用

自适应的作用是,补偿实际数据与已经训练的三音素模型中声学条件不匹配的问题,包括说话人特性(说话方式、口音等)及环境特性(如录音设备、房间混响等)。

方法

(1)传统模型的自适应方法
在GMM-HMM模型中,自适应方法有特征空间变换和模型空间变换。Kaldi中主要采用的是特征空间变换方法(记住这个名称,后面会有解释): LDA、MLLT和fMLLR,其本质都是在训练过程中估计变换矩阵,然后构造变换后的特征,再迭代训练新的声学模型参数。

LDA+MLLT针对环境特性,拼接上下文多帧数据,再通过特征变换进行降维处理,因为与说话人无关,所以估计的是全局矩阵。
fMLLR针对说话人特性,基于每个说话人或每个utterance进行变换矩阵估计。

(2)深度神经网络的自适应方法
在DNN-HMM模型中,由于DNN的鉴别特性,GMM下的自适应方法不能直接拿来用,DNN下的自适应方法主要有线性变换、正则项法、子空间法(i-vector)。

迁移学习和自适应

简单粗暴的来说,自适应就是一种迁移学习的方法。
那如何理解自适应的本质?之前提到的”特征空间变换“又是什么意思?

在这里插入图片描述领域自适应是迁移学习原先就有的概念,在研究源域和目标域时,基于某一特征,会发现两个域的数据分布差别很大。

假设要选择某一区域的颜色信息作为图像特征,上图红线表示source dataset的颜色信息值分布,蓝线表示target dataset的颜色信息值分布,很明显对于这一特征来讲,两个域的数据本来就是有shift的。而这个shift导致我们evaluate这个模型的时候准确率会大大降低,那么这个区域的颜色信息就不适合选择特征。

既然这个特征不合适,那我们就换特征。领域自适应旨在利用各种的feature transformation手段,学习一个域间不变的特征表达,基于这一特征,我们就可以更好的同时对两个域的数据进行分类了。

2. PLDA 自适应

PLDA

PLDA(Probabilistic Linear Discriminant Analysis)是一种信道补偿算法,号称概率形式的LDA算法,PLDA算法的信道补偿能力比LDA更好,已经成为目前最好的信道补偿算法。

建模

定义第i个说话人的第 j j j条语音为 x x xij,然后定义 x x xij的生成模型为:

x i j = μ + F h i + G w i j + ϵ i j x_{i j}=\mu+F h_{i}+G w_{i j}+\epsilon_{i j} xij​=μ+Fhi​+Gwij​+ϵij​

模型分为两个部分:

  1. 信号部分: μ + F h i \mu+F h_{i} μ+Fhi​,只与说话人身份有关,该项描述了个体之间的差异。
  2. 噪声部分: G w i j + ϵ i j G w_{i j}+\epsilon_{i j} Gwij​+ϵij​,同一个人每次说话也会有差异,描述了个体内部的差异。
  • μ \mu μ是全体训练数据的平均值;
  • F F F可以看做是身份空间,包含了可以用来表示各种身份的基底;
  • h i h_i hi​就可以看做是一个人的身份(或者是人物在身份空间中的位置);
  • G可以看做是误差空间,包含了可以用来表示同一身份不同变化的基底;
  • w i j w_{ij} wij​表示的是在误差空间中的位置;
  • ϵ i j \epsilon_{i j} ϵij​ 用来表示随机误差,该项为零均高斯分布,方差为 Σ。

由于我们只关心区分说话人,所以并不需要计算误差空间,所以可以把噪声部分的两项合并,则得到:
X i j = μ + F h i + ϵ i j X_{i j}=\mu+F h_{i}+\epsilon_{i j} Xij​=μ+Fhi​+ϵij​,其中 ϵ \epsilon ϵ~N(0, Σ), h i h_i hi​~N(0,1)。

我们注意到等号右边的中间两项分别是一个矩阵和一个向量的表示形式,这便是因子分析的又一核心部分。这两个矩阵F和G包含了各自假想变量空间中的基本因子,这些因子可以看做是各自空间的特征向量。比如,F的每一列就相当于类间空间的特征向量,G的每一列相当于类内空间的特征向量。而两个向量可以看做是分别在各自空间的特征表示,比如hi就可以看做是Xij在说话人空间中的特征表示。在识别打分阶段,如果两条语音的hi特征相同的似然度越大,那么这两条语音就更确定地属于同一个说话人。

训练

训练PLDA模型,就是通过训练数据估计出参数 ϕ \phi ϕ和 Σ Σ Σ。估计这两个参数的方法是经典EM算法迭代求解,即猜(E-step)-反思(M-step),重复。

实际上,在 Kaldi 中一般是用训练集的 ivector 来训练PLDA模型,再用于最后的打分。
(以ivector方法为例:训练集音频——mfcc特征——训练 UBM 和 ivector extractor——提取ivector特征——PLDA打分)

测试

在测试阶段,我们不再像LDA那样去基于consine距离来计算得分,而是去计算两条语音是否由说话人空间中的特征hi生成,或者由hi生成的似然程度,而不用去管类内空间的差异。在这里,我们使用对数似然比来计算得分。如下图所示:

在这里插入图片描述

n1和n2分别是两个语音的x-vector(或i-vector)矢量,这两条语音来自同一空间的假设为Hs,来自不同的空间的假设为Hd。

其中 p ( n 1 , n 2 ∣ h s ) p(n1, n2 | hs) p(n1,n2∣hs)为两条语音来自同一空间的似然函数;

p ( n 1 ∣ h d ) p(n1 | hd) p(n1∣hd), p ( n 2 ∣ h d ) p(n2 | hd) p(n2∣hd)分别为 n 1 n1 n1和 n 2 n2 n2来子不同空间的似然函数。通过计算对数似然比,就能衡量两条语音的相似程度。

得分越高,两条语音属于同一说话人的可能性越大。

具体的PLDA得分计算也有不同的实现。

Kladi中的源码解读

Plda的自适应类:

/*
  This class takes unlabeled iVectors from the domain of interest and uses their
  mean and variance to adapt your PLDA matrices to a new domain.  
  This class also stores stats for this form of adaptation.  
*/

翻译:
这个类,从感兴趣的domain中读取未标记的ivector,用他们的均值和方差调整PLDA矩阵,转换为新的
domain,这个类同时会保存这个自适应的形式


class PldaUnsupervisedAdaptor {
 public:
  PldaUnsupervisedAdaptor(): tot_weight_(0.0) { }
  // Add stats to this class.  Normally the weight will be 1.0.
  void AddStats(double weight, const Vector<double> &ivector);
  void AddStats(double weight, const Vector<float> &ivector);
  void UpdatePlda(const PldaUnsupervisedAdaptorConfig &config,
                  Plda *plda) const;
 private:

  double tot_weight_;
  Vector<double> mean_stats_;
  SpMatrix<double> variance_stats_;
};

需要注意的是,如果数据质量不行或者数据量不足,很可能会使得最后的识别效果变差!

参考自:kaldi声纹识别plda源码阅读(二)

更多请点击:关于PLDA在kaldi中的基础知识和代码完整版

参考:

  1. 声纹识别X-Vector
  2. 迁移学习和领域自适应
  3. Kaldi脚本分析(5)——自适应方法
  4. 基于kaldi的声纹识别
  5. Kaldi 中的声纹识别
  6. kaldi声纹识别plda源码阅读(二)

更多阅读:
清微智能SRE19大赛两项全球前十 算法团队技术分享

声纹识别中PLDA的域自适应的通用框架

两个vector比较_[论文品读]·d-vector解读 Deep Neural Networks for Small Footprint Text-Dependent Speaker Verification目录ABSTRACT1. INTRODUCTION2. PREVIOUS WORK3. DNN FOR SPEAKER VERIFICATION3.1. DNN as a feature extractor3.2. Enrollment and e... 阅读详情

相关推荐

声纹识别知识整理

一、算法总览 1. 最早的GMM-UBM i-vector 利用GMM高斯混合模型提取特征i-vector;克服训练数据不多的情况,引入UBM;将语音分为说话人空间和环境空间,解决环境带来的信道,PLDA实现信道补偿,将提取的i-vector更加纯粹。 当然,获取i-vector的方法不仅仅局限在高斯混合模型,利用一起其它的机器学习方法进行补充一样可以,甚至是DNN提取的特征。 2. DNN DN...

James_bobo的博客 1万+

声纹识别之PLDA算法描述

之前我写过《我对说话人识别/声纹识别的研究综述》,本篇基本上可以是这个综述的续写。其实,写的也没有什么深度,想获得深度信息的朋友们可以不用往下看了,还不如下载几篇领域内的国内博士论文看看。为什么是国内呢?因为国内博士论文前面的综述写的还不错,嘿嘿~我写这个主要是给不熟悉这个领域内的朋友看的,用通熟的话描述这个领域内重要的一些算法,等于是入个门吧。PLDA算法前面博客已经提到过声纹识别的信道补偿算法,

njustzj001的专栏 3万+

Python说话人识别实战:从GMM到深度学习的完整落地路径

说话人识别(声纹识别)是语音技术中的重要分支,其核心是从语音信号中提取能区分说话人身份的特征。传统方法以GMM(高斯混合模型)为基础,通过概率分布建模每个说话人的声学特性,随后发展出GMM-UBM和i-vector,将语音压缩为固定维度向量,并结合LDA、PLDA等后端进行信道补偿。深度学习的引入则进一步提升了特征表达力,通过神经网络提取embedding向量,并借助度量学习损失在短语音场景下取得更优的识别率。从技术演进看,从GMM到i-vector再到深度embedding,每一步都对应着数据量、算力与场

weixin_34195364的博客 388

关于PLDA在kaldi中的基础知识和代码完整版

理论基础知识 LDA用来提取线性特征,这种特征的目标在于最大化between-class separation以及最小化within-class sepration。LDA可以给训练数据拟合一个高斯混合模型:用x表示observable sample,用y表示the latent variable,则类条件概率可以表示为   这种混合模型只能表示有限的K类,如果想拓...

weixin_38858860的博客 3557

PLDA:这是kaldi-plda的实现

PLDA模型 这是使用Numpy的PLDA-kaldi的实现。

Superpowers:可编程AI协作协议与Skill工程化实践

AI编程正从提示词驱动迈向工程化协作新范式。Superpowers并非传统代码补全工具,而是一套定义清晰、可版本控制、可调试复用的AI协作协议——它将AI能力抽象为带输入校验、执行管道、输出契约和元数据声明的Skill(类DSL构件),再通过状态驱动的Workflow编排实现跨平台、可熔断、含人工Checkpoint的自动化流水线。其核心价值在于解决AI生成代码长期存在的不可复现、不可审计、不可交接三大痛点,支撑OpenAPI转TS、Figma转Vue等高复用场景落地。本文深入解析Skill设计四重契约与P

weixin_31124163的博客 376

声纹识别X-Vector

声纹识别X-Vector 草祭 收录于 编程-ღ-技术 2020-01-02 约 2646 字 预计阅读 6 分钟 次阅读 目录 背景 声纹识别上x-vector被作为很多赛事的baseline使用,包括aishell2018、ASVspoof2019。介绍x-vector的文章主要有[1] [2]两篇,[1]介绍x-vector的整体和细节部分,[2]对实验进行了补充分析。 Prerequisites: TDNN,embedding。 核心思路 将系统分成两个部分: Em...

4901

《Swin-Unet: 类Unet的纯Transformer架构用于医学图像分割》学习笔记

近年来,卷积神经网络(CNN)在医学图像分析领域取得了重要进展。尤其是基于U形架构和跳跃连接的深度神经网络广泛应用于各种医学图像任务。然而,尽管CNN表现优异,但由于卷积操作的局部性,其难以很好地学习全局和长距离语义信息的交互。在本文中,我们提出了Swin-Unet,一种用于医学图像分割的类Unet纯Transformer模型。被切分为Token的图像块输入到基于Transformer的U形编码器-解码器架构中,通过跳跃连接实现局部和全局语义特征的学习。

学无止境。 5547

使用kaldi中的x-vector在aishell数据库上建立说话人识别系统

使用kaldi中的x-vector在aishell数据库上建立说话人识别系统 写在前面 整个系统可以分为三个部分,第一,前端预处理部分,主要包括mfcc特征提取,VAD,数据扩充(增加混响、增加不同类型的噪声)等;第二,基于TDNN的特征提取器,该结构生成说话人表征,说话人表征也可以被称为embedding、x-vector;第三,后端处理,对于说话人表征,采用LDA进行降维并训练PLDA模型对测试对进行打分。 x-vector的论文发表在ICASSP 2018,kaldi的核心开发者Daniel Pove

qq_27182145的博客 3851

暗月项目七详解

本文围绕“暗月靶场项目七”展开,记录了一次从外网 Web 入口逐步深入内网并最终获取域控目标的完整实训过程。

Re_K123的博客 416

Canoe主要功能的详细介绍

CANoe是德国Vetor公司推出的一款用于总线开发的设备,全程为CAN open environment。后来随着总线技术的发展,CANoe不仅限于CAN类型的总线开发,还包含LIN、FlexRay、MOST和以太网等开发。在车载网络和ECU开发、测试和分析方面,CANoe几乎长期占据着垄断地位,当然是因为其强大的功能性了。目前用这个工具的主要是整车厂和供应商的网络设计工程是、开发工程师和测试工程师。小编当时安装CANoe的时候也是花了一定的时间和精力,好在没有崩溃。

车载测试 3722

kaldi 声纹识别系统(2)代码解读:基于x-vector

Kaldi 脚本0. 预备知识:常用术语0.1 文件0.2 脚本名称和文件夹名run.pl1. 前端提取1.1 流控制脚本1.2 具体执行的脚本1.3 中间量2. 后端识别2.1 流程控制脚本plda-scoring.sh2.2 具体执行的脚本ivector-compute-pldaivector-plda-scoring计算对数似然比(LLR) 主要用来明确kaldi声纹识别的具体流程,以及各个脚本背后源码的思路。 0. 预备知识:常用术语 0.1 文件 .ark:archive,记录实际数据的表格(t

Robin_Pi的博客 2191

AI变现案例实战系列4:AI数字员工团队——用OpenClaw搭建6个智能体,自动运营你的赚钱系统

摘要:谷歌AI产品经理Shubham Saboo利用OpenClaw搭建6人AI团队,实现内容创作、技术开发等任务自动化,每月成本不足400美元。文章对比阿里云和Windows本地两种部署方案,提供详细配置指南。通过多Agent架构实现物理隔离与精准协作,可创建6个专业AI角色(如研究员、运营、工程师等),每个Agent专注单一任务,避免记忆负担和上下文污染问题。阿里云方案适合长期稳定运行,Windows本地部署则适合零成本测试。最终可组建高效AI团队,实现7x24小时无人值守运营。(149字)

小明的博客 1141

【kaldi】声纹识别之X-vector

一.搞了几天,首先说一下X-vector的优势: 1.训练速度非常快 2.无需特定语种的训练集,由于设置一个embedding层进行提取特征直接进行plda打分 3.识别率不错 二.Kaldi中有现成的例子,可供研究 https://github.com/kaldi-asr/kaldi/tree/master/egs/sre16/v2 https://github.com/kaldi-...

初级菜鸟 1万+

让 VK31 的条件维护树长出你想要的分支:用 ABAP SE43 扩展定价 Area Menu COND_AV

摘要:本文深入解析了SAP系统中价格条件维护(VK31/VK32)的菜单结构优化方法。通过分析Area Menu(COND_AV)的三层架构(菜单对象、节点、报表),提出将业务语言融入菜单设计的解决方案。重点介绍了使用SE43事务码扩展标准菜单的具体步骤:创建Enhancement ID、新增业务节点、挂接定价报表,并强调需同步验证条件表映射关系。文章还提供了常见问题排查思路,建议从岗位视角重构菜单结构,最终实现高效、精准且符合业务语义的价格维护入口体系。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 87

[QMT量化交易小白入门]-九、如何用Python记录每一笔交易和调试,报错信息?

定义一个函数来获取日志记录器。: 返回全局的日志记录器,以便在其他地方调用。

木头大左的博客 2143

从说话人识别demo开始学习kaldi--(6)训练UBM和PLDA

sid/train_diag_ubm.sh --cmd “$train_cmd” --num-threads 16 data/dev 1024 exp/diag_ubm_1024 现在我们使用dev的数据来训练一个对角ubm 除了必要的参数设置,data/dev文件夹下面一定要有的是feats.scp,vad.scp 最后生成的是一个exp/diag_ubm_1024/final.dubm 下面是...

Grace_yan的博客 3963

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

说话人识别python_基于各种分类算法的说话人识别(年龄段识别)

基于各种分类算法的语音分类(年龄段识别)概述实习期间作为帮手打杂进行了一段时间的语音识别研究,内容是基于各种分类算法的语音的年龄段识别,总结一下大致框架,基本思想是:获取语料库TIMIT提取数据特征,进行处理MFCC/i-vectorLDA/PLDA/PCA语料提取,基于分类算法进行分类SVM/SVR/GMM/GBDT...用到的工具有HTK(C,shell)/Kaldi(C++,shell)/L...

weixin_39673184的博客 2040

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Kaldi 声纹识别·总章

Kaldi 声纹识别·总章理论代码 主要记录自己的学习笔记。 理论 代码 Kaldi 实战学习(1)说话人识别小例子(egs/aishell/v1)

Robin_Pi的博客 830

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

kaldi 声纹识别·资源汇总

kaldi 基础 kaldi 使用样例表 kaldi 实战 语音识别从入门到放弃 Kaldi 中的声纹识别

Robin_Pi的博客 1094

用于说话人验证与说话人日志的通道对抗训练

以往的研究通过对抗性地分类生成特征所属的数据集或标注环境,以鼓励深度说话人嵌入具有域不变性。本文提出一种训练策略,旨在使特征在录音或通道粒度上保持不变——这一目标比数据集或环境不变性更为精细。。通过这种方式,所学特征将被抑制利用可能具有说话人判别性的通道信息。在VoxCeleb上的验证实验以及在CALLHOME上的日志与验证实验均表明,该方法相较于强基线模型取得了显著提升,并优于基于数据集的对抗模型。

qq_41627642的博客 727

说话人识别/声纹识别学习路径的资料整理,从零学声纹识别

转载自:https://blog.youkuaiyun.com/robingao1994/article/details/82659005 ...

罗小黑嘛 616

Kaldi学习笔记:01(kaldi/egs/sitw/v1)run.sh解析

kaldi学习笔记-01-sitw简介脚本修改run.sh 简介 研究生阶段入坑了说话人识别方向,最近在学习如何使用Kaldi提取i-vector进行说话人识别,在这里记录一下学习的笔记。 这次实验使用的是kaldi中的示例程序,位于egs/sitw/v1中,使用的数据集分别有SITW,VoxCeleb1,VoxCeleb2以及数据增强用的混音数据集RIR_NOISES、MUSAN。脚本使用Vox...

qijiajun97的博客 3519

kaldi 声纹识别系统(1)原理解析:基于x-vector

基于x-vector 的声纹识别系统框架细节 目的:结合之前的理论,梳理出一个完整的样例(基于x-vector) 框架 细节

Robin_Pi的博客 1251

Kaldi AISHELL V1 声纹识别过程记录

前言 因为科研项目需要用到声纹识别,有小伙伴说先跑通kaldi中的aishell v1,就能对声纹识别有一个大致的了解,本小白在Linux和C++基础薄弱的情况下,边看其中的run.sh以及其引用的脚本,再加上其他小伙伴的总结和相关理论知识,用两个月时间理清了整个流程(战线有点长,但其实还有很多细节不明白,都怪C++看不懂,一定恶补!!!) 1 下载和解压数据 1.1 代码&详解 15 d...

weixin_44059142的博客 1317
上一篇: linux 迁移数据:将数据转移至新盘
下一篇: Linux nvidia 报错(1):nvidia-smi: command not found
Robin_Pi
博客等级 码龄9年 2万+粉丝 632原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值