感觉很多代码讲解的都是分离背景音乐和人声,但是如果一段音频是几个人在讲话,如何把每个人说的话分离出来呢?
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
悬赏问题
- ¥30 电脑误删了手机的照片怎么恢复?
- ¥15 (标签-python|关键词-char)
- ¥15 python+selenium,在新增时弹出了一个输入框
- ¥15 苹果验机结果的api接口哪里有??单次调用1毛钱及以下。
- ¥20 学生成绩管理系统设计
- ¥15 来一个cc穿盾脚本开发者
- ¥15 CST2023安装报错
- ¥15 使用diffusionbert生成文字 结果是PAD和UNK怎么办
- ¥15 有人懂怎么做大模型的客服系统吗?卡住了卡住了
- ¥20 firefly-rk3399上启动卡住了