我正在构建一个声音检测应用程序的原型,最终将在手机(iPhone / Android)上运行。它需要接近实时,以便在识别出特定声音时给予用户足够快的响应。我希望使用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采样率== 4000样品以1/100秒的速率进料(每个新的20个样品)。该模型可能还需要为整个录制保留一些运行总计。
指教?
答案 0 :(得分:1)
我需要更多地了解您的应用程序要求,但为了简单起见,我建议从选项#3开始。解决任意声音问题的常用方法是:
有很多变化和其他可能的方法。例如,对于语音,通常使用MFCC作为你的特征生成器,然后运行LSTM来分离音素,但是因为你提到声音检测我猜你不需要任何这种先进的。