2017-01-07 5 views
1

最終的に電話(iPhone/Android)で実行されるサウンド検出アプリケーションのプロトタイプを構築しています。特定のサウンドが認識されたときにユーザーに十分な応答を与えるためには、リアルタイムに近い必要があります。私は実際にテンソルフローを使ってモデルを構築して訓練し、それをモバイルデバイスに展開することを望んでいます。モバイルデバイス上でテンソルフローにリアルタイムオーディオデータを送信

この場合、推論のためのテンソルフローにデータを供給するための最良の方法です。

オプション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:ここではデータ

のスライディングウィンドウを養うアプリは全体の記録のためのデータを保持しますが、モデルへのデータの唯一の最新のスライスを供給します。例えば。 2000サンプリングレートで最後の2秒= 1/100秒のレートでフィードされた4000サンプル(各20サンプル新たに)。モデルはまた、録音全体でいくつかの実行中の合計を保持する必要があります。

Advise?

答えて

1

アプリケーションの要件についてもう少し詳しく知っておく必要がありますが、簡単にするために、オプション3から始めることをおすすめします。任意のサウンドでこの問題に近づく一般的な方法は次のとおりです。

  • 音声や音声の発声の開始を検出するトリガーがあります。これは、オーディオのレベルを持続させることができます。
  • ノイズの開始に合わせて、固定サイズのウィンドウでスペクトログラムを実行します。
  • ネットワークの残りの部分は、音を分類するための標準的な画像検出装置(通常はサイズを小さくする)です。

さまざまなアプローチがあります。たとえば、スピーチの場合、MFCCをフィーチャージェネレータとして使用し、音素を分離するためにLSTMを実行するのが一般的ですが、サウンドの検出について言及しているので、この高度なものは必要ありません。

関連する問題