在 Tensorflow 中处理不同采样率的音频数据

数据挖掘 张量流 采样 音频识别
2022-03-08 07:39:48

我正在尝试在 Tensorflow 中实现(作为一个玩具项目)语音识别的某些方面。我想用作训练和测试数据的音频文件具有不同的采样率(16、20、44 和 44.1 kHz)。

以下列表并不详尽,仅列出了我能想到的几个选项。

  1. 我可以使用 重新采样整个信号(这是非常非周期性的)scipy.signal.resample,可能在用零填充以达到信号长度为 2 的幂之后,然后斩波等量。
  2. 我可以尝试将信号切割成短的、不重叠的窗口,scipy.signal.resample在将它们重新粘合在一起并应用链的其余部分之前,我会使用这些窗口进行修改。
  3. 我可以将信号分割成重叠的窗口,scipy.signal.resample然后以加权方式将它们粘在一起。
  4. 我可以使用获得的频谱图张量tf.contrib.signal.stft并尝试对其进行拉伸,例如使用有理函数插值(反映声道的管模型)
  5. 我可以假设该模型将学会从采样率中抽象出来,甚至可能通过在我感兴趣的实际模型之前添加卷积层来帮助它(或阻碍它?)。

我应该在模型的哪一步标准化采样率,我应该怎么做?

2个回答

如果你已经ffmpeg安装了,你可以直接使用tf.contrib.ffmpeg.decode_audio. 该函数接受一个samples_per_second参数并为您重新采样。以下计算数据的对数幅度短时频谱图。

waveform = tf.squeeze(
    tf.contrib.ffmpeg.decode_audio(
        tf.read_file(tf.placeholder(tf.string, name="filename")),
        file_format=tf.placeholder(tf.string, name="format"),
        samples_per_second=p["sample_rate"],
        channel_count=1))

log_mag_spectrogram = tf.log(tf.abs(tf.contrib.signal.stft(
    waveform, win_length, hop_length,
    n_fft, pad_end=False) + 1e-8))

您是否有理由要在 tensorflow 计算图中进行重新采样?否则,有经过充分测试和建立的工具可以将重新采样作为单独的步骤进行,请考虑运行

$ sox unnormalized_file.wav -r 44100 normalized_file.wav

在您的所有数据文件上。