2016-09-08 10 views
2

길이가 5 초에서 7 초인 약 40 개의 파일로 구성된 작은 데이터베이스에서 비슷한 wav 파일을 찾아야합니다.작은 wav에서 C# 오디오 지문

이 wav 파일은 전화 서비스 제공 업체가 전화를 걸었을 때 제공하는 레코드입니다.

예 :

https://clyp.it/lnz1aybd

내 바늘이 1 ~ 2 초 길이입니다.

모든 웨이브는 pcm이며 8000hz 모노로 인코딩 된입니다.

나는 내 방식 잘못 무엇 성공

https://github.com/protyposis/Aurio

// Setup the sources 
var audioTrack1 = new AudioTrack(new FileInfo("Full5secs.wav")); 
var audioTrack2 = new AudioTrack(new FileInfo("Part2Secs.wav")); 

// Setup the fingerprint generator 
var defaultProfile = FingerprintGenerator.GetProfiles()[0]; 
var generator = new FingerprintGenerator(defaultProfile); 

// Create a fingerprint store 
var store = new FingerprintStore(defaultProfile); 

// Setup the generator event listener (a subfingerprint is a hash with its temporal index) 
generator.SubFingerprintsGenerated += (sender, e) => { 
    var progress = (double)e.Index/e.Indices; 
    var hashes = e.SubFingerprints.Select(sfp => sfp.Hash); 
    store.Add(e); 
}; 

// Generate fingerprints for both tracks 
generator.Generate(audioTrack1); 
generator.Generate(audioTrack2); 

// Check if tracks match 
if (store.FindAllMatches().Count > 0) { 
    Console.WriteLine("overlap detected!"); 
} 

없이 Aurio.AudioFingerPrint를 사용하여 시도?
작은 wav에 대해 누락 된 구성을 아는 사람이 있습니까?

+0

그런데 '다른 도서관'을 묻는 것은 일반적으로 오프 주제로 간주되어 질문을 보류하거나 닫게합니다. 나는 그것에 대해 생각했지만,이 포스트의 경우 요점은 제시된 코드 조각이 일치하는 것을 찾지 못하는 이유입니다. 그래서 완벽하게 주제가 있습니다. 도서관에 묻는 것만으로도 조심하십시오. 시간이 지남에 따라 라이브러리는 변화하고 진화하며 죽습니다. 그렇기 때문에 그러한 질문이 "훌륭하게"만들어지지 않는 이유입니다. 도서관에 대한 질문에 "완전히 대답 할"수있는 방법이 없습니다. 새로운 도서관이나 다른 도서관이 더 좋다고 믿는 사람이 항상 있습니다. – quetzalcoatl

+0

핑거 프린터로 이상적인 사건을 찾을 수 있는지 확인 했습니까? 40 개의 오디오 파일 중 하나를 가져 와서 그 파일을 바늘로 사용하여 프로그램을 실행하십시오. 완벽한 입력으로 모든 (작동중인) 지문 서비스는 적어도 하나의 일치를 반환해야합니다. 그것이 완벽한 바늘에서 작동하지만 실제 입력에 영향을 미치지 않는다면 구성의 문제 일 수도 있고 코드 자체가 아닙니다 (예 : 너무 낮은/높은 시간 등). – quetzalcoatl

+0

"다른 도서관"질문을 삭제 해 주셔서 감사합니다. – Fraga

답변

4

너무 늦을 지 모르지만 나는 Aurio의 저자이며 그 점을 도와 줄 수 있습니다. 나는 당신이 Aurio.Matching.HaitsmaKalker2002 네임 스페이스의 FingerprintGenerator을 사용하고 있다고 가정하고 있지만, 다른 네임 스페이스의 다른 핑거 프린팅 방법과 유사 할 것입니다.

기본 구성의 지문은 약 3 초의 오디오가 필요합니다. 즉, 2 초 길이의 오디오 파일은 지문을 생성하지 않으므로 일치하지 않습니다.

기본적으로 HaitsmaKalker2002 방법의 지문은 256 개의 하위 지문으로 구성됩니다. 이 길이는 지문 일치가 발생하는 FingerprintStore에서 구성됩니다. 하위 지문은 샘플링 속도가 5512 인 다운 샘플링 된 오디오 스트림에서 가져온 슬라이스 (창)에서 계산됩니다.이 창은 2048 개의 샘플 길이로 64 개의 샘플마다 가져옵니다. 이 값은 지문을 추출하는 FingerprintGenerator을 구성하는 데 사용되는 프로파일에 설정됩니다. 위에서 언급 한 값은 DefaultProfile에서 찾을 수 있습니다. 이 구성에서는 지문을 산출하기 위해 최소한 1/5512 * (255 * 64 + 2048) = ~ 3.4 초의 오디오가 필요합니다. 다음 지문마다 64 개의 오디오 샘플 만 필요하므로 4 초 오디오를 사용하면 이미 313 개의 지문을 얻을 수 있으며 일치 가능성이 훨씬 높아집니다.

지문의 필요한 오디오 길이를 줄여야하고 FingerprintGenerator (DefaultProfile 확장 또는 구성 값 조정)에 대한 맞춤 프로필을 만들거나 일치하는 단계의 설정을 조정하여 할 수 있습니다. FingerprintStore. 최소 오디오 시간을 절반으로 줄이려면 예를 들어 다음과 같이 할 수 있습니다. SampleRate 또는 FrameStep의 절반을 DefaultProfile의 두 배로 늘리거나 지문 길이를 절반으로 줄이거 나 이러한 모든 가능성을 조합하십시오.

// Setup the fingerprint generator 
var defaultProfile = FingerprintGenerator.GetProfiles()[0]; 
defaultProfile.SampleRate = 11025; // Adjust the profile 
var generator = new FingerprintGenerator(defaultProfile); 

// Create a fingerprint store 
var store = new FingerprintStore(defaultProfile); 
// Set the fingerprint length to 128 instead of the default 256 
store.FingerprintSize = 128; 

는 또 다른 방법은 침묵 패딩에 의해 입력 오디오를 연장 할 수 있지만, 당신은 실제 오디오 페이로드가 너무 짧기 때문에 (높은 에러 마진을 허용하는 store.Threshold 높이를 높게해야 할 수도 있습니다 완전히 어디서나 일치하지 않습니다 이 유스 케이스는 현재 Aurio의 API를 통해 가능하지 않기 때문에 외부에서 패딩을해야합니다.

좋은 결과를 얻기 때문에 기본값이 선택되었습니다. 당신이하고있는 일을 모른 채 그들을 변경하면 가양 성 (false positive)이나 미스 (misses)가 많이 생길 수 있지만, 입력 파일이 매우 짧기 때문에 시도 해봐야합니다. 기본적으로 Aurio 주변의 GUI 인 AudioAlign을 사용하는 것이 좋습니다. 여기서 두 개의 테스트 파일을 추가하고 FingerprintSizeThreshold 값을 매우 쉽게 실험 할 수 있으며 오디오 파일에서 일치하는 것을 그래픽으로 표시하고 직접들을 수 있습니다 .