私は、自分で歌を歌って録音できるJavaパーソナルプロジェクトを作成しています。プログラムは、そのメロディーに最適な曲を(事前に選択された小さな選択から)ロードします。これまで、Java SoundAPIを使用してユーザーがオーディオファイルをWAVEファイルとして録音する機能を実装しました。オーディオの類似性については、オーディオファイル間の相関を実行でき、相関グラフに大きなピークがあるかどうかを測定することで、オーディオファイルが類似しているかどうかを判断できることを確認しました。
信号処理スタック交換の次の投稿を読みましたhttps://dsp.stackexchange.com/questions/736/how-do-i-implement-cross-correlation-to-prove-two-audio-files-are-similarこれは、高速フーリエ変換を使用して畳み込み(時間遅延オーディオで機能する相関)を実現する方法について説明しています。FFTを使用するためにGithubにJTransformsプロジェクトをインポートしましたが、WAVEファイルを相関または畳み込みの実行に使用できる数値表現(値の大きな配列のようなもの)に変換する方法がわかりません。これについてのアドバイスは大歓迎です!
.wavを読み取るには、クラスを使用しAudioInputStream
ます。チュートリアル「ファイルとフォーマットコンバーターの使用」に例が示されています。これは、記事の「サウンドファイルの読み取り」セクションの最初のコード例です。
次のハードルは、バイトを意味のあるPCMに変換することです。上記のコード例には、次のようなコメント行があります。
// Here, do something useful with the audio data that's
// now in the audioBytes array...
これが、バイトをPCMに変換できるポイントです。正確なアルゴリズムは、を返すAudioInputStream
のgetFormat
メソッドを介して検査できる形式によって異なりますAudioFormat
。
この形式は、PCM値あたりのバイト数(たとえば、16ビットエンコーディングはPCM値あたり2バイト)とバイト順序(リトルエンディアンまたはビッグエンディアン)を示します。オーディオがステレオの場合、PCM値は左と右の間で交互になります。
バイトからのPCM値の構築には、ビットシフトが含まれます。あなたはこれを処理する方法を知っていると思います。データが符号付きPCM形式であると仮定して、16ビット値を作成した場合の自然な結果は、符号付き短整数になります。したがって、最後のステップは、多くの場合、Short.MAX_VALUEで除算して、ショートを-1から1の範囲の符号付きフロートに変換します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加