opencv - python : time stretch wave files - comparison between three methods

标签 opencv machine-learning scikit-image librosa data-augmentation

我正在对语音数据集进行一些数据增强,并且我想在时域中拉伸(stretch)/压缩每个音频文件。

我找到了以下三种方法来做到这一点,但我不确定哪一种是最好的或更优化的方法:

dimension = int(len(signal) * speed)
res = librosa.effects.time_stretch(signal, speed)
res = cv2.resize(signal, (1, dimension)).squeeze()
res = skimage.transform.resize(signal, (dimension, 1)).squeeze()

但是,我发现 librosa.effects.time_stretch 向信号添加了不需要的回声(或类似的东西)。

那么,我的问题是:这三种方式的主要区别是什么?还有更好的方法吗?

最佳答案

librosa.effects.time_stretch(信号, 速度) ( docs )

本质上,这种方法使用 stft ( short time Fourier transform ) 转换信号,并使用 phase vocoder 拉伸(stretch)信号。并使用逆stft来重建时域信号。通常,当这样做时,会引入一点“相位”,即金属 clang ,因为相位无法 100% 重建。这可能就是您所认为的“回声”。

请注意,虽然这种方法有效地在时域中拉伸(stretch)音频(即输入和输出都在时域中),但工作实际上是在频域中完成的。

cv2.resize(信号, (1, 维度)).squeeze() ( docs )

这种方法所做的就是使用bilinear interpolation对给定信号进行插值。 。这种方法适用于图像,但我认为不适合音频信号。你听过结果了吗?它听起来和原始信号一样,只是更快/更慢吗?我认为不仅节奏会改变,频率也会改变,也许还有其他影响。

skimage.transform.resize(信号, (维度, 1)).squeeze() ( docs )

再说一次,这适用于图像,而不是声音。除了插值(默认情况下 spline interpolation 的顺序为 1)之外,此函数还可以对图像进行抗锯齿处理。请注意,这与避免音频锯齿效应 ( Nyqist/Aliasing ) 无关,因此您应该通过传递 anti_aliasing=False 来关闭它。同样,我假设结果可能不完全是您想要的(改变频率、其他伪影)。

做什么?

IMO,你有多种选择。

  1. 如果您输入 ML 算法的内容最终类似于 Mel 频谱图,您可以简单地将其视为图像并使用 skimage 或 opencv 方法对其进行拉伸(stretch)。频率范围将被保留。我在 this music tempo estimation paper 中成功地使用了这种方法.

  2. 使用更好的 time_stretch 库,例如rubberband 。 librosa 很棒,但其当前的时间尺度修改(TSM)算法并不是最先进的。有关 TSM 算法的回顾,请参见示例 this article .

  3. 忽略频率变化的事实,只需定期向信号添加 0 个样本或定期从信号中删除样本(就像图像插值一样)。如果您不延伸得太远,它仍然可以用于数据增强目的。毕竟,如果音频内容的频率较高或较低,则单词内容不会改变。

  4. 将信号重新采样到另一个采样频率,例如44100 Hz -> 43000 Hz44100 Hz -> 46000 Hz 使用类似 resampy 的库然后假装仍然是 44100 Hz。这仍然会改变频率,但至少您会受益于 resampy 对结果进行适当的过滤,从而避免上述的 aliasing ,否则会发生。

关于opencv - python : time stretch wave files - comparison between three methods,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59867659/

相关文章:

python - 我将如何检测这两条线的角度?

python - 分段变换

iphone - iOS 中的 Opencv 内存管理(带 ARC 的 Objective-c)

c++ - 使用 OpenCV 的 Kmeans 聚类中的马哈拉诺比斯距离

python - 匹配两个图像关键点

matlab - DerivativeCheck 因 minFunc 失败

machine-learning - 我的代码在 tensorflow 中使用批量归一化层是否正确?

python - 为什么 skimage.transform.rotate 比 PIL 的 Image.rotate 慢很多?

python - 获得2个像素之间的差异并处理溢出错误

machine-learning - 推荐系统 : Is it content-based filtering?