2010-07-03 7 views
7

기본적으로 동일한 노래를 나타내는 많은 오디오 파일이 있습니다. 그러나 그 중 일부는 원본보다 품질이 좋지 않으며 일부는 원본 노래와 더 이상 일치하지 않는 위치로 편집됩니다. 내가하고 싶은 것은 프로그래밍 방식으로 이러한 오디오 파일을 원본과 비교하고 품질에 관계없이 어떤 노래가 해당 노래와 일치하는지 확인하는 것입니다. 파일의 품질이 다양하기 때문에 직접적인 비교는 분명히 효과가 없을 것입니다.두 오디오 파일 비교

나는 이것이 노래의 구조를 분석하고 원본과 비교함으로써 이루어질 수 있다고 믿지만, 오디오 엔지니어링에 대해서는 아무것도 모르기 때문에 저에게 많은 도움이되지 않습니다. 모든 노래는 동일한 형식 (MP3)입니다. 또한 파이썬을 사용하고 있습니다. 바인딩이 있다면 환상적입니다. 그렇지 않다면, JVM이나 심지어 네이티브 라이브러리를위한 것이 리눅스에서 돌아가고 그것을 사용하는 방법을 알아낼 수 있다면 괜찮을 것입니다.

+1

Shazam의 작동 방식을 확인하십시오. http://laplacian.wordpress.com/2009/01/10/how-shazam-works/ –

+0

+1 멋진 블로그 게시물 – BenG

+0

음,이 소리는 다음과 같이 간단하지 않습니다. 나는 그것이 될 것이라고 생각했다. –

답변

4

복사 that 대답에서 : 이전 AudioScrobbler에서 현재 MusicBrainz에서 사람들이 오래 전부터 일한 것을

똑같은 질문입니다. 당분간, 당신의 탐구를 도울 수있는 파이썬 프로젝트는 Picard입니다.이 파일은 GUID (실제로는 그 중 몇 개)가 포함 된 오디오 파일 (MPEG 1 레이어 3 파일뿐만 아니라)에 태그를 붙이며 이후에는 태그는 아주 간단합니다.

자신의 프로젝트로 수행하려는 경우 libofa이 도움이 될 수 있습니다. documentation for the Python wrapper이 아마도 가장 도움이 될 것입니다.

+0

나는 적어도 지금은 피카드를 사용했다. 감사. :) –

6

먼저 비교 도메인을 변경해야합니다. 압축되지 않은 파일의 원시 샘플을 분석하면 아무 것도 얻을 수 없습니다. 거리 측정은 오디오 샘플에서 추출한 하나 이상의 기능을 기반으로합니다. 위키 백과는 일반적으로 Acoustic Fingerprinting에 사용되는 다음과 같은 기능을 나열 종종 오디오 지문에 의해 악용

지각 특성이 평균 제로 크로싱 속도, 예상 템포, 평균 스펙트럼, 스펙트럼 평탄도, 밴드들에 걸쳐 저명한 톤과 대역폭을 포함한다.

프로그래밍 방식의 솔루션은 없지만 YouTube 오디오 ID 시스템을 리버스 엔지니어링 할 때 여기에 interesting attempt이 있습니다. 그것은 저작권 침해 탐지, 비슷한 문제에 사용됩니다.

13

이것은 실제로 사소한 작업이 아닙니다. 나는 기성품 라이브러리가 그것을 할 수 있다고 생각하지 않는다. 가능한 방법은 다음과 같습니다.

  1. 디코드 mp3 - PCM.
  2. PCM 데이터에 미리 지정된 특정 샘플링 속도 (예 : 16KHz)가 있는지 확인하십시오. 샘플 속도가 다른 노래를 리샘플링해야합니다. 어쨌든 퍼지 비교가 필요하기 때문에 높은 샘플 속도는 필요하지 않지만 너무 낮은 샘플 속도는 너무 많은 세부 사항을 잃게됩니다.
  3. PCM 데이터를 표준화합니다 (예 : 최대 샘플 값을 찾고 모든 샘플의 크기를 조정하여 최대 동적 범위의 데이터 형식을 사용합니다. 예 : 샘플 형식이 16 비트로 서명 된 경우 정규화 후 최대 진폭 샘플 값은 32767이어야 함). 또는 -32767).
  4. 고정 된 수의 샘플 (예 : 프레임 당 1000 개의 샘플)의 프레임으로 오디오 데이터를 분할합니다.
  5. 각 프레임을 스펙트럼 도메인 (FFT)으로 변환하십시오.
  6. 두 곡을 나타내는 프레임 시퀀스 간의 상관 관계를 계산합니다. 일치도가 특정 임계 값보다 큰 경우 노래가 동일하다고 가정합니다.

파이썬 라이브러리 :

  • PyMedia
  • NumPy (단계 1) (데이터 처리) - 일부 소개 정보

추가 합병증에 대한 this article를 참조하십시오. 처음에는 노래의 길이가 달라질 수 있습니다.따라서 위조 방지를 위해 추가 단계가 필요할 수 있습니다.

3.1. 사운드 에너지가 사전 정의 된 임계 값을 초과 할 때까지 처음부터 PCM 데이터를 스캔하십시오. 예를 들어 10 샘플의 슬라이딩 윈도우로 RMS를 계산하고 동적 범위의 1 %를 초과하면 RMS를 계산합니다. 그런 다음이 시점까지 모든 데이터를 버립니다.

+0

PCM 데이터가 바로 바이트 배열입니까? 3 단계에서는 32767까지의 진폭이 필요하기 때문에 정규화하는 동안 정수/이중 배열로 변환 할 것입니다. 내가 틀렸다면 나를 바로 잡아주세요. 또한 6 단계에서 상관 관계를 계산해야합니까? 또는 fft 값을 비교하여 임계 값 내에 있는지 확인하면 어떨까요? – LINGS

+0

@LINGS (3)은 단계 (1)의 PCM 데이터가 적절한 유형 (예 : int16 또는 float32)의 배열이라고 가정합니다. 그러나 선택한 디코더가 원시 바이트를 반환 한 다음 예이면 변환 단계가 필요합니다. – atzz

+0

@LINGS re step (6) : 클릭이나 박수와 같은 잡음으로 인해 FFT에 큰 차이가 생기기 때문에 솔루션에서 잡음을 허용해야하는 경우 간단한 차이가 작동하지 않습니다. 통합 된 차이가 작동 할 수도 있습니다. 상관 관계가 가장 좋은 비교 방법인지는 잘 모르겠다. 조사해 보지 않았지만 비슷한 것을 구현했을 때는 괜찮 았어. – atzz