我有两个音频信号,我们称它们为信号 1 和信号 2。信号 1 由信号 2 的不同部分组成。例如,假设信号 1 的长度为 15 秒。信号 1 的前 10 秒来自信号 2 的 00:05-00:15。信号 1 的剩余 5 秒来自信号 2 的 00:30-00:35。
我尝试查找信号 2 中的“感兴趣的部分”,即期望的结果将是
f(signal1,signal2)->{00:05-00:15, 00:30-00:35}
我想知道是否有一种确定性的方法来进行搜索,同时又不会变得太复杂。信号 2 可能很大。
我试图通过注释数据并训练分类器来找到信号 1 中的关节。然后,假设这个分类器足够并且找到这些关节,那么它就变成了一个我可以在 O(n log n) 中解决的搜索问题。有没有更简单(并且希望更便宜的方法)来做到这一点?
面临的问题是音频匹配,特别是查找长音频信号(信号 2)中短音频片段(信号 1)的位置。是对的,蛮力方法很快就会变得计算成本高昂。以下是一些可以考虑的更有效和更复杂的方法:
1. 基于相关性的方法
- 思路: 使用信号 1 和信号 2 之间的互相关性。当信号 1 出现在信号 2 中时,互相关性将在时域中达到峰值。
- 优点: 概念上简单,实施良好。
- 缺点: 可能对噪声敏感,如果信号 1 中存在信号 2 中不存在的任何细微变化,则可能无法很好地执行。
-
改进:
- 在计算相关性之前,考虑使用包络对信号进行预处理,以提高对轻微时移和噪声的鲁棒性。
- 使用快速傅里叶变换 (FFT) 有效地计算相关性。
2. 光谱哈希
- 思路: 为信号 2 的短片段创建“指纹”,并将信号 1 的片段与它们进行匹配。
- 优点: 可以非常高效,即使存在一定程度的噪声或失真,也可以很好地工作。
- 缺点: 需要仔细选择哈希函数,并且可能难以完美地匹配精确的边界。
-
步骤:
- 将信号 2 分成短的时间窗口。
- 从每个窗口中提取频谱特征(例如,使用短时傅里叶变换 (STFT)) 并创建一个哈希(例如,使用峰值频率或其他频谱特征)。
- 为信号 1 执行相同的操作。
- 识别信号 1 和信号 2 数据库中的匹配哈希值,以找到匹配的位置。
3. 动态时间规整 (DTW)
- 思路: 如果信号 1 的部分在时间上被拉伸或压缩(例如,由于记录条件的变化),DTW 是一种测量两个时间序列之间相似性的强大技术。
- 优点: 对信号长度的变化具有鲁棒性。
- 缺点: 计算成本可能很高,尤其是对于长信号。
- 适用性: 如果预计信号 1 的片段在信号 2 中可能具有不同的速度或持续时间,则 DTW 非常有用。
实施提示
-
Python 库:
使用
librosa
、scipy.signal
和numpy
等库来处理音频、计算相关性和实现光谱哈希。 - 优化: 对于大型数据集,考虑使用索引或近似最近邻搜索技术来加快搜索过程。
最佳方法将取决于的音频数据的具体特征以及愿意接受的复杂程度。如果需要高精度且信号可能失真,则光谱哈希或 DTW 是不错的选择。如果速度是一个主要因素,并且信号相对干净,则基于相关性的方法可能就足够了。
标签:python,audio,signal-processing From: 76330462