感觉很多代码讲解的都是分离背景音乐和人声,但是如果一段音频是几个人在讲话,如何把每个人说的话分离出来呢?
2条回答 默认 最新
关注试试独立成分分析(Independent Component Analysis,ICA)。不过,这并不容易实现,因为很多时候我们只有录音,并不知道房间里有几个人在讲话,因此独立成分分析又被称为盲源分离问题。如果预先知道有几个人讲话,这个问题就容易得多。以下内容摘自拙作《Python高手修炼之道》,仅供参考。
假设房间里有两位演讲者在讲话,他们发出的声音分别是 s1 和 s2,有两台录音设备记录了他们混合在一起的声音,得到的记录是 x1 和 x2。下面的代码用正弦波和三角波表示两位演讲者的声音 s1 和 s2,用两个合成信号 x1 和 x2 表示两台录音设备的记录数据,再使用Scikit-learn 的成分分析子模块 decomposition 提供的 FastICA 类来实现独立成分分析。
# -*- encoding: utf-8 -*- """ 8.7.4 独立成分分析(ICA) """ import numpy as np import matplotlib.pyplot as plt from sklearn.decomposition import FastICA plt.rcParams['font.sans-serif'] = ['FangSong'] plt.rcParams['axes.unicode_minus'] = False # 用正弦波和三角波表示两位演讲者的声音s_1和s_2,两个合成信号x_1和x_2表示两台录音设备的记录数据 _x = np.linspace(0, 8*np.pi, 1000) k1 = np.where(np.int_(0.5*_x/np.pi)%2==0, 1, -1)/np.pi k2 = np.where(np.int_(_x/np.pi)%2==0, 1, 0) k3 = np.where(np.int_(_x/np.pi)%2==0, 0, 1) s1 = np.sin(_x) # 第1位演讲者的声音 s2 = _x%(np.pi)*k1*k2 + (np.pi-_x%(np.pi))*k1*k3 # 第2位演讲者的声音 x1 = 0.4*s1 + 0.5*s2 # 录音1 x2 = 1.2*s1 - 0.3*s2 # 录音2 plt.subplot(121) plt.plot(_x, s1, label='s1') plt.plot(_x, s2, label='s2') plt.legend() plt.subplot(122) plt.plot(_x, x1, label='x1') plt.plot(_x, x2, label='x2') plt.legend() plt.show() # 从合成信号x_1和x_2中分离出s_1和s_2这样的独立音源 X = np.stack((x1,x2), axis=1) # 将两个信号合并成矩阵 fica = FastICA(n_components=2) # 快速独立成分分析类实例化 fica.fit(X) X_ica = fica.transform(X) # 独立成分分析结果 print(X_ica.shape) # (1000, 2) plt.plot(_x, X_ica[:,0], label='独立成分1') plt.plot(_x, X_ica[:,1], label='独立成分2') plt.legend() plt.show()结果如下图所示。

评论 打赏 举报解决 1无用 1