我正在对语音数据集进行一些数据增强,并且我想在时域中拉伸/压缩每个音频文件。
我找到了以下三种方法来做到这一点,但我不确定哪一种是最好的或更优化的方法:
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 https://librosa.github.io/librosa/generated/librosa.effects.time_stretch.html)
本质上,这种方法使用stft
(短时傅立叶变换 https://en.wikipedia.org/wiki/Short-time_Fourier_transform),使用相位声码器 https://en.wikipedia.org/wiki/Phase_vocoder并使用逆stft
重建时域信号。通常,当这样做时,会引入一点“相位”,即金属叮当声,因为相位无法 100% 重建。这可能就是您所认为的“回声”。
请注意,虽然这种方法有效地在时域中拉伸音频(即输入和输出都在时域中),但工作实际上是在频域中完成的。
cv2.resize(信号, (1, 维度)).squeeze() (docs https://docs.opencv.org/2.4/modules/imgproc/doc/geometric_transformations.html#void%20resize(InputArray%20src,%20OutputArray%20dst,%20Size%20dsize,%20double%20fx,%20double%20fy,%20int%20interpolation))
这种方法所做的就是使用内插给定信号双线性插值 https://en.wikipedia.org/wiki/Bilinear_interpolation。这种方法适用于图像,但我认为不适合音频信号。你听过结果了吗?它听起来和原始信号一样,只是更快/更慢吗?我认为不仅节奏会改变,频率也会改变,也许还有其他影响。
skimage.transform.resize(信号, (维度, 1)).squeeze() (docs https://scikit-image.org/docs/dev/api/skimage.transform.html#skimage.transform.resize)
再次强调,这适用于图像,而不是声音。除了插值之外(样条插值 https://en.wikipedia.org/wiki/Spline_interpolation与订单1
默认情况下),此函数还可以对图像进行抗锯齿处理。请注意,这有nothing与避免音频混叠效应有关(奈奎斯特/混叠 https://en.wikipedia.org/wiki/Nyquist_frequency#Aliasing),因此你可能应该通过传递来关闭它anti_aliasing=False
。同样,我假设结果可能不完全是您想要的(改变频率、其他伪影)。
该怎么办?
IMO,你有多种选择。
如果您输入 ML 算法的内容最终类似于 Mel 频谱图,您可以简单地将其视为图像并使用 skimage 或 opencv 方法对其进行拉伸。频率范围将被保留。我已经成功地使用了这种方法这张音乐节奏估计纸 https://www.researchgate.net/profile/Hendrik_Schreiber/publication/328028453_A_Single-Step_Approach_to_Musical_Tempo_Estimation_Using_a_Convolutional_Neural_Network/links/5bb3933692851ca9ed349cf7/A-Single-Step-Approach-to-Musical-Tempo-Estimation-Using-a-Convolutional-Neural-Network.pdf.
使用更好的 time_stretch 库,例如橡皮筋 https://pyrubberband.readthedocs.io/en/stable/generated/pyrubberband.pyrb.time_stretch.html#pyrubberband.pyrb.time_stretch。 librosa 很棒,但其当前的时间尺度修改(TSM)算法并不是最先进的。有关 TSM 算法的回顾,请参见示例本文 https://www.mdpi.com/2076-3417/6/2/57/pdf.
忽略频率变化的事实,只需定期向信号添加 0 个样本或定期从信号中删除样本(就像图像插值一样)。如果您不延伸得太远,它仍然可以用于数据增强目的。毕竟,如果音频内容具有更高或更低的频率,则单词内容不会改变。
将信号重新采样到另一个采样频率,例如44100 Hz -> 43000 Hz
or 44100 Hz -> 46000 Hz
使用像这样的库resampy https://github.com/bmcfee/resampy进而pretend仍然是 44100 Hz。这仍然会改变频率,但至少您可以获得 resampy 对结果进行适当过滤的好处,这样您就可以避免上述情况aliasing https://en.wikipedia.org/wiki/Nyquist_frequency#Aliasing,否则会发生这种情况。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)