サウンドファイル(波)を比較する方法についていくつかの研究をしています。基本的に、保存されているサウンドファイル(wav)をマイクからのサウンドと比較したいと思います。したがって、最後に、自分の音声コマンドをいくつか事前に保存したいと思います。次に、アプリを実行しているときに、事前に保存されたファイルをマイクからの入力と比較したいと思います。
まったく同じように2回続けて言うのは難しいので、比較するときは少し余裕を持って考えました。
したがって、グーグルを実行した後、pythonこのモジュールにはwaveという名前があり、Wave_readオブジェクトがあります。そのオブジェクトにはreadframes(n)という名前の関数があります。
最大nフレームのオーディオをバイト文字列として読み取り、返します。
これらのバイトには何が含まれていますか?フレームごとに比較して、一度に1フレームずつWaveファイルをループすることを考えています。
オーディオフレームまたはサンプルには、その特定の時点での振幅(ラウドネス)情報が含まれています。音を出すために、何万ものフレームが順番に再生されて周波数が生成されます。
CD品質のオーディオまたは非圧縮ウェーブオーディオの場合、1秒あたり約44,100フレーム/サンプルがあります。これらの各フレームには16ビットの解像度が含まれているため、サウンドレベルをかなり正確に表現できます。また、CDオーディオはステレオであるため、実際には2倍の情報があり、左チャネル用に16ビット、右チャネル用に16ビットです。
pythonでサウンドモジュールを使用してフレームを取得すると、一連の16進文字として返されます。
これらの値を変換して比較するには、最初にpython waveモジュールの関数を使用して、ビット深度とチャネル数を確認する必要があります。それ以外の場合は、不一致の品質設定を比較します。
単純なバイトごとの比較では、ある程度の許容範囲が設定されていても、一致が成功する可能性はほとんどありません。音声パターン認識は非常に複雑で微妙な問題であり、依然として多くの研究の対象となっています。
最初にすべきことは、データをその周波数に変換するためのフーリエ変換です。ただし、かなり複雑です。音声だけを録音していないように聞こえるので、ここでは音声認識ライブラリを使用しません。次に、さまざまなタイムシフトを試して(サウンドが正確に整列されていない場合)、類似性関数を定義する必要がある場合に、最も類似性が高いものを使用します。ああ、あなたは両方の信号を正規化する必要があります(同じ最大ラウドネス)。
受け入れられた説明は少し間違っていると思います。
frameは、グラフィック形式ではstrideのように見えます。 インターリーブステレオ@ 16ビット/サンプルの場合、フレームサイズは2*sizeof(short)
= 4バイトです。非インターリーブステレオ@ 16ビット/サンプルの場合、左チャネルのサンプルはすべて次々にあるため、フレームサイズはsizeof(short)
だけです。