在JavaScript中比较源和麦克风之间的声音

在JavaScript中比较源和麦克风之间的声音,javascript,audio,microphone,audio-fingerprinting,Javascript,Audio,Microphone,Audio Fingerprinting,我正在研究音频,但我是这方面的新手。我想将麦克风的声音与我的源音频进行匹配(仅1个声音)就像沙扎姆的可口可乐广告一样。(0.45分钟)然而,我想通过JavaScript在网站上发布。谢谢。构建类似于Shazam后端的东西并非易事。我们需要: 从用户的麦克风获取音频(简单) 将其与源代码进行比较并确定匹配项(嗯…如何…) 我们如何执行每个步骤 阿奎尔音频 这是一个毫无疑问的问题。我们可以使用Web音频API进行此操作。你可以在谷歌上搜索关于如何使用它的好教程。提供一些很好的基础知识,您在使用时可能

我正在研究音频,但我是这方面的新手。我想将麦克风的声音与我的源音频进行匹配(仅1个声音)就像沙扎姆的可口可乐广告一样。(0.45分钟)然而,我想通过JavaScript在网站上发布。谢谢。

构建类似于Shazam后端的东西并非易事。我们需要:

  • 从用户的麦克风获取音频(简单)
  • 将其与源代码进行比较并确定匹配项(嗯…如何…)
  • 我们如何执行每个步骤

    阿奎尔音频 这是一个毫无疑问的问题。我们可以使用
    Web音频API
    进行此操作。你可以在谷歌上搜索关于如何使用它的好教程。提供一些很好的基础知识,您在使用时可能希望了解这些知识

    将示例与音频源文件进行比较 显然,在这样一个项目中,这一部分将是一个算法挑战。可能有多种方法来处理这一部分,这里没有足够的时间来描述它们,但一种可行的技术(恰巧是Shazam实际使用的),也有更详细的描述,就是为你的源材料的较小部分创建并与指纹进行比较,可以使用FFT分析生成

    这项工作如下:

  • 一次看一小段不超过几秒钟的示例(注意,这是使用滑动窗口完成的,而不是离散分区)
  • 计算音频选择的傅里叶变换。这将我们的选择分解为许多不同频率的信号。我们可以分析样本的频域,得出关于我们所听到的有用结论
  • 通过识别FFT中的临界值(如峰值频率或幅值),为选择创建指纹
  • 如果你想像Shazam那样匹配多个样本,你应该维护一个指纹字典,但是因为你只需要匹配一个源材料,你可以在一个列表中维护它们。由于您的键将是一个数值数组,因此我建议另一种可能的数据结构是一个数组,用于快速查询您的数据集。我不认为Shazam使用了一个,但我越想,他们的系统似乎越接近于n维最近邻搜索,如果你能保持临界点的数量一致的话。不过现在,请保持简单,使用列表
  • 现在我们有一个指纹数据库,已经准备好使用。我们现在需要将它们与麦克风输入进行比较

  • 使用滑动窗口对麦克风输入进行小段采样,与我们对源进行采样的方式相同
  • 对于每个片段,计算指纹,并查看它是否与存储中的任何片段匹配。你可以在这里寻找部分匹配,你可以尝试很多调整和优化
  • 这将是一个嘈杂和不准确的信号,所以不要期望每个片段都匹配。如果他们中的很多人都得到了匹配(你必须在实验中弄清楚“很多”是什么意思),那么假设你有一个。如果匹配项相对较少,则认为您没有
  • 结论 这将不是一个非常容易做好的项目。所需的调优和优化量将被证明是一个挑战。有些麦克风是不准确的,大多数环境都有其他声音,所有这些都会影响你的结果,但也可能没有听起来那么糟糕。我的意思是,从外部看,这是一个复杂得难以接近的系统,我们只是把它分解成一些相对简单的步骤


    最后一点,您在帖子中多次提到Javascript,您可能会注意到,到目前为止,我在回答中没有提到过Javascript,这是因为实现语言不是一个重要因素。这个系统足够复杂,最难的部分是你在纸上解决的,所以你不需要考虑“我如何在Y中做X”,只要找出X的算法,Y应该自然出现。

    构建类似于Shazam后端的东西不是一件容易的任务。我们需要:

  • 从用户的麦克风获取音频(简单)
  • 将其与源代码进行比较并确定匹配项(嗯…如何…)
  • 我们如何执行每个步骤

    阿奎尔音频 这是一个毫无疑问的问题。我们可以使用
    Web音频API
    进行此操作。你可以在谷歌上搜索关于如何使用它的好教程。提供一些很好的基础知识,您在使用时可能希望了解这些知识

    将示例与音频源文件进行比较 显然,在这样一个项目中,这一部分将是一个算法挑战。可能有多种方法来处理这一部分,这里没有足够的时间来描述它们,但一种可行的技术(恰巧是Shazam实际使用的),也有更详细的描述,就是为你的源材料的较小部分创建并与指纹进行比较,可以使用FFT分析生成

    这项工作如下:

  • 一次看一小段不超过几秒钟的示例(注意,这是使用滑动窗口完成的,而不是离散分区)
  • 计算音频选择的傅里叶变换。这将我们的选择分解为许多不同频率的信号。我们可以分析样本的频域,得出关于我们所听到的有用结论
  • 通过识别FFT中的临界值(如峰值频率或幅值),为选择创建指纹
  • 如果你想像Shazam那样匹配多个样本,你应该维护一个指纹字典,但是因为你只需要匹配一个源材料,你可以在一个列表中维护它们。因为你的钥匙会是a