speechbrain.processing.PLDA_LDA 模块

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

作者
  • Anthony Larcher 2020

  • Nauman Dawalatabad 2020

相关论文
  • 此 PLDA 实现基于以下论文。

  • PLDA 模型训练
    • Ye Jiang 等,“PLDA Modeling in I-Vector and Supervector Space for Speaker Verification”,Interspeech,2012 年。

    • Patrick Kenny 等,“PLDA for speaker verification with utterances of arbitrary duration”,ICASSP,2013 年。

  • PLDA 评分(快速评分)
    • Daniel Garcia-Romero 等,“Analysis of i-vector length normalization in speaker recognition systems”,Interspeech,2011 年。

    • Weiwei-LIN 等,“Fast Scoring for PLDA with Uncertainty Propagation”,Odyssey,2016 年。

    • Kong Aik Lee 等,“Multi-session PLDA Scoring of I-vector for Partially Open-Set Speaker Detection”,Interspeech 2013 年。

致谢

此代码改编自: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]

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

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

参数:

modelset (list) – 每个 session 的模型 ID 列表,作为字符串数组。
  • segset (list) – session ID 列表,作为字符串数组。

  • start (int) – 片段的第一个帧的索引。

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

  • stat0 (torch.Tensor) – 一个 float64 的 ndarray。每行包含对应 session 的 0 阶统计信息。

  • stat1 (torch.Tensor) – 一个 float64 的 ndarray。每行包含对应 session 的 1 阶统计信息。

  • save_stat_object(filename)[source]

以 pickle 格式保存统计信息。

filename (path) – pickle 文件存储路径。

modelset (list) – 每个 session 的模型 ID 列表,作为字符串数组。

get_model_segsets(mod_id)[source]

返回给定模型的片段。

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

modelset (list) – 每个 session 的模型 ID 列表,作为字符串数组。

返回类型:

segments

get_model_start(mod_id)[source]

返回给定模型的片段起始帧索引。

mod_id (str) – 将返回起始帧索引的模型的 ID。

modelset (list) – 每个 session 的模型 ID 列表,作为字符串数组。

片段起始帧索引

segments

get_model_stop(mod_id)[source]

返回给定模型的片段结束帧索引。

mod_id (str) – 将返回结束帧索引的模型的 ID。

modelset (list) – 每个 session 的模型 ID 列表,作为字符串数组。

片段结束帧索引

segments

get_mean_stat1()[source]

返回一阶统计信息的均值。

get_total_covariance_stat1()[source]

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

get_model_stat0(mod_id)[source]

返回给定模型的零阶统计信息

mod_id (str) – 将返回零阶统计信息的模型的 ID。

modelset (list) – 每个 session 的模型 ID 列表,作为字符串数组。

零阶统计信息。

segments

get_model_stat1(mod_id)[source]

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

mod_id (str) – 将返回一阶统计信息的模型的 ID。

modelset (list) – 每个 session 的模型 ID 列表,作为字符串数组。

一阶统计信息。

segments

sum_stat_per_model()[source]

按模型汇总零阶和一阶统计信息,并将其存储在新的 StatObject_SB 中。

返回:

一个 StatObject_SB 对象,其中按模型汇总了统计信息

  • 以及一个包含每个模型 session 数的 numpy 数组。

  • center_stat1(mu)[source]

居中一阶统计信息。

mu (array) – 用于居中的数组。

modelset (list) – 每个 session 的模型 ID 列表,作为字符串数组。

norm_stat1()[source]

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

rotate_stat1(R)[source]

通过右乘旋转一阶统计信息。

R (ndarray) – 用于对一阶统计信息进行右乘的矩阵。

modelset (list) – 每个 session 的模型 ID 列表,作为字符串数组。

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

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

mu (array) – 需要从统计信息中减去的均值向量。

modelset (list) – 每个 session 的模型 ID 列表,作为字符串数组。
  • sigma (narray) – 协方差矩阵或协方差超向量。

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

  • align_models(model_list)[source]

对齐当前 StatServer 的模型以匹配
输入参数提供的模型列表。 StatServer 的大小可能会减小以匹配输入的模型列表。

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

modelset (list) – 每个 session 的模型 ID 列表,作为字符串数组。

align_segments(segment_list)[source]

对齐当前 StatServer 的片段以匹配输入参数提供的片段列表。
StatServer 的大小可能会减小以匹配输入的片段列表。

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

modelset (list) – 每个 session 的模型 ID 列表,作为字符串数组。

get_lda_matrix_stat1(rank)[source]

计算并返回一阶统计信息的线性判别分析矩阵
LDA 矩阵的列根据对应的特征值按降序排列。

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

modelset (list) – 每个 session 的模型 ID 列表,作为字符串数组。

L

一个 StatObject_SB 对象,其中按模型汇总了统计信息

矩阵

segments

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

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

列表之间的差集。

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

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

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

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

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

modelset (list) – 每个 session 的模型 ID 列表,作为字符串数组。
  • models (list) – ndarray 中的唯一模型列表。

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

  • save_ndx_object(output_file_name)[source]

以 pickle 格式保存对象

filter(modlist, seglist, keep)[source]

移除 Ndx 中的部分信息。对于从汇总性别的 Ndx 创建特定性别的 Ndx 非常有用。根据 'keep' 的值,两个输入列表指示要保留的字符串或要丢弃的字符串。

modlist (array) – 将与 'inNdx' 的 modelset 进行比较的字符串单元格数组。

modelset (list) – 每个 session 的模型 ID 列表,作为字符串数组。
  • seglist (array) – 将与 'inNdx' 的 segset 进行比较的字符串单元格数组。

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

  • outNdx

一个 StatObject_SB 对象,其中按模型汇总了统计信息

validate()[source]

segments

Ndx

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

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

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

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

scores_file_name (str) –

modelset (list) – 每个 session 的模型 ID 列表,作为字符串数组。

包含以下字段的 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]

batch_start (int) – 在列表中开始的索引。

一个用于 PLDA 估计的函数。

modelset (list) – 每个 session 的模型 ID 列表,作为字符串数组。
  • 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-vector/x-vector 在此之前应该已经被白化。

enroll (speechbrain.utils.Xvector_PLDA_sp.StatObject_SB) – StatServer 对象,其 stat1 为 xvector。

modelset (list) – 每个 session 的模型 ID 列表,作为字符串数组。
  • test (speechbrain.utils.Xvector_PLDA_sp.StatObject_SB) – StatServer 对象,其 stat1 为 xvector。

  • 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,则检查所有模型和片段是否存在。

  • scores

一个 StatObject_SB 对象,其中按模型汇总了统计信息

class speechbrain.processing.PLDA_LDA.LDA[source]

segments

Scores

它根据 LDA 返回低维表示。

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

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

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

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

stat_server (object of speechbrain.processing.PLDA_LDA.StatObject_SB.) – 包含向量和元信息以执行 LDA。

modelset (list) – 每个 session 的模型 ID 列表,作为字符串数组。
  • reduced_dim (int) – 缩减空间的维数。

  • transform_mat (matrix) – 变换矩阵。

  • new_train_obj

一个 StatObject_SB 对象,其中按模型汇总了统计信息

speechbrain.processing.PLDA_LDA.StatObject_SB

segments

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

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

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

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

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

modelset (list) – 每个 session 的模型 ID 列表,作为字符串数组。
  • F (torch.Tensor) – 本征向量矩阵。

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

  • rank_f (int) – 秩(默认 100)。

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

  • scaling_factor (int) – 用于缩放统计信息的因子(默认 1.0)。

  • 示例

plda(stat_server=None, output_file_name=None, whiten=False, w_stat_server=None)[source]

>>> 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 (speechbrain.processing.PLDA_LDA.StatObject_SB) – 包含向量和元信息以执行 PLDA

modelset (list) – 每个 session 的模型 ID 列表,作为字符串数组。