【问题标题】:Audio signal source separation with neural network用神经网络分离音频信号源
【发布时间】:2014-02-25 19:16:04
【问题描述】:

我要做的是分离音频源并从原始信号中提取其音高。 我自己建模了这个过程,如下所示: 每个源在normal modes 中振荡,经常使其分量峰值的频率整数倍增。它被称为Harmonic。然后resonanced,最后线性合并。

如上所示,我对音频信号的频率响应模式有很多提示,但几乎不知道如何“分离”它。我已经尝试了无数自己的模型。这是其中之一:

  1. 对 PCM 进行 FFT
  2. 获取峰值频率区间和幅度。
  3. 计算音高候选频率区间。
  4. 对于每个音高候选,使用循环神经网络分析所有峰值并找到合适的峰值组合。
  5. 分离分析的候选音调。

不幸的是,到目前为止,我还没有成功地分离信号。 我想要任何建议来解决这类问题。 尤其是像我上面的源分离建模。

【问题讨论】:

  • 我建议你在其他地方问 - 这个问题在这里可能过于序列化,并且本身并不是一个真正的软件开发问题。
  • 试试快速 ICA(独立成分分析)?
  • 我的理解是,组合的音高和幅度可以来自无数不同的源信号,因此不可能找到正确的起源。我建议在 MFCC 上应用自动特征提取(稀疏自动编码器)以获得每个源组合所特有的相当微妙的特征。我渴望对此进行测试,如果您可以提供托管此类数据集的链接,我可能会为您提供一个合理的解决方案。谢谢!
  • 亲爱的@Memming,我当然听说过 ICA,但 AFAIK 它需要 N 监视器来分离 N 源。它不适合我的情况,因为音频文件通常少于 3 个通道。

标签: audio machine-learning neural-network signal-processing source-separation


【解决方案1】:

因为没有人真正尝试过回答这个问题,并且因为你已经用neural-network 标签标记了它,所以我将讨论神经网络对这类问题的适用性。由于这个问题有点非技术性,所以这个答案也将是“高级”。

神经网络需要某种样本集来学习。为了“教”一个神经网络来解决这个问题,你基本上需要一组已知的解决方案来工作。你有这个吗?如果是这样,请继续阅读。如果不是,则可能不是您正在寻找的神经。您说您有“很多提示”,但没有真正的解决方案。这让我相信你可能没有样本集。如果你能得到它们,那就太好了,否则你可能会倒霉。

假设现在您有一个包含Raw Signal 样本的样本集以及对应的Source 1Source 2 输出......那么,现在您将需要一种方法来确定拓扑。假设您不太了解神经网络的工作原理(并且不想),并且假设您也不知道问题的确切复杂程度,我可能会推荐 open source NEAT package 来帮助您开始了。我与这个项目没有任何关系,但我使用过它,它允许您(相对)智能地进化神经网络拓扑以适应问题。

现在,就神经网络如何解决这个特定问题而言。首先想到的是所有音频信号本质上都是时间序列的。也就是说,它们传达的信息在某种程度上依赖于先前时​​间步长的数据并与之相关(例如,某些波形的检测不能从单个时间点完成;它也需要有关先前时间步长的信息)。同样,有上百万种方法可以解决这个问题,但既然我已经推荐了NEAT,我可能会建议你看看C++ NEAT Time Series mod。

如果您沿着这条路线前进,您可能想要使用某种滑动窗口来提供有关每个时间步的最近过去的信息。有关滑动窗口的快速而肮脏的介绍,请查看这个 SO 问题:

Time Series Prediction via Neural Networks

滑动窗口的大小可能很重要,尤其是如果您使用循环神经网络。循环网络允许神经网络记住以前的时间步长(以性能为代价 - NEAT 已经是循环的,因此在这里为您做出选择)。您可能希望滑动窗口长度(即每个时间步提供的过去的时间步数)大致等于您对获得足够增益所需的最大先前时间步数的保守猜测分割波形的信息。

我想说这可能足以让您入门。

在决定如何向神经网络提供数据时,您首先需要对输入信号进行归一化(考虑 sigmoid function)并尝试不同的传递函数(sigmoid 可能是一个很好的起点)。

我想你会想要有 2 个输出神经元,提供归一化的幅度(你可以通过 sigmoid 函数的反函数对其进行反规范化)作为分别代表 Source 1Source 2 的输出。对于适应度值(您判断每个测试网络解决问题的能力的方式)将是输出信号的 RMS 误差相对于实际 已知 信号的负值(即,针对我之前提到的您需要采购的样品进行测试)。

可以说,这不是一个简单的操作,但如果您有足够的样本来训练网络,它可能工作。什么是好的样本数量?根据经验,它大致是一个足够大的数字,以至于简单的多项式函数 N(其中 N 是解决问题所需的神经网络中的神经元数量)不能 准确拟合所有样本。这基本上是为了确保你不是简单的overfitting the problem,这是神经网络的一个严重问题。

我希望这对您有所帮助!祝你好运。

补充说明:如果你走这条路,你迄今为止的工作不会白费。神经网络可能会从 FFT 和其他信号建模“输入”形式的额外“帮助”中受益,因此您可能需要考虑采用您已经完成的信号处理,组织成模拟的连续表示并将其提供给作为输入信号旁边的输入。

【讨论】:

  • 但是你如何让网络知道顺序并不重要?这就像一个“监督聚类”问题,你教它如何将混合分成两个源,但它不需要知道源是什么——它只需要知道哪个频率属于哪个源。但这是一个问题,因为神经元 #1 是源 2,神经元 #2 是源 1,与神经元 #1 是源 1 和神经元 #2 是源 2 一样有效。不行,因为如果你推广到 N 个信号,那将是阶乘复杂度!
  • 并扩展我之前的评论,您如何概括神经网络以能够分离成 N​​ 个源,而不仅仅是 2 个源?它首先必须弄清楚大约有多少来源。你会如何解决这个问题?
猜你喜欢
  • 2015-11-25
  • 2017-12-17
  • 2017-04-08
  • 2017-06-08
  • 2020-04-18
  • 2017-04-22
  • 1970-01-01
  • 2014-04-23
  • 2019-07-17
相关资源
最近更新 更多