[wip][vec] add clustering of vectors #1304

pull/1509/head
qingen 3 years ago
parent c962eec51d
commit d01d7fedce

@ -17,11 +17,8 @@ Data preparation.
Download: http://groups.inf.ed.ac.uk/ami/download/ Download: http://groups.inf.ed.ac.uk/ami/download/
Prepares metadata files (JSON) from manual annotations "segments/" using RTTM format (Oracle VAD). Prepares metadata files (JSON) from manual annotations "segments/" using RTTM format (Oracle VAD).
Authors
* qingenz123@126.com (Qingen ZHAO) 2022
""" """
import argparse import argparse
import glob import glob
import json import json

@ -15,10 +15,6 @@
AMI corpus contained 100 hours of meeting recording. AMI corpus contained 100 hours of meeting recording.
This script returns the standard train, dev and eval split for AMI corpus. This script returns the standard train, dev and eval split for AMI corpus.
For more information on dataset please refer to http://groups.inf.ed.ac.uk/ami/corpus/datasets.shtml For more information on dataset please refer to http://groups.inf.ed.ac.uk/ami/corpus/datasets.shtml
Authors
* qingenz123@126.com (Qingen ZHAO) 2022
""" """
ALLOWED_OPTIONS = ["scenario_only", "full_corpus", "full_corpus_asr"] ALLOWED_OPTIONS = ["scenario_only", "full_corpus", "full_corpus_asr"]

@ -13,10 +13,6 @@
# limitations under the License. # limitations under the License.
""" """
Data reading and writing. Data reading and writing.
Authors
* qingenz123@126.com (Qingen ZHAO) 2022
""" """
import os import os
import pickle import pickle

@ -15,10 +15,6 @@
This script contains basic functions used for speaker diarization. This script contains basic functions used for speaker diarization.
This script has an optional dependency on open source sklearn library. This script has an optional dependency on open source sklearn library.
A few sklearn functions are modified in this script as per requirement. A few sklearn functions are modified in this script as per requirement.
Authors
* qingenz123@126.com (Qingen ZHAO) 2022
""" """
import argparse import argparse
@ -377,7 +373,7 @@ class EmbeddingMeta:
self.stats = (self.stats.transpose() / vect_norm).transpose() self.stats = (self.stats.transpose() / vect_norm).transpose()
class Spec_Clust_unorm: class SpecClustUnorm:
""" """
This class implements the spectral clustering with unnormalized affinity matrix. This class implements the spectral clustering with unnormalized affinity matrix.
Useful when affinity matrix is based on cosine similarities. Useful when affinity matrix is based on cosine similarities.
@ -390,7 +386,7 @@ class Spec_Clust_unorm:
Example Example
------- -------
>>> import diarization as diar >>> import diarization as diar
>>> clust = diar.Spec_Clust_unorm(min_num_spkrs=2, max_num_spkrs=10) >>> clust = diar.SpecClustUnorm(min_num_spkrs=2, max_num_spkrs=10)
>>> emb = [[ 2.1, 3.1, 4.1, 4.2, 3.1], >>> emb = [[ 2.1, 3.1, 4.1, 4.2, 3.1],
... [ 2.2, 3.1, 4.2, 4.2, 3.2], ... [ 2.2, 3.1, 4.2, 4.2, 3.2],
... [ 2.0, 3.0, 4.0, 4.1, 3.0], ... [ 2.0, 3.0, 4.0, 4.1, 3.0],
@ -586,7 +582,7 @@ class Spec_Clust_unorm:
if k_oracle is not None: if k_oracle is not None:
num_of_spk = k_oracle num_of_spk = k_oracle
else: else:
lambda_gap_list = self.getEigenGaps(lambdas[1:self.max_num_spkrs]) lambda_gap_list = self.get_eigen_gaps(lambdas[1:self.max_num_spkrs])
num_of_spk = (np.argmax( num_of_spk = (np.argmax(
lambda_gap_list[:min(self.max_num_spkrs, len(lambda_gap_list))]) lambda_gap_list[:min(self.max_num_spkrs, len(lambda_gap_list))])
@ -617,7 +613,7 @@ class Spec_Clust_unorm:
""" """
_, self.labels_, _ = k_means(emb, k) _, self.labels_, _ = k_means(emb, k)
def getEigenGaps(self, eig_vals): def get_eigen_gaps(self, eig_vals):
""" """
Returns the difference (gaps) between the Eigen values. Returns the difference (gaps) between the Eigen values.
@ -641,7 +637,7 @@ class Spec_Clust_unorm:
return eig_vals_gap_list return eig_vals_gap_list
class Spec_Cluster(SpectralClustering): class SpecCluster(SpectralClustering):
def perform_sc(self, X, n_neighbors=10): def perform_sc(self, X, n_neighbors=10):
""" """
Performs spectral clustering using sklearn on embeddings. Performs spectral clustering using sklearn on embeddings.
@ -969,12 +965,12 @@ def do_spec_clustering(diary_obj, out_rttm_file, rec_id, k, pval, affinity_type,
""" """
if affinity_type == "cos": if affinity_type == "cos":
clust_obj = Spec_Clust_unorm(min_num_spkrs=2, max_num_spkrs=10) clust_obj = SpecClustUnorm(min_num_spkrs=2, max_num_spkrs=10)
k_oracle = k # use it only when oracle num of speakers k_oracle = k # use it only when oracle num of speakers
clust_obj.do_spec_clust(diary_obj.stats, k_oracle, pval) clust_obj.do_spec_clust(diary_obj.stats, k_oracle, pval)
labels = clust_obj.labels_ labels = clust_obj.labels_
else: else:
clust_obj = Spec_Cluster( clust_obj = SpecCluster(
n_clusters=k, n_clusters=k,
assign_labels="kmeans", assign_labels="kmeans",
random_state=1234, random_state=1234,

Loading…
Cancel
Save