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
摘要
类:
一个用于执行线性判别分析的类。 |
|
一个编码试验索引信息的类。 |
|
一个用于从嵌入中训练PLDA模型的类。 |
|
用于存储试验得分的类。 |
|
用于PLDA类的实用类,用于统计计算。 |
函数:
列表之间的差异。 |
|
用于PLDA估计的函数。 |
|
计算两组向量之间的PLDA分数。 |
|
检查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:
- 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_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数组。
- 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) – 要匹配的模型列表。
- class speechbrain.processing.PLDA_LDA.Ndx(ndx_file_name='', models=array([], dtype=float64), testsegs=array([], dtype=float64))[source]
基础类:
object一个编码试验索引信息的类。它包含一个模型名称列表和一个测试段名称列表,以及一个指示模型和测试段哪些组合是感兴趣的试验的矩阵。
- Parameters:
- 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估计的函数。
- 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:
- class speechbrain.processing.PLDA_LDA.LDA[source]
基础类:
object一个用于执行线性判别分析的类。
它根据LDA返回低维表示。
- 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:
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:
stat_server (speechbrain.processing.PLDA_LDA.StatObject_SB) – 包含执行PLDA所需的向量和元信息
output_file_name (str) – 存储PLDA模型的输出文件的名称。
whiten (bool) – 是否执行白化处理。
w_stat_server (speechbrain.processing.PLDA_LDA.StatObject_SB) – 包含白化向量和元信息。