请问有关于多人声分离的方法吗?python或者matlab

感觉很多代码讲解的都是分离背景音乐和人声,但是如果一段音频是几个人在讲话,如何把每个人说的话分离出来呢?

试试独立成分分析(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()

结果如下图所示。

img

img