0

我想为机器学习项目增加我的音频数据。我正在寻找一种方法来逐渐调制音频剪辑的音高以模拟多普勒效应。从我所见,Librosa 和 Torchaudio 仅支持基本的音高转换功能,除了在 GarageBand 或其他一些 DAW 中手动执行之外,我不知道如何处理这个问题 :) 谢谢!

4

2 回答 2

0

Pedalboard是一个用于音频数据增强和预处理的库,允许使用任何 VST3 插件。然后,您可以使用Waves 的 Doppler或类似的 VST 插件。

于 2022-01-16T21:32:59.773 回答
0

在没有音频库的情况下如何编辑原始 PCM 音频数据一文中是否列出了任何库?可用和工作?

如果您有原始源 PCM 并且有播放 PCM 的方法,则可以计算改变音高的变换。

最简单的情况是我们从输出的 PCM 中每隔一帧丢弃一次。在这种情况下,正在播放的信号片段需要 1/2 的时间。这将导致输出的音高是原始音高的 2 倍。

对于中间(以速度播放和以 2xs 速度播放)播放速率,我们可以使用线性插值计算 PCM 值。对于这种变换,线性插值已被普遍接受为“足够准确”。

假设我们希望得到的音高是原始音高的 110%(例如,440 Hz 的音调以 484 Hz 播放)。为此,我们创建一个以 1.1 为增量递增的索引或游标。给定一系列 PCM 数据点 pcmIn[0]...pcmIn[n],第一个值是 pcmIn[0],第二个值是 pcmIn 1和 pcmIn[2] 之间的 1/10,并且可以计算如下:

pcmOut[1] = pcmIn[1] * (0.9) + pcmIn[2] * (0.1)

接下来将如下:

pcmOut[2] = pcmIn[2] * (0.8) + pcmIn[3] * (0.2)

我把它留给 OP 以在 Python 中以更有用/更通用的形式实现它。我只在 Java 中做过这个(其中 idx 是递增的浮动光标):

    int intIndex = (int) idx;
    pcmOut = pcmIn[intIndex + 1] * (idx - intIndex) 
            + pcmIn[intIndex] * ((intIndex + 1) - idx);

无论如何,多普勒效应可以通过让 idx 变量的增量在音乐用语中稍微“尖锐”(大于 1)直到移动物体经过的点,并且稍微平坦(小于 1)一次来实现物体开始移开。该数量将根据接近角度和物体相对于空气中声速的速度来计算。

必须注意逐渐改变增量。突然的大变化可能会引入信号不连续性,听起来像是咔哒声瞬变。对于可以容忍的增量变化大小,我没有经验法则。只是要听一听,就是我如何处理这种情况。例如,直接从 1x 到 2x 的播放速度可能会导致点击,但是如果您从 1 过渡到 2 且增量超过 441 个 PCM 值(过渡的总持续时间超过 1/100以 44100 采样率第二)——嗯,我从来没有听说过如此谨慎的情况下会产生瞬态。我更经常使用 64 或 128 个样本来从速度 A 到速度 B,甚至更少可以工作。

于 2022-01-17T20:54:50.823 回答