speechbrain.processing.PLDA_LDA 模块

一个流行的说话人识别/分割模型(LDA和PLDA)。

Authors
  • 安东尼·拉谢尔 2020

  • 纳曼·达瓦拉塔巴德 2020

Relevant Papers
  • 这个PLDA的实现基于以下论文。

  • PLDA model Training
    • 叶江等人,“在I-Vector和Supervector空间中的PLDA建模用于说话人验证,”在Interspeech,2012年。

    • Patrick Kenny 等人,“使用任意时长的语音进行说话人验证的PLDA,” 在ICASSP, 2013。

  • PLDA scoring (fast scoring)
    • Daniel Garcia-Romero 等人,“在说话人识别系统中对i-向量长度归一化的分析”,发表于Interspeech,2011年。

    • Weiwei-LIN 等人,“使用不确定性传播的PLDA快速评分,”发表于Odyssey,2016年。

    • Kong Aik Lee 等人,“用于部分开放集说话人检测的多会话 PLDA 评分 I-vector”,发表于 Interspeech 2013。

Credits

此代码改编自:https://projets-lium.univ-lemans.fr/sidekit/

摘要

类:

LDA

一个用于执行线性判别分析的类。

Ndx

一个编码试验索引信息的类。

PLDA

一个用于从嵌入中训练PLDA模型的类。

Scores

用于存储试验得分的类。

StatObject_SB

用于PLDA类的实用类,用于统计计算。

函数:

diff

列表之间的差异。

fa_model_loop

用于PLDA估计的函数。

fast_PLDA_scoring

计算两组向量之间的PLDA分数。

ismember

检查list1中的元素是否包含在list2中。

参考

class speechbrain.processing.PLDA_LDA.StatObject_SB(modelset=None, segset=None, start=None, stop=None, stat0=None, stat1=None)[source]

基础类:object

用于统计计算的PLDA类的实用工具类。

这也用于将深度嵌入和元信息打包在一个对象中。

Parameters:
  • modelset (list) – 每个会话的模型ID列表,作为字符串数组。

  • segset (list) – 会话ID列表,作为字符串数组。

  • 开始 (int) – 片段的第一帧的索引。

  • stop (int) – 片段的最后一帧的索引。

  • stat0 (torch.Tensor) – 一个float64类型的ndarray。每一行包含来自相应会话的0阶统计量。

  • stat1 (torch.Tensor) – 一个 float64 类型的 ndarray。每一行包含来自相应会话的 1 阶统计量。

save_stat_object(filename)[source]

以pickle格式保存统计信息。

Parameters:

文件名 (路径) – pickle文件将存储的路径。

get_model_segsets(mod_id)[source]

返回给定模型的分段。

Parameters:

mod_id (str) – 将返回其分段的模型的ID。

Return type:

get_model_start(mod_id)[source]

返回给定模型的段的开始。

Parameters:

mod_id (str) – 将返回其开始的模型的ID。

Return type:

段落的开始

get_model_stop(mod_id)[source]

返回给定模型的段停止。

Parameters:

mod_id (str) – 将返回停止的模型的ID。

Return type:

段落的停止

get_mean_stat1()[source]

返回一阶统计量的均值。

get_total_covariance_stat1()[source]

计算并返回一阶统计量的总协方差矩阵。

get_model_stat0(mod_id)[source]

返回给定模型的零阶统计量

Parameters:

mod_id (str) – 将返回stat0的模型ID。

Return type:

零阶统计量。

get_model_stat1(mod_id)[source]

返回给定模型的一阶统计量。

Parameters:

mod_id (str) – 将返回stat1的模型ID。

Return type:

一阶统计量。

sum_stat_per_model()[source]

对每个模型的零阶和一阶统计量求和,并将它们存储在新的StatObject_SB中。

Returns:

  • 一个StatObject_SB对象,包含每个模型的统计总和

  • 以及一个包含session_per_model的numpy数组。

center_stat1(mu)[source]

中心一阶统计量。

Parameters:

mu (数组) – 要居中的数组。

norm_stat1()[source]

将所有一阶统计量除以其欧几里得范数。

rotate_stat1(R)[source]

通过右乘旋转一阶统计量。

Parameters:

R (ndarray) – 用于一阶统计量右乘的矩阵。

whiten_stat1(mu, sigma, isSqrInvSigma=False)[source]

白化一阶统计量 如果 sigma.ndim == 1,则为对角协方差的情况。 如果 sigma.ndim == 2,则为具有完整协方差的单个高斯分布的情况。 如果 sigma.ndim == 3,则为完整协方差UBM的情况。

Parameters:
  • mu (数组) – 要从统计量中减去的均值向量。

  • sigma (narray) – 协方差矩阵或协方差超向量。

  • isSqrInvSigma (bool) – 如果输入的Sigma矩阵是协方差矩阵的平方根的逆矩阵,则为True。

align_models(model_list)[source]
Align models of the current StatServer to match a list of models

作为输入参数提供。StatServer的大小可能会被减少以匹配输入的模型列表。

Parameters:

model_list (ndarray of strings) – 要匹配的模型列表。

align_segments(segment_list)[source]
Align segments of the current StatServer to match a list of segment

作为输入参数提供。StatServer的大小可能会减少以匹配输入的段列表。

Parameters:

segment_list (ndarray of strings) – 要匹配的段列表

get_lda_matrix_stat1(rank)[source]
Compute and return the Linear Discriminant Analysis matrix

在一阶统计量上。LDA矩阵的列按照对应的特征值降序排列。

Parameters:

rank (int) – 返回的LDA矩阵的秩。

Returns:

L

Return type:

矩阵

speechbrain.processing.PLDA_LDA.diff(list1, list2)[source]

列表之间的差异。

speechbrain.processing.PLDA_LDA.ismember(list1, list2)[source]

检查list1中的元素是否包含在list2中。

class speechbrain.processing.PLDA_LDA.Ndx(ndx_file_name='', models=array([], dtype=float64), testsegs=array([], dtype=float64))[source]

基础类:object

一个编码试验索引信息的类。它包含一个模型名称列表和一个测试段名称列表,以及一个指示模型和测试段哪些组合是感兴趣的试验的矩阵。

Parameters:
  • ndx_file_name (str) – 要加载的文件名。

  • 模型 (列表) – ndarray 中的唯一模型列表。

  • testsegs (list) – ndarray中的唯一测试段列表。

save_ndx_object(output_file_name)[source]

以pickle格式保存对象

filter(modlist, seglist, keep)[source]

移除Ndx中的一些信息。用于从合并性别的Ndx创建特定性别的Ndx。根据‘keep’的值,两个输入列表指示要保留的字符串或要丢弃的字符串。

Parameters:
  • modlist (array) – 一个字符串的单元格数组,将与‘inNdx’的模型集进行比较。

  • seglist (数组) – 一个字符串的单元格数组,将与‘inNdx’的segset进行比较。

  • keep (bool) – 表示modlist和seglist是要保留还是丢弃的模型。

Returns:

outNdx

Return type:

Ndx

validate()[source]

检查类型为Ndx的对象是否遵守必须始终为真的某些规则。返回一个布尔值,指示对象是否有效。

class speechbrain.processing.PLDA_LDA.Scores(scores_file_name='')[source]

基础类:object

一个用于存储试验分数的类。modelset和segset字段分别是模型和测试段名称的列表。scoremat和scoremask的元素i,j对应于涉及模型i和测试段j的试验。

Parameters:

scores_file_name (str) –

包含以下字段的HDF5文件的名称

modelsetlist

ndarray中的唯一模型列表。

segsetlist

ndarray中的唯一测试段列表。

scoremask2d ndarray of bool

指示感兴趣的试验,即如果scoremask[i,j]为false,则应忽略scoremat中的条目i,j。

scoremat2d ndarray

分数矩阵。

speechbrain.processing.PLDA_LDA.fa_model_loop(batch_start, mini_batch_indices, factor_analyser, stat0, stat1, e_h, e_hh)[source]

用于PLDA估计的函数。

Parameters:
  • batch_start (int) – 列表中的起始索引。

  • mini_batch_indices (list) – 列表中元素的索引(应从零开始)。

  • factor_analyser (instance of PLDA class) – PLDA 类对象。

  • stat0 (torch.Tensor) – 零阶统计量的矩阵。

  • stat1 (torch.Tensor) – 一阶统计量的矩阵。

  • e_h (torch.Tensor) – 一个累加器矩阵。

  • e_hh (torch.Tensor) – 一个累加器矩阵。

speechbrain.processing.PLDA_LDA.fast_PLDA_scoring(enroll, test, ndx, mu, F, Sigma, p_known=0.0, scaling_factor=1.0, check_missing=True)[source]

计算两组向量之间的PLDA分数。要执行的试验列表在Ndx对象中给出。PLDA矩阵必须预先计算。假设i-vectors/x-vectors已经进行了白化处理。

Parameters:
  • enroll (speechbrain.utils.Xvector_PLDA_sp.StatObject_SB) – 一个StatServer,其中stat1是xvectors。

  • test (speechbrain.utils.Xvector_PLDA_sp.StatObject_SB) – 一个StatServer,其中stat1是xvectors。

  • ndx (speechbrain.utils.Xvector_PLDA_sp.Ndx) – 一个Ndx对象,定义了要执行的试验列表。

  • mu (double) – PLDA 高斯分布的均值向量。

  • F (torch.Tensor) – PLDA的类间协方差矩阵。

  • Sigma (torch.Tensor) – 残差协方差矩阵。

  • p_known (float) – 在开放集识别情况下,已知说话者的概率(验证任务中为1,封闭集情况下为0)。

  • scaling_factor (float) – 用于乘以统计数据的因子。

  • check_missing (bool) – 如果为True,检查所有模型和段是否存在。

Returns:

分数

Return type:

Scores

class speechbrain.processing.PLDA_LDA.LDA[source]

基础类:object

一个用于执行线性判别分析的类。

它根据LDA返回低维表示。

do_lda(stat_server=None, reduced_dim=2, transform_mat=None)[source]

执行LDA并将向量投影到低维空间。

Parameters:
  • stat_server (object of speechbrain.processing.PLDA_LDA.StatObject_SB.) – 包含执行LDA所需的向量和元信息。

  • reduced_dim (int) – 降维后的空间维度。

  • transform_mat (matrix) – 变换矩阵。

Returns:

new_train_obj

Return type:

speechbrain.processing.PLDA_LDA.StatObject_SB

class speechbrain.processing.PLDA_LDA.PLDA(mean=None, F=None, Sigma=None, rank_f=100, nb_iter=10, scaling_factor=1.0)[source]

基础类:object

一个用于从嵌入中训练PLDA模型的类。

输入是speechbrain.utils.StatObject_SB格式。 训练一个简化的PLDA模型,没有类内协方差矩阵,但有完整的残差协方差矩阵。

Parameters:
  • mean (torch.Tensor) – 向量的均值。

  • F (torch.Tensor) – 特征语音矩阵。

  • Sigma (torch.Tensor) – 残差矩阵。

  • rank_f (int) – 排名(默认值为100)。

  • nb_iter (int) – 迭代次数(默认值为10)。

  • scaling_factor (int) – 用于缩放统计数据的因子(默认值为1.0)。

Example

>>> from speechbrain.processing.PLDA_LDA import *
>>> import random, numpy
>>> dim, N = 10, 100
>>> n_spkrs = 10
>>> train_xv = numpy.random.rand(N, dim)
>>> md = ['md'+str(random.randrange(1,n_spkrs,1)) for i in range(N)]
>>> modelset = numpy.array(md, dtype="|O")
>>> sg = ['sg'+str(i) for i in range(N)]
>>> segset = numpy.array(sg, dtype="|O")
>>> s = numpy.array([None] * N)
>>> stat0 = numpy.array([[1.0]]* N)
>>> xvectors_stat = StatObject_SB(modelset=modelset, segset=segset, start=s, stop=s, stat0=stat0, stat1=train_xv)
>>> # Training PLDA model: M ~ (mean, F, Sigma)
>>> plda = PLDA(rank_f=5)
>>> plda.plda(xvectors_stat)
>>> print (plda.mean.shape)
(10,)
>>> print (plda.F.shape)
(10, 5)
>>> print (plda.Sigma.shape)
(10, 10)
>>> # Enrollment (20 utts), Test (30 utts)
>>> en_N = 20
>>> en_xv = numpy.random.rand(en_N, dim)
>>> en_sgs = ['en'+str(i) for i in range(en_N)]
>>> en_sets = numpy.array(en_sgs, dtype="|O")
>>> en_s = numpy.array([None] * en_N)
>>> en_stat0 = numpy.array([[1.0]]* en_N)
>>> en_stat = StatObject_SB(modelset=en_sets, segset=en_sets, start=en_s, stop=en_s, stat0=en_stat0, stat1=en_xv)
>>> te_N = 30
>>> te_xv = numpy.random.rand(te_N, dim)
>>> te_sgs = ['te'+str(i) for i in range(te_N)]
>>> te_sets = numpy.array(te_sgs, dtype="|O")
>>> te_s = numpy.array([None] * te_N)
>>> te_stat0 = numpy.array([[1.0]]* te_N)
>>> te_stat = StatObject_SB(modelset=te_sets, segset=te_sets, start=te_s, stop=te_s, stat0=te_stat0, stat1=te_xv)
>>> ndx = Ndx(models=en_sets, testsegs=te_sets)
>>> # PLDA Scoring
>>> scores_plda = fast_PLDA_scoring(en_stat, te_stat, ndx, plda.mean, plda.F, plda.Sigma)
>>> print (scores_plda.scoremat.shape)
(20, 30)
plda(stat_server=None, output_file_name=None, whiten=False, w_stat_server=None)[source]

训练PLDA模型,不使用类内协方差矩阵,但使用完整的残差协方差矩阵。

Parameters: