我正在构建一个基于音频的深度学习模型。作为预处理的一部分,我想增强数据集中的音频。我想要进行的一种增强是应用RIR(房间冲激响应)函数。我正在使用Python 3.9.5和TensorFlow 2.8。
在Python中,如果给定的RIR是n个点的有限脉冲响应(FIR),标准方法是使用SciPy lfilter。
使用
在Python中,如果给定的RIR是n个点的有限脉冲响应(FIR),标准方法是使用SciPy lfilter。
import numpy as np
from scipy import signal
import soundfile as sf
h = np.load("rir.npy")
x, fs = sf.read("audio.wav")
y = signal.lfilter(h, 1, x)
循环运行所有文件可能需要很长时间。使用TensorFlow map
工具在TensorFlow数据集上进行操作:
# define filter function
def h_filt(audio, label):
h = np.load("rir.npy")
x = audio.numpy()
y = signal.lfilter(h, 1, x)
return tf.convert_to_tensor(y, dtype=tf.float32), label
# apply it via TF map on dataset
aug_ds = ds.map(h_filt)
使用
tf.numpy_function
:tf_h_filt = tf.numpy_function(h_filt, [audio, label], [tf.float32, tf.string])
# apply it via TF map on dataset
aug_ds = ds.map(tf_h_filt)
我有两个问题:
- 这种方法是否正确且足够快(50,000个文件少于一分钟)?
- 是否有更快的方法来完成它?例如,使用内置的TensorFlow函数替换SciPy函数。我没有找到与
lfilter
或SciPy's convolve等效的函数。
tf.dataset
的map
中使用TF的急切执行(.numpy()
)。你需要将函数包装在tf.numpy_function
中。你可能还想看看tf.nn.conv1d
来进行一维卷积。 - Lescureltf.data
模型是一种流式模型,因此在训练模型时数据将被分批处理。这可能足够快,也可能不够快,具体取决于您的需求。 - Lescureltf.numpy_function
的示例。它是正确的吗?它能工作吗? - Triceratops