私は現在困惑しています。私は周りを見回して、オーディオの比較を実験してきました。私はかなりの量の資料と、それを行うためのさまざまなライブラリとメソッドへの大量の参照を見つけました。
今のところ、 Audacityを使って「long.wav」という 3 分間の wav ファイルをエクスポートし、その最初の 30 秒を「short.wav」というファイルに分割しました。私は、それぞれのJavaを介してデータを視覚的にログ(log.txt)に記録でき、値の間で少なくともいくつかの視覚的な類似性を確認できるはずです....ここにいくつかのコードがあります
主な方法:
int totalFramesRead = 0;
File fileIn = new File(filePath);
BufferedWriter writer = new BufferedWriter(new FileWriter(outPath));
writer.flush();
writer.write("");
try {
AudioInputStream audioInputStream =
AudioSystem.getAudioInputStream(fileIn);
int bytesPerFrame =
audioInputStream.getFormat().getFrameSize();
if (bytesPerFrame == AudioSystem.NOT_SPECIFIED) {
// some audio formats may have unspecified frame size
// in that case we may read any amount of bytes
bytesPerFrame = 1;
}
// Set an arbitrary buffer size of 1024 frames.
int numBytes = 1024 * bytesPerFrame;
byte[] audioBytes = new byte[numBytes];
try {
int numBytesRead = 0;
int numFramesRead = 0;
// Try to read numBytes bytes from the file.
while ((numBytesRead =
audioInputStream.read(audioBytes)) != -1) {
// Calculate the number of frames actually read.
numFramesRead = numBytesRead / bytesPerFrame;
totalFramesRead += numFramesRead;
// Here, do something useful with the audio data that's
// now in the audioBytes array...
if(totalFramesRead <= 4096 * 100)
{
Complex[][] results = PerformFFT(audioBytes);
int[][] lines = GetKeyPoints(results);
DumpToFile(lines, writer);
}
}
} catch (Exception ex) {
// Handle the error...
}
audioInputStream.close();
} catch (Exception e) {
// Handle the error...
}
writer.close();
次に、PerformFFT :
public static Complex[][] PerformFFT(byte[] data) throws IOException
{
final int totalSize = data.length;
int amountPossible = totalSize/Harvester.CHUNK_SIZE;
//When turning into frequency domain we'll need complex numbers:
Complex[][] results = new Complex[amountPossible][];
//For all the chunks:
for(int times = 0;times < amountPossible; times++) {
Complex[] complex = new Complex[Harvester.CHUNK_SIZE];
for(int i = 0;i < Harvester.CHUNK_SIZE;i++) {
//Put the time domain data into a complex number with imaginary part as 0:
complex[i] = new Complex(data[(times*Harvester.CHUNK_SIZE)+i], 0);
}
//Perform FFT analysis on the chunk:
results[times] = FFT.fft(complex);
}
return results;
}
この時点で、変換前の audioBytes、Complex 値、FFT の結果など、あらゆる場所でログを記録してみました。
問題:どのような値をログに記録しても、各 wav ファイルの log.txt は完全に異なります。私はそれを理解していません。small.wav を large.wav から取得した (そしてそれらはすべて同じプロパティを持っている) ことを考えると、生の wav byte[] データまたは Complex[][] fft データのいずれかの間に非常に大きな類似性があるはずです。 ..またはこれまでの何か..
これらの計算のどの時点でもデータが似ていない場合、これらのファイル を比較するにはどうすればよいでしょうか。
私は音声分析に関してかなりの知識が欠けていることを知っています。これが私がボードに助けを求める理由です! 提供できる情報、ヘルプ、または修正をありがとう!!