speechbrain.processing.diarization 模块
此脚本包含用于说话人分割的基本功能。 此脚本对开源scikit-learn(sklearn)库有可选的依赖。 根据需求,此脚本中修改了一些scikit-learn函数。
参考
这段代码是使用以下内容编写的:
Von Luxburg, U. 谱聚类教程。统计计算 17, 395–416 (2007)。 https://doi.org/10.1007/s11222-007-9033-z
https://github.com/scikit-learn/scikit-learn/blob/0fb307bf3/sklearn/cluster/_spectral.py
https://github.com/tango4j/Auto-Tuning-Spectral-Clustering/blob/master/spectral_opt.py
- Authors
纳曼·达瓦拉塔巴德 2020
摘要
类:
该类实现了使用未归一化的亲和矩阵进行谱聚类。 |
|
使用sklearn在嵌入上执行谱聚类。 |
函数:
将重叠的语音均匀分配给具有不同说话者的相邻段。 |
|
对嵌入执行凝聚层次聚类。 |
|
对嵌入执行kmeans聚类。 |
|
对嵌入进行谱聚类。 |
|
返回录音中实际说话者的数量,基于真实数据。 |
|
如果段重叠,则返回True。 |
|
合并来自同一说话者的相邻子段。 |
|
为给定的录音ID准备csv文件。 |
|
读取并返回列表格式的RTTM。 |
|
执行谱聚类。 |
|
返回谱嵌入。 |
|
写入单个录音的最终DERs。 |
|
以RTTM格式(一种标准的NIST格式)写入段列表。 |
参考
- speechbrain.processing.diarization.write_ders_file(ref_rttm, DER, out_der_file)[source]
为单个录音写入最终的DERs。
- speechbrain.processing.diarization.prepare_subset_csv(full_diary_csv, rec_id, out_csv_file)[source]
为给定的录音ID准备csv文件。
- speechbrain.processing.diarization.is_overlapped(end1, start2)[source]
如果段重叠,则返回True。
- Parameters:
- Returns:
overlapped – 如果段重叠则为True,否则为False。
- Return type:
Example
>>> from speechbrain.processing import diarization as diar >>> diar.is_overlapped(5.5, 3.4) True >>> diar.is_overlapped(5.5, 6.4) False
- speechbrain.processing.diarization.merge_ssegs_same_speaker(lol)[source]
合并来自同一发言者的相邻子段。
- Parameters:
lol (list 的 list) – 每个列表包含 [rec_id, sseg_start, sseg_end, spkr_id]。
- Returns:
new_lol – new_lol 包含从同一说话者ID合并的相邻片段。
- Return type:
Example
>>> from speechbrain.processing import diarization as diar >>> lol=[['r1', 5.5, 7.0, 's1'], ... ['r1', 6.5, 9.0, 's1'], ... ['r1', 8.0, 11.0, 's1'], ... ['r1', 11.5, 13.0, 's2'], ... ['r1', 14.0, 15.0, 's2'], ... ['r1', 14.5, 15.0, 's1']] >>> diar.merge_ssegs_same_speaker(lol) [['r1', 5.5, 11.0, 's1'], ['r1', 11.5, 13.0, 's2'], ['r1', 14.0, 15.0, 's2'], ['r1', 14.5, 15.0, 's1']]
- speechbrain.processing.diarization.distribute_overlap(lol)[source]
将重叠的语音均匀地分配给相邻的不同说话者的片段。
- Parameters:
lol (list of list) – 每个列表结构为 [rec_id, sseg_start, sseg_end, spkr_id]。
- Returns:
new_lol – 它包含在不同说话者ID的相邻段之间平均分配的重复部分。
- Return type:
Example
>>> from speechbrain.processing import diarization as diar >>> lol = [['r1', 5.5, 9.0, 's1'], ... ['r1', 8.0, 11.0, 's2'], ... ['r1', 11.5, 13.0, 's2'], ... ['r1', 12.0, 15.0, 's1']] >>> diar.distribute_overlap(lol) [['r1', 5.5, 8.5, 's1'], ['r1', 8.5, 11.0, 's2'], ['r1', 11.5, 12.5, 's2'], ['r1', 12.5, 15.0, 's1']]
- speechbrain.processing.diarization.write_rttm(segs_list, out_rttm_file)[source]
以RTTM格式(一种标准的NIST格式)写入段列表。
- speechbrain.processing.diarization.get_oracle_num_spkrs(rec_id, spkr_info)[source]
返回录音中实际说话者的数量,这是基于真实情况的。 这可以在条件为说话者数量的预言时使用。
- Parameters:
- Returns:
num_spkrs
- Return type:
Example
>>> from speechbrain.processing import diarization as diar >>> spkr_info = ['SPKR-INFO ES2011a 0 <NA> <NA> <NA> unknown ES2011a.A <NA> <NA>', ... 'SPKR-INFO ES2011a 0 <NA> <NA> <NA> unknown ES2011a.B <NA> <NA>', ... 'SPKR-INFO ES2011a 0 <NA> <NA> <NA> unknown ES2011a.C <NA> <NA>', ... 'SPKR-INFO ES2011a 0 <NA> <NA> <NA> unknown ES2011a.D <NA> <NA>', ... 'SPKR-INFO ES2011b 0 <NA> <NA> <NA> unknown ES2011b.A <NA> <NA>', ... 'SPKR-INFO ES2011b 0 <NA> <NA> <NA> unknown ES2011b.B <NA> <NA>', ... 'SPKR-INFO ES2011b 0 <NA> <NA> <NA> unknown ES2011b.C <NA> <NA>'] >>> diar.get_oracle_num_spkrs('ES2011a', spkr_info) 4 >>> diar.get_oracle_num_spkrs('ES2011b', spkr_info) 3
- speechbrain.processing.diarization.spectral_embedding_sb(adjacency, n_components=8, norm_laplacian=True, drop_first=True)[source]
返回光谱嵌入。
- Parameters:
- Returns:
embedding – 每个样本的谱嵌入。
- Return type:
数组
Example
>>> import numpy as np >>> from speechbrain.processing import diarization as diar >>> affinity = np.array([[1, 1, 1, 0.5, 0, 0, 0, 0, 0, 0.5], ... [1, 1, 1, 0, 0, 0, 0, 0, 0, 0], ... [1, 1, 1, 0, 0, 0, 0, 0, 0, 0], ... [0.5, 0, 0, 1, 1, 1, 0, 0, 0, 0], ... [0, 0, 0, 1, 1, 1, 0, 0, 0, 0], ... [0, 0, 0, 1, 1, 1, 0, 0, 0, 0], ... [0, 0, 0, 0, 0, 0, 1, 1, 1, 1], ... [0, 0, 0, 0, 0, 0, 1, 1, 1, 1], ... [0, 0, 0, 0, 0, 0, 1, 1, 1, 1], ... [0.5, 0, 0, 0, 0, 0, 1, 1, 1, 1]]) >>> embs = diar.spectral_embedding_sb(affinity, 3) >>> # Notice similar embeddings >>> print(np.around(embs , decimals=3)) [[ 0.075 0.244 0.285] [ 0.083 0.356 -0.203] [ 0.083 0.356 -0.203] [ 0.26 -0.149 0.154] [ 0.29 -0.218 -0.11 ] [ 0.29 -0.218 -0.11 ] [-0.198 -0.084 -0.122] [-0.198 -0.084 -0.122] [-0.198 -0.084 -0.122] [-0.167 -0.044 0.316]]
- speechbrain.processing.diarization.spectral_clustering_sb(affinity, n_clusters=8, n_components=None, random_state=None, n_init=10)[source]
执行谱聚类。
- Parameters:
- Returns:
labels – 每个样本的聚类标签。
- Return type:
数组
Example
>>> import numpy as np >>> from speechbrain.processing import diarization as diar >>> affinity = np.array([[1, 1, 1, 0.5, 0, 0, 0, 0, 0, 0.5], ... [1, 1, 1, 0, 0, 0, 0, 0, 0, 0], ... [1, 1, 1, 0, 0, 0, 0, 0, 0, 0], ... [0.5, 0, 0, 1, 1, 1, 0, 0, 0, 0], ... [0, 0, 0, 1, 1, 1, 0, 0, 0, 0], ... [0, 0, 0, 1, 1, 1, 0, 0, 0, 0], ... [0, 0, 0, 0, 0, 0, 1, 1, 1, 1], ... [0, 0, 0, 0, 0, 0, 1, 1, 1, 1], ... [0, 0, 0, 0, 0, 0, 1, 1, 1, 1], ... [0.5, 0, 0, 0, 0, 0, 1, 1, 1, 1]]) >>> labs = diar.spectral_clustering_sb(affinity, 3) >>> # print (labs) # [2 2 2 1 1 1 0 0 0 0]
- class speechbrain.processing.diarization.Spec_Cluster(n_clusters=8, *, eigen_solver=None, n_components=None, random_state=None, n_init=10, gamma=1.0, affinity='rbf', n_neighbors=10, eigen_tol='auto', assign_labels='kmeans', degree=3, coef0=1, kernel_params=None, n_jobs=None, verbose=False)[source]
基础:
SpectralClustering使用sklearn在嵌入上执行谱聚类。
- class speechbrain.processing.diarization.Spec_Clust_unorm(min_num_spkrs=2, max_num_spkrs=10)[source]
基础类:
object该类实现了使用未归一化的亲和矩阵进行谱聚类。 当亲和矩阵基于余弦相似度时非常有用。
- Parameters:
Example
>>> from speechbrain.processing import diarization as diar >>> clust = diar.Spec_Clust_unorm(min_num_spkrs=2, max_num_spkrs=10) >>> emb = [[ 2.1, 3.1, 4.1, 4.2, 3.1], ... [ 2.2, 3.1, 4.2, 4.2, 3.2], ... [ 2.0, 3.0, 4.0, 4.1, 3.0], ... [ 8.0, 7.0, 7.0, 8.1, 9.0], ... [ 8.1, 7.1, 7.2, 8.1, 9.2], ... [ 8.3, 7.4, 7.0, 8.4, 9.0], ... [ 0.3, 0.4, 0.4, 0.5, 0.8], ... [ 0.4, 0.3, 0.6, 0.7, 0.8], ... [ 0.2, 0.3, 0.2, 0.3, 0.7], ... [ 0.3, 0.4, 0.4, 0.4, 0.7],] >>> # Estimating similarity matrix >>> sim_mat = clust.get_sim_mat(emb) >>> print (np.around(sim_mat[5:,5:], decimals=3)) [[1. 0.957 0.961 0.904 0.966] [0.957 1. 0.977 0.982 0.997] [0.961 0.977 1. 0.928 0.972] [0.904 0.982 0.928 1. 0.976] [0.966 0.997 0.972 0.976 1. ]] >>> # Pruning >>> pruned_sim_mat = clust.p_pruning(sim_mat, 0.3) >>> print (np.around(pruned_sim_mat[5:,5:], decimals=3)) [[1. 0. 0. 0. 0. ] [0. 1. 0. 0.982 0.997] [0. 0.977 1. 0. 0.972] [0. 0.982 0. 1. 0.976] [0. 0.997 0. 0.976 1. ]] >>> # Symmetrization >>> sym_pruned_sim_mat = 0.5 * (pruned_sim_mat + pruned_sim_mat.T) >>> print (np.around(sym_pruned_sim_mat[5:,5:], decimals=3)) [[1. 0. 0. 0. 0. ] [0. 1. 0.489 0.982 0.997] [0. 0.489 1. 0. 0.486] [0. 0.982 0. 1. 0.976] [0. 0.997 0.486 0.976 1. ]] >>> # Laplacian >>> laplacian = clust.get_laplacian(sym_pruned_sim_mat) >>> print (np.around(laplacian[5:,5:], decimals=3)) [[ 1.999 0. 0. 0. 0. ] [ 0. 2.468 -0.489 -0.982 -0.997] [ 0. -0.489 0.975 0. -0.486] [ 0. -0.982 0. 1.958 -0.976] [ 0. -0.997 -0.486 -0.976 2.458]] >>> # Spectral Embeddings >>> spec_emb, num_of_spk = clust.get_spec_embs(laplacian, 3) >>> print(num_of_spk) 3 >>> # Clustering >>> clust.cluster_embs(spec_emb, num_of_spk) >>> # print (clust.labels_) # [0 0 0 2 2 2 1 1 1 1] >>> # Complete spectral clustering >>> clust.do_spec_clust(emb, k_oracle=3, p_val=0.3) >>> # print(clust.labels_) # [0 0 0 2 2 2 1 1 1 1]
- get_sim_mat(X)[source]
返回基于余弦相似度的相似度矩阵。
- Parameters:
X (数组) – (n_samples, n_features). 从模型中提取的嵌入。
- Returns:
M – (n_samples, n_samples). 相似度矩阵,包含每对嵌入之间的余弦相似度。
- Return type:
数组
- p_pruning(A, pval)[source]
通过将不太相似的值设为零来优化亲和矩阵。
- Parameters:
A (数组) – (n_samples, n_samples). 亲和矩阵。
pval (float) – 在亲和矩阵的每一行中保留的p值。
- Returns:
A – (n_samples, n_samples). 基于p_val修剪的亲和矩阵。
- Return type:
数组
- get_laplacian(M)[source]
返回给定亲和矩阵的非归一化拉普拉斯矩阵。
- Parameters:
M (数组) – (n_samples, n_samples) 亲和矩阵。
- Returns:
L – (n_samples, n_samples) 拉普拉斯矩阵。
- Return type:
数组
- get_spec_embs(L, k_oracle=4)[source]
返回频谱嵌入并使用最大特征间隙估计说话者数量。
- Parameters:
L (数组 (n_samples, n_samples)) – 拉普拉斯矩阵。
k_oracle (int) – 当条件为说话者数量的oracle时,表示说话者的数量,否则为None。
- Returns:
emb (array (n_samples, n_components)) – 每个样本的谱嵌入,具有n个特征分量。
num_of_spk (int) – 估计的说话者数量。如果条件设置为oracle说话者数量,则返回k_oracle。
- speechbrain.processing.diarization.do_spec_clustering(diary_obj, out_rttm_file, rec_id, k, pval, affinity_type, n_neighbors)[source]
对嵌入执行谱聚类。此函数根据亲和力调用特定的聚类算法。
- speechbrain.processing.diarization.do_kmeans_clustering(diary_obj, out_rttm_file, rec_id, k_oracle=4, p_val=0.3)[source]
对嵌入执行kmeans聚类。