【问题标题】:Python: time stretch wave files - comparison between three methodsPython:时间拉伸波形文件 - 三种方法之间的比较
【发布时间】:2020-05-09 01:57:49
【问题描述】:

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

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

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 会在信号中添加不需要的回声(或类似的东西)。

所以,我的问题是:这三种方式的主要区别是什么?有没有更好的方法来做到这一点?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    这种方法所做的只是使用bilinear interpolation 对给定信号进行插值。这种方法适用于图像,但让我觉得不适合音频信号。你听过结果吗?它听起来像原始信号只是更快/更慢吗?我不仅会假设节奏变化,还会假设频率和其他影响。

    skimage.transform.resize(signal, (dimension, 1)).squeeze() (docs)

    同样,这是用于图像,而不是声音。除了插值(spline interpolation 默认为1),此函数还可以对图像进行抗锯齿处理。请注意,这与避免音频混叠效果 (Nyqist/Aliasing)无关,因此您可能应该通过传递 anti_aliasing=False 将其关闭。同样,我会假设结果可能不是您想要的(改变频率,其他伪影)。

    怎么办?

    IMO,您有多种选择。

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

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

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

    4. 将信号重新采样到另一个采样频率,例如44100 Hz -> 43000 Hz 或 44100 Hz -> 46000 Hz 使用像 resampy 这样的库,然后 假装 它仍然是 44100 Hz。这仍然会改变频率,但至少您可以获得 resampy 对结果进行适当过滤的好处,这样您就可以避免前面提到的aliasing,否则会发生这种情况。

    【讨论】:

    • 很好的答案,谢谢。但是,我使用的是 Windows 10 操作系统,上面有 python 3.6,我正在尝试使用命令 pip install rubberband 安装橡皮筋,但它会引发以下错误:“橡皮筋的构建轮失败”,我无法在我的项目中使用 Python 3.5,请问您有什么建议吗?
    • 抱歉,我没有使用橡皮筋的实际经验。它的声誉非常好,这就是我推荐它的原因。也许在github.com/bmcfee/pyrubberband/issues 上提出问题?
    猜你喜欢
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多