我正在构建最终将在手机(iPhone/Android)上运行的声音检测应用程序的原型(prototype)。当识别到特定声音时,它需要接近实时才能向用户提供足够快的响应。我希望使用 tensorflow 来实际构建和训练模型,然后将其部署在移动设备上。
在这种情况下,我不确定将数据提供给 tensorflow 进行推理的最佳方式。
选项 1:仅将新获得的样本提供给模型。
在这里,模型本身保留了先前信号样本的缓冲区,新样本被附加到该缓冲区中,整个事情都得到处理。
就像是:
samples = tf.placeholder(tf.int16, shape=(None))
buffer = tf.Variable([], trainable=False, validate_shape=False, dtype=tf.int16)
update_buffer = tf.assign(buffer, tf.concat(0, [buffer, samples]), validate_shape=False)
detection_op = ....process buffer...
session.run([update_buffer, detection_op], feed_dict={samples: [.....]})
这似乎可行,但是如果样本每秒被推送到模型 100 次,那么 tf.assign 内部会发生什么(缓冲区可以增长到足够大,如果 tf.assign 不断分配内存,这可能无法正常工作)?
选项 2:将整个记录提供给模型
iPhone 应用程序在这里保存状态/记录样本,并将整个记录提供给模型。输入可能会变得非常大,并且在整个记录上重新运行检测操作将不得不在每个循环中继续重新计算相同的值。
选项 3:提供数据的滑动窗口
在这里,应用程序保留了整个记录的数据,但只将最新的数据片段提供给模型。例如。最后 2 秒以 2000 采样率 == 以 1/100 秒的速率馈送 4000 个样本(每个新的 20 个样本)。该模型可能还需要为整个记录保留一些运行总计。
建议?
最佳答案
我需要更多地了解您的应用程序要求,但为了简单起见,我建议从选项 #3 开始。针对任意声音处理此问题的常用方法是:
有很多变化和其他可能的方法。例如,对于语音,通常使用 MFCC 作为特征生成器,然后运行 LSTM 来分离音素,但既然你提到了声音检测,我猜你不需要这么高级的东西。
关于audio - 将实时音频数据馈送到移动设备上的 tensorflow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41525251/