比较两个音频文件[重复]

2023-11-23

基本上,我有很多代表同一首歌的音频文件。然而,有些歌曲的质量比原曲差,有些经过编辑,与原曲不再相符。我想做的是以编程方式将这些音频文件与原始音频文件进行比较,看看哪些音频文件与该歌曲匹配,无论质量如何。直接比较显然行不通,因为文件的质量各不相同。

我相信这可以通过分析歌曲的结构并与原曲进行比较来完成,但我对音频工程一无所知,所以这对我没有多大帮助。所有歌曲的格式相同(MP3)。另外,我正在使用 Python,所以如果有它的绑定,那就太棒了;如果没有,那么适用于 JVM 甚至本地库的东西也可以,只要它在 Linux 上运行并且我可以弄清楚如何使用它。


这实际上不是一项微不足道的任务。我认为没有任何现成的图书馆可以做到这一点。这是一种可能的方法:

  1. 将 mp3 解码为 PCM。
  2. 确保 PCM 数据具有您事先选择的特定采样率(例如 16KHz)。您需要对具有不同采样率的歌曲进行重新采样。不需要高采样率,因为无论如何您都需要模糊比较,但太低的采样率会丢失太多细节。
  3. 归一化 PCM 数据(即找到最大样本值并重新调整所有样本,以便具有最大幅度的样本使用数据格式的整个动态范围,例如,如果样本格式为有符号 16 位,则归一化后最大振幅样本应具有值 32767 或 -32767 )。
  4. 将音频数据分割成固定数量样本的帧(例如:每帧 1000 个样本)。
  5. 将每一帧转换为谱域(FFT).
  6. 计算代表两首歌曲的帧序列之间的相关性。如果相关性大于某个阈值,则假设歌曲是相同的。

Python 库:

  • PyMedia(对于步骤 1)
  • NumPy(用于数据处理)--另见本文一些介绍性信息

一个额外的并发症。您的歌曲在开始时可能会有不同长度的静音。因此,为了避免漏报,您可能需要执行额外的步骤:

3.1.从头开始扫描 PCM 数据,直到声能超过预定义的阈值。 (例如,使用 10 个样本的滑动窗口计算 RMS,并在超过动态范围的 1% 时停止)。然后丢弃直到此时的所有数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

比较两个音频文件[重复] 的相关文章

随机推荐

  • 在 java eclipse 控制台中更改颜色

    有没有办法改变eclipse控制台中的文本颜色 我不是在谈论当我进入选项并将颜色从黑色更改为红色时 我的意思是 就像当我启动程序并执行代码时 它会在某个时刻改变颜色 例如 code if a 2 change text color to r
  • SimpleCov 报告使用 Spork 运行 RSpec 测试后未在 Rails 3 应用程序中生成

    我刚刚安装了简单冠状病毒gem 在我的 Rails 3 2 6 应用程序上生成代码覆盖率报告 它与 RSpec 配合得很好 但与 Spork 配合不好 我可以通过运行获得所需的正确报告rspec no drb spec 但我也想让它们与 S
  • 没有删除语句的 MySQL 复制

    我一直在寻找一种方法来防止MySQL删除语句被从站处理 我正在从事数据仓库项目 我想在将数据复制到从站后从生产服务器中删除数据 完成这件事的最佳方法是什么 谢谢 做这件事有很多种方法 Run SET SQL LOG BIN 0 在执行删除之
  • 如何交错流(带背压)

    假设我有两个可能无限的流 s1 a b c d e s2 1 2 3 4 5 6 7 我想要merge流 然后使用缓慢的异步操作映射合并流 例如 在 Bacon 中 fromPromise and flatMapConcat 我可以将它们与
  • 服务器端多次TIME_WAIT的代价是多少?

    假设有一个客户端与服务器建立了大量短期连接 如果客户端关闭连接 会出现很多端口TIME WAIT在客户端声明 由于客户端耗尽了本地端口 因此无法快速尝试新的连接 如果服务器关闭连接 我会看到很多TIME WAIT在服务器端 然而 这有什么坏
  • SQL 在 WHERE 子句中合并

    我正在尝试在我拥有的存储过程中实现可选参数 但遇到了问题 这是一个简化的查询来说明该问题 SET ANSI NULLS OFF DECLARE MiddleName VARCHAR 20 SET MiddleName NULL SELECT
  • NumberFormat 解析不够严格

    我有一个JFormattedTextField with a NumberFormat与 Locale US 因此小数点分隔符是点 分组分隔符是逗号 现在 我在此文本字段中键入字符串 1 23 并将焦点移至另一个组件 我希望该字符串会消失
  • Hibernate 升级:StatisticsService()

    我正在将 hibernate 从 3 6 升级到 4 3 5 更换后 jar文件和一些已弃用的包 类以及基本数据类型我仍然遇到一些错误StatisticsService 在org hibernate jmx包裹 错误如下 1 error p
  • Ruby on Rails:在布局中的特定位置生成特定视图

    如果我有一个标记 然后我的所有视图都会呈现在布局中的同一位置 我可以有不同的吗不同视图的标签 那我该怎么办呢 谢谢 调查ActionView Helpers CaptureHelper 您可以在您的视图中执行以下操作 这将在 content
  • 复制 QTableView 的一部分

    因此 我有一个问题与我在这里看到的另一个问题非常密切相关 但当我尝试在那里提出我的问题时 我没有得到答复 我希望通过提出这个新问题 有人可以帮助我 基本上我只想复制我创建的表格的一部分 以便我可以将其粘贴到 Excel 文件中 这是我所拥有
  • Python 中的 SSLSocket 密码/密码

    我最近一直在考虑为我的一个应用程序制作 iOS 推送通知服务 它有一个 Python 2 7 后端 所以我想用 Python 而不是 PHP 或其他任何东西 来完成它 我有发送通知并且设备接收通知的代码 但是每次运行该代码时 它都会要求我手
  • 如何将 Javascript 日期时间转换为 C# 日期时间?

    我一直在读到 如果你想从 JavaScript 日期转换为 C 日期 你应该使用getTime 然后将该结果添加到 C DateTime 假设我有这样的 JavaScript 时间 Date Tue Jul 12 2011 16 00 00
  • 如何为iPhone创建一个黑色渐变的UIButton?

    我想在 iOS 中创建一个具有普通黑色渐变主题的 UIButton 我查看了文档 似乎不知道如何执行此操作 当我创建按钮时 我得到一个没有颜色的圆角矩形按钮 这是我的代码 UIButton leagueTeamButton UIButton
  • C++ 当从函数返回结构体时,汇编中实际发生了什么?

    我试图弄清楚如果从函数中按值返回结构 而不是返回指向该结构的指针 那么在 C 中实际会发生什么 如果函数只能返回适合寄存器的值 那么当按值发送结构时 如何进行通信 我在某处读到过 我尝试在 Godbolt 上测试它 看看它在做什么 但我不了
  • SSL_connect 返回=1 errno=0 状态=错误:证书验证失败(无法获取本地颁发者证书)

    我正在尝试从我的应用程序发布到网络服务 但经常收到以下错误 SSL connect returned 1 errno 0 state error certificate verify failed unable to get local i
  • 如何使用 doc 任务生成 scaladoc 后运行 bash 脚本?

    我有一个简短的 Bash 脚本 它对我的 Scaladoc 注释进行查找和替换 以便生成第三方库的外部文档的链接 我希望每次使用以下命令生成 Scaladocs 时都运行此脚本doc task 我怎样才能实现这个目标 这实际上很容易 首先
  • Newtonsoft JSON 序列化 byte[] 属性 [重复]

    这个问题在这里已经有答案了 public class MyClass public byte Bytes get set MyClass obj new MyClass obj Bytes new byte 1 22 44 55 strin
  • HTML5 音频 - currentTime 属性不准确?

    我正在研究一下 HTML5
  • 逐行测试多个(并非所有)列是否相等

    我想按行检查多列是否全部相等 我想出了一种复杂的方法来计算每组每个值的出现次数 但这似乎有些 麻烦 样本数据 sample df lt data frame id letters 1 6 group rep c r l 3 stringsA
  • 比较两个音频文件[重复]

    这个问题在这里已经有答案了 基本上 我有很多代表同一首歌的音频文件 然而 有些歌曲的质量比原曲差 有些经过编辑 与原曲不再相符 我想做的是以编程方式将这些音频文件与原始音频文件进行比较 看看哪些音频文件与该歌曲匹配 无论质量如何 直接比较显