2012-08-04 5 views
2

나는 아주 사소한 것처럼 보이는 큰 문제가있는 것처럼 보입니다.Java에서의 간단한 Wav 비교

목표 : 두 개의 Wav 파일을 비교하여 하나의 (작은 파일)이 다른 파일 (큰 파일)의 일부인지 확인하십시오.

테스트 첫 번째로, 오디오의 길이는 1 분이고 30 초를 다른 파일로 내 보냈습니다. 먼저 byte [] 데이터를 읽고 로그를 통해 살펴 보았습니다. 둘 다 동일한 소스 파일에 있어도 상관 관계가 전혀 없습니다. 그런 다음 WavFile 및 MusicG와 같은 라이브러리를 사용해 보았지만 두 파일에서 나오는 두 개의 "지문"또는 원시 바이트 [] 데이터 사이의 상관 관계를 볼 수 없습니까?

질문 : 유사점에 대해 두 개의 Wav 파일을 분석하는 가장 간단한 방법은 무엇입니까? 나는 동일한 소스 오디오 파일에서 나온 것이라면 바이트 바이트가 동일해야한다는 것을 읽었습니다. 그러므로 각각의 표본을 취하면 그들은 같아야합니다. 그게 무슨 일이 아니야?

이제는이 문제에 대해 이미 충분히 조사했지만 거의 모든 답변이 25-50 % 만 완료되어 어딘가에 거대한 세그먼트가 누락 된 것처럼 느껴집니다.

제공되는 솔루션을 이용해 주셔서 감사합니다.

[EDIT] 소스 오디오 파일은 단지 1 분 Wav 파일입니다 ... 내가 작은 파일을 생성하기 위해 처음 30 초를 추출했습니다. 그런 다음 짧은 (30 초)과 긴 (1 분)을 비교합니다. Audacity에서 1141kbps, 16bit, Wav로 둘 다 내보냈습니다. 이것은 내가이 답변이없는 질문에서 코드보기를 들어

을 생각 ... 서식 문제를 피하려고했다 : Wav comparison, same file

+0

이 경우 "원본 오디오 파일"은 무엇입니까? –

+0

소스 오디오 파일은 단지 1 분 Wav 파일입니다 ... 나는 작은 파일을 생성하기 위해 처음 30 초를 추출했습니다. 그런 다음 짧은 (30 초)과 긴 (1 분)을 비교합니다. –

+0

30 초를 내보낼 때 정확하게 동일한 형식을 사용했는지 확인 했습니까? –

답변

3

여기에가는 몇 가지 이상한 일이있다. 자세히 설명하지 않고, 나는 단지 "추출"이라고하는 것과 같은 간단한 프로그램을 만들 때 정확한 사본을 만들지 못한다고 말할 것입니다. 예를 들어, Libsndfile은 int 사운드 파일에서 float (Audacity가 내부적으로 사용하는 것)에서 int로 이동할 때 투명하게 변환하지 않습니다. Audacity가 libsndfile을 사용한다면 (물론 확신합니다), 파일의 투명한 복사본을 만들지 않으므로 메서드가 작동하지 않습니다. 예 : 다음을 시도하십시오. wav 파일을 열고 동일한 매개 변수를 사용하여 파일을 내 보냅니다. diff를 사용하여 입력과 출력을 비교하십시오. 대체로 그들은 다를 것입니다. http://www.mega-nerd.com/libsndfile/FAQ.html#Q010

당신은 다른 응용 프로그램을 시도해 볼 수도 있습니다,하지만 난 당신이 사람들이 대담을 사용할 때이도 작업 할 생각 : libsndfile의 http://blog.bjornroche.com/2009/12/int-float-int-its-jungle-out-there.html

저자는 여기에 자신의 디자인 결정을 방어 : 자세한 내용은 여기를 참조하십시오.

의견 중 하나가 교차 상관 관계를 제안했습니다. 오디오 지문을 사용할 수도 있습니다. 두 솔루션 모두 다소 복잡합니다.

아마도 가장 간단한 해결책은 기본 형식으로 데이터를 읽는 것입니다. 예를 들어 파일이 16 비트이면 16 비트 정수 (바이트가 아님)를 읽습니다. 그런 다음 더 짧은 것에 비교해보십시오. 그러나 약간의 오류를 허용하는 것과 비교하십시오. (내 머리 꼭대기에서 벗어나, 결코 하나 이상의 사람이되어서는 안된다는 것을 확신합니다. 그러나 그것은 대담을 지날 때마다 있습니다.) 따라서 "이 값들이 같은지"묻는 대신에 "서로의 엡실론 안에있는이 값들은 무엇입니까"라고 물어야합니다. 물론 그 안에 많은 침묵이있는 것들을 위해, 당신은 일종의 예외를 만들고 싶어 할 것입니다.

대담성이 디더를 사용하고있을 수도 있으므로 스위치가 꺼져 있는지 확인하십시오. 디더는 중요한 잡음을 추가 할 수 있으므로이를 방정식으로 작업하려면 다른 솔루션이 필요합니다.