如何查找音频的一部分在另一个音频中开始和结束的时间?

时间:2018-03-21 14:47:51

标签: audio pattern-matching audio-fingerprinting

我有两个音频文件,其中一个句子被两个不同的人阅读(如唱一首歌)。所以他们有不同的长度。它们只是声音,没有任何乐器。

A1:音频文件1
A2:音频文件2
例句:" Lorem ipsum dolor sit amet,..."

structure of sample audio files

我知道每个单词在A1开始和结束的时间。我需要自动找到每个单词在A2开始和结束的时间。 (任何语言,最好是Python或C#)

时间以XML格式保存。所以,我可以逐字分割A1文件。那么,如何在具有不同持续时间(单词)和不同声音的另一个音频中找到单词的声音?

4 个答案:

答案 0 :(得分:3)

因此,根据我的阅读,您似乎想要使用Dynamic Time Warping (DTW)。当然,我将留下维基百科的解释,但它通常用于识别语音模式而不会从不同的发音中获得噪音。

可悲的是,我更熟悉C,Java和Python。所以我会建议python库。

  1. fastdtw
  2. pydtw
  3. mlpy
  4. rpy2
  5. 使用rpy2,您实际上可以使用R的库并在您的python代码中使用它们的DTW实现。可悲的是,我找不到任何好的教程,但如果你选择使用R,那就有很好的例子。

    如果这没有用,请告诉我,干杯!

答案 1 :(得分:2)

下面的秘诀:如果两个点具有相同的值,pointA - pointB 为零...下面利用这一点来确定在比较来自一对输入文件的原始音频曲线时哪个文件字节索引偏移量给我们这个零值

方法是打开两个文件并提取每个文件的原始音频曲线...定义两个变量 bestSum 和 currentSum,将两者都设置为 MAX_INT_VALUE(任意高值)...同时遍历两个文件并获得文件 A 的当前原始音频曲线电平的整数值在其他文件 B 上做同样的事情......对于每个这样的整数,只需从文件 B 的整数中减去文件 A 中的整数......继续这个循环直到你到达结束一个文件...在上面的循环中将上述减法的当前值添加到 currentSum 变量中...在上面循环的底部更新 bestSum 成为 currentSum 如果 currentSum < bestSum 还存储当前文件索引偏移...
创建一个外循环,通过在一个文件的时间引入偏移量然后重新启动内循环以上来重复上述所有内容......您的常见音频是当您使用具有最小总和值的偏移量时..遇到 bestSum 时的偏移

在您获得上述完全合理的直觉之前不要开始编码

我强烈建议您绘制一个文件的原始音频曲线以确认您正在访问这个整数序列......在尝试上述算法之前执行此操作

答案 2 :(得分:1)

如果不了解您对问题空间的理解有多复杂,就不容易知道是指向某个方向还是提供详细信息,说明为什么这个问题不重要。 我建议您从https://cloud.google.com/speech/开始,尝试将语音块转换为文本,然后对这些进行相似性比较。 如果您真的想尝试自己进行处理,可以考虑进行一些光谱分析。获取波形数据并执行FFT以获得频率分布,并查找与样本对齐的标记模式。 只使用不同扬声器的单字比较,您可能无法应用任何类型的神经网络,除非您能够在2个扬声器整个语音集上训练它们并使用网络然后尝试比较单个单词块。 自从我做了这些事以来已经过了几年,所以这些日子可能会更容易,但我的回忆是,虽然这听起来很简单,但事实证明这比你意识到的要困难得多。 动态时间扭曲看起来是最有希望的建议。

答案 3 :(得分:0)

我的方法是以恒定间隔(例如每100毫秒)记录dB音量,将此音量存储在列表或数组中。我在java上找到了一种方法:Decibel values at specific points in wav file。它可以用其他语言。同时,请注意最大音量:

max = 0;
currentVolume = f(x)
if currentVolume > max
{
  max = currentVolume
}

然后将最大音量除以可编辑的阈值,在我的例子中我去了7.假设最大音量是21,21 / 7 = 3dB,让我们称这个小节为X.

我们是第二个阈值,例如1并将其乘以X.每当音量大于这个新值(1 * x)时,我们认为它是一个单词的开头。当它小于给定值时,我们认为它是一个单词的结尾。

Visual explanation