在音频文件上成功应用 kmeans 聚类后,如何将数据恢复到两个单独的音频文件中?

数据挖掘 聚类 k-均值
2022-03-12 07:08:10

好的,所以我编写了一个非常简单的 python 代码来读取 wav 文件,获取 mfcc 功能,然后对这些功能使用 kmeans 聚类。hello.wav 文件有两个不同的人同时打招呼,我想输出两个不同的声音

from python_speech_features import mfcc
from scipy.io import wavfile
from sklearn.cluster import KMeans
sampfreq, data = wavfile.read('hello.wav')

mfcc_feat = mfcc(data,sampfreq)

kmeans = KMeans(n_clusters=2)
kmeans.fit(mfcc_feat)
print(kmeans.cluster_centers_)
print(kmeans.labels_)

现在我得到了标签和聚类中心,但是如何使用它取回两个单独的声音样本?

1个回答

您正在尝试做的是盲源分离,不幸的是它并没有那么容易。当您从混合了声音的音频文件中提取 MFCC 时,MFCC 集群不会代表两个人。对于分离,您应该最终得到两个具有相同数量样本的声音信号。例如,MFCC 用作说话人识别任务的特征空间,但通常不用于分离。有关 BSS 的更多数学背景,您可以访问:https ://arxiv.org/pdf/1603.03089.pdf

最简单的情况是所谓的鸡尾酒会问题,在这种情况下,麦克风的数量至少与人一样多,并且混合必须是瞬时的(信号之间没有延迟,只有路径损耗引起的衰减)。这个非常简单的案例可以通过 FastICA 算法应用独立分量分析来解决:http: //scikit-learn.org/stable/auto_examples/decomposition/plot_ica_blind_source_separation.html

对于延迟混合,您可以尝试 DUET 算法:https ://pdfs.semanticscholar.org/1413/746141f2871e0f45056a7696e019b8f8a100.pdf

对于卷积混合和未确定的问题(扬声器多于麦克风),这种基于 PARAFAC 的算法性能非常好: http: //people.ece.umn.edu/~nikos/05233821.pdf