All topic

Shazam 알고리즘이 어떻게 작동하는지 궁금한 적이 있나요?

notion1635 2024. 8. 1. 14:35

Shazam 알고리즘이 어떻게 작동하는지 궁금한 적이 있나요?

 

휴대폰이 듣는 모든 노래를 식별하는 능력은 순수한 기술적 마법입니다. 이 글에서는 가장 인기 있는 앱 중 하나인 Shazam이 어떻게 이를 수행하는지 보여드리겠습니다. 흥미롭게도 Shazam의 창립자들은 2003년에 Shazam의 작동 방식을 설명하는 논문을 발표했고, 저는 개인적으로 abracadabra 라는 프로젝트에서 그 논문의 오픈 소스 구현을 작업해 왔습니다 .

논문에서 설명하지 않는 부분은 abracadabra가 어떻게 접근하는지에 대한 갭을 메울 것입니다. 또한 관련 섹션에 abracadabra 코드베이스의 해당 부분에 대한 링크를 포함했으므로 원하시면 Python으로 따라할 수 있습니다.

물론, 이 논문이 발표된 이후로 최첨단 기술이 발전했고 Shazam은 2018년 Apple에 인수된 이후로 알고리즘을 발전시켰을 것입니다. 그러나 오디오 식별 시스템의 핵심 원리는 변하지 않았으며 원래 Shazam 방법을 사용하여 얻을 수 있는 정확도는 인상적입니다.

이 기사를 최대한 활용하려면 다음 사항을 이해해야 합니다.

  • 주파수 및 피치
    주파수는 무언가가 "얼마나 자주" 발생하는지 또는 음파가 1초에 완료하는 주기 수를 헤르츠(Hz)로 측정한 것입니다. 피치는 소리의 주파수에 대한 인간의 지각으로, 주파수가 높을수록 더 높은 피치로 들리고 주파수가 낮을수록 더 낮은 피치로 들립니다.
  • 파도
    파형은 소리가 눈으로 볼 수 있을 때 만들어내는 모양이나 패턴과 같습니다. 무언가가 소리를 낼 때 공기가 어떻게 앞뒤로 움직이는지 보여줍니다.
  • 그래프와 축
    그래프는 선, 점 또는 막대를 사용하여 정보를 보여주는 그림입니다. 축은 그래프의 두 선으로, 정보가 어디에 속하는지 확인하는 데 도움이 되며, 한 선은 보통 좌우(수평)로 가고 다른 한 선은 위아래(수직)로 갑니다.

Shazam이란 무엇인가요?

Shazam은 짧은 샘플만 들어도 노래를 식별할 수 있는 앱입니다. 노래를 듣고 "이 노래 뭐지?"라고 궁금할 때 Shazam을 사용하면 노래 이름과 아티스트를 빠르게 찾을 수 있습니다. 이 앱은 매월 2억 명이 넘는 글로벌 사용자를 확보할 만큼 인기가 높아서 Apple의 관심을 끌었고 2018년에 인수되었습니다.

음악이 재생되는 동안 Shazam을 열면 앱이 몇 초 분량의 오디오를 녹음하여 데이터베이스를 검색합니다. 재생 중인 노래를 식별하면 화면에 결과가 표시됩니다.

Shazam이 앱이 되기 전에는 전화번호였습니다. 노래를 식별하려면 번호를 누르고 휴대전화의 마이크를 음악에 대면 됩니다. 30초 후에 Shazam은 전화를 끊고 듣고 있던 노래에 대한 자세한 내용을 문자로 보냅니다. 2002년에 휴대전화를 사용했다면 당시의 전화 통화 품질이 이 작업을 어렵게 만들었다는 것을 알 수 있을 것입니다!

왜 노래 인식은 어려운가요?

이전에 신호 처리를 많이 하지 않았다면, 이것이 해결하기 어려운 문제인 이유가 명확하지 않을 수 있습니다. 아이디어를 얻기 위해 다음 오디오를 살펴보세요.

위의 그래프는 Chris Cornell의 "Like a Stone"이 컴퓨터에 저장되었을 때 어떤 모습인지 보여줍니다. 이제 트랙의 다음 섹션을 살펴보세요.이 오디오 섹션이 위의 트랙에서 왔는지 알고 싶다면, 무차별 대입 방법을 사용할 수 있습니다. 예를 들어, 트랙을 따라 오디오 섹션을 슬라이드하여 어느 지점에서 일치하는지 확인할 수 있습니다.조금 느리겠지만, 효과가 있을 겁니다. 이제 이 오디오가 어느 트랙에서 왔는지 모르고, 검색할 1,000만 곡의 데이터베이스가 있다고 상상해보세요. 훨씬 더 오래 걸릴 겁니다!

더 나쁜 점은, 이 장난감 예제에서 마이크를 통해 녹음된 샘플로 옮기면 배경 소음, 주파수 효과, 진폭 변화 등이 발생한다는 것입니다. 이 모든 것이 오디오 모양을 크게 바꿀 수 있습니다. 슬라이딩 방식은 이 문제에 그다지 효과적이지 않습니다.

다행히도 Shazam의 접근 방식은 그보다 훨씬 더 똑똑합니다. 다음 섹션에서는 이것이 어떻게 작동하는지에 대한 개략적인 개요를 살펴보겠습니다.

시스템 개요

만약 Shazam이 위에서 설명한 슬라이딩 방식을 취하지 않는다면, 무엇을 할까요

다음의 상위 수준 다이어그램을 살펴보세요.가장 먼저 눈에 띄는 것은 다이어그램이 레지스터인식 흐름 으로 나뉜다는 것입니다 . 레지스터 흐름은 노래를 기억하여 나중에 인식할 수 있도록 합니다. 인식 흐름은 오디오의 짧은 섹션을 식별합니다.

노래를 등록하고 일부 오디오를 식별하는 것은 많은 공통점을 공유합니다. 다음 섹션에서 더 자세히 설명하겠지만 두 흐름 모두 다음과 같은 단계를 거칩니다.

  • 노래/오디오의 스펙트로그램을 계산합니다 . 이것은 시간에 대한 주파수의 그래프입니다. 스펙트로그램에 대해서는 나중에 더 자세히 설명하겠습니다.
  • 그 스펙트로그램에서 피크를 찾으세요 . 이는 오디오에서 가장 큰 주파수를 나타내며 지문을 만드는 데 도움이 됩니다.
  • 이 피크들을 해시합니다 . 간단히 말해서, 이것은 더 나은 지문을 만들기 위해 피크들을 짝지어 놓는 것을 의미합니다.

이러한 해시를 계산한 후, 레지스터 흐름은 이를 데이터베이스에 저장합니다. 인식 흐름은 이를 데이터베이스에 이미 있는 해시와 비교하여 매칭 단계를 통해 재생 중인 노래를 식별합니다. 다음 몇 섹션에서는 이러한 각 단계에 대해 자세히 알아봅니다.

스펙트로그램 계산

두 흐름 모두의 첫 번째 단계는 등록되거나 인식되는 오디오의 스펙트로그램을 얻는 것입니다. 스펙트로그램을 이해하려면 먼저 푸리에 변환을 이해해야 합니다

푸리에 변환

푸리에 변환은 오디오를 가져와 해당 오디오에 어떤 주파수가 있는지 알려줍니다. 예를 들어, 20Hz 사인파를 가져와 푸리에 변환을 사용하면 20Hz(헤르츠) 근처에서 큰 스파이크가 나타납니다.

위의 이미지에서 20Hz 주변에서 큰 스파이크를 볼 수 있고 다른 주파수에서는 아무것도 볼 수 없습니다. 사인파는 단일 주파수만 포함하기 때문에 이 속성 때문에 종종 순수 톤 이라고 불립니다.

푸리에 변환의 결과를 주파수 스펙트럼 이라고 합니다 . 신호의 푸리에 변환을 수행할 때 시간 영역에서 주파수 영역으로 이동한다고 말합니다. 이는 그래프의 하단에 시간 또는 주파수가 있는지 여부를 설명하는 화려한 용어입니다. 수학적 용어로 도메인은 그래프의 X축과 거의 같습니다.

주파수 스펙트럼의 Y축은 각 주파수 성분의 강도를 나타냅니다. 주파수 성분이 더 강하면 시간 영역 신호에서 더 잘 들립니다.

20Hz 사인파에 절반 강도의 50Hz 사인파를 추가하면 결과 주파수 스펙트럼은 20Hz에서 스파이크가 나타나고 50Hz에서 더 작은 스파이크가 나타납니다.

보시다시피, 여러 오디오 파동을 합치면 그 안에 있는 주파수가 결합됩니다. 사실, 모든 오디오 신호는 이와 같은 파동에서 재구성될 수 있습니다. 자세한 내용은 Fourier 변환에 대한 이 비디오를 시청하세요 .주파수 영역의 한 가지 훌륭한 속성은 시간 영역에서 명확하지 않은 것을 보는 데 종종 도움이 된다는 것입니다. 예를 들어, 이전의 두 주파수를 가진 신호를 가져와 노이즈를 추가하면 시간 영역에서 시각적으로 매우 다르게 보입니다. 그러나 주파수 영역에서 두 스파이크는 여전히 매우 명확합니다.

오른쪽의 주파수 영역 그래프에서 주요 구성 요소 주파수에 대한 스파이크를 여전히 명확하게 볼 수 있습니다. 시간 영역에서는 어떤 주파수 사인파가 신호에 들어갔는지 보는 것이 더 어려울 것입니다.

지금까지 우리의 예는 주파수가 하나 또는 두 개만 포함되었지만, 더 복잡한 신호를 푸리에 변환하면 어떻게 될까요? Like a Stone의 오디오 섹션을 살펴보겠습니다.

위와 같은 실제 오디오 파일에는 다양한 주파수가 많이 들어 있습니다. 이는 존재하는 주파수가 노래를 고유하게 식별할 수 있다는 것을 의미하므로 좋은 일입니다.

스펙트로그램

노래 전체에 푸리에 변환을 실행하면 노래 전체에 존재하는 주파수의 강도를 볼 수 있습니다( 아브라카다브라 구현 참조 ). 그러나 존재하는 주파수는 시간이 지남에 따라 변합니다. 시간이 지남에 따라 변화하는 주파수를 더 잘 표현하려면 푸리에 변환을 수행하기 전에 노래를 작은 섹션으로 분할해야 합니다. 이를 스펙트로그램을 취한다고 합니다.

스펙트로그램의 작동 방식을 간단히 나타낸 애니메이션은 다음과 같습니다.

위의 애니메이션에서 노래가 먼저 작은 섹션으로 나뉜 것을 볼 수 있습니다. 다음으로, 푸리에 변환을 사용하여 각 섹션의 주파수 스펙트럼을 계산합니다. 이 모든 주파수 스펙트럼을 합치면 스펙트로그램이 나옵니다.

이를 구체적으로 알아보기 위해 Like a Stone의 스펙트로그램을 살펴보겠습니다.스펙트로그램이 2차원처럼 보이지만 실제로는 다음 축을 갖는 3차원 그래프입니다.

  • 시간(X축)
  • 주파수(Y축)
  • 강도(Z축/색상)

Z축은 위의 스펙트로그램에서 색상으로 표현됩니다. 밝은 녹색은 특정 주파수 성분에 대한 높은 크기를 나타내고 진한 파란색은 낮은 크기를 나타냅니다.

위의 스펙트로그램을 보면 가장 밝은 점(가장 강한 주파수)이 거의 전적으로 5000Hz 미만에서 발생한다는 것을 알 수 있습니다. 이는 음악에서 매우 흔한 일인데, 예를 들어 대부분 피아노의 주파수 범위 는 27Hz-4186Hz입니다.

트랙에 존재하는 주파수는 많은 식별 정보를 포함하고 있으며 스펙트로그램을 계산하면 해당 정보에 접근할 수 있습니다. 다음 섹션에서는 모든 정보를 트랙의 고유한 지문으로 변환하는 방법을 알아봅니다.

지문

지문이 사람을 고유하게 식별하는 것처럼, 우리는 스펙트로그램에서 어떤 오디오의 고유한 지문을 추출할 수 있습니다.

이러한 오디오 지문은 스펙트로그램에서 피크를 찾는 데 의존합니다. 이러한 피크는 노래에서 어느 시점에서 가장 큰 주파수입니다. 큰 소리이기 때문에 소음이나 기타 왜곡에 노출되어도 살아남을 가능성이 높습니다.

다음 섹션에서는 스펙트로그램 피크를 사용하여 지문을 구축하는 동기에 대해 자세히 알아보겠습니다.

지문이 스펙트로그램 피크를 기반으로 하는 이유는 무엇입니까?

스펙트로그램 피크는 오디오 신호의 어느 지점에서 큰 소리를 내는 주파수입니다. 스펙트로그램에서 가장 밝은 지점이기 때문에 이를 알아볼 수 있습니다.

음악에서 이는 가장 큰 음을 나타냅니다. 예를 들어, 기타 솔로 중에 기타가 연주하는 음은 그 당시 가장 큰 음일 가능성이 높기 때문에 스펙트로그램 피크가 될 수 있습니다.

스펙트로그램 피크는 노이즈의 영향을 가장 적게 받는 지점입니다. 노이즈는 스펙트로그램 피크보다 더 크게 들려야 알아볼 수 없게 되고 스펙트로그램 피크는 트랙에서 가장 큰 주파수 성분입니다.

이를 시각적으로 표현하기 위해, 잡음이 추가된 푸리에 변환 신호의 이전 예를 살펴보겠습니다. 잡음이 추가되면 주파수 피크는 여전히 거친 모양을 유지합니다.스펙트로그램 피크를 사용하여 오디오 지문을 만드는 또 다른 장점은 저장해야 할 데이터 양을 줄인다는 것입니다. 가장 큰 주파수 성분만 저장한다는 것은 다른 모든 것을 저장할 필요가 없다는 것을 의미합니다. 이렇게 하면 살펴볼 데이터가 적기 때문에 지문 검색 속도가 빨라집니다.

하지만 지문에서 주파수 피크를 사용하기 전에 먼저 찾아야 합니다. 다음 섹션에서는 그 방법을 알아보겠습니다.

피크 찾기

이전 섹션에서 논의했듯이 스펙트로그램의 피크는 신호에서 가장 강한 주파수를 나타냅니다. 주파수 피크를 오디오 지문에서 사용할 수 있으려면 스펙트로그램 전체에 걸쳐 균일하게 간격을 두는 것이 중요합니다(abracadabra 구현 참조 ).

피크가 시간적으로 균일하게 간격을 두는 것이 중요합니다. 그래야 시스템이 노래의 모든 섹션을 인식할 수 있습니다. 예를 들어, 모든 피크가 노래의 시작 부분에 있는 경우 지문은 이후 섹션을 포함하지 않습니다.

위의 이미지에서 모든 피크(흰색 십자가)는 노래의 시작 부분에 모여 있습니다. 즉, 시스템은 노래의 나머지 부분에서 어떤 샘플도 인식할 수 없습니다.

또한 피크가 주파수에서 균일하게 간격을 두는 것이 중요합니다. 그래야 시스템이 노이즈와 주파수 왜곡을 처리할 수 있습니다. 때때로 노이즈는 매우 크고 특정 주파수 범위에 집중될 수 있습니다. 예를 들어 배경의 자동차 경적 소리:

위의 애니메이션에서 피크는 시간적으로 잘 간격을 두고 있지만 작은 주파수 대역에 클러스터링되어 있습니다. 예를 들어 자동차 경적과 같은 큰 소리가 발생하면 선택된 피크를 변경하여 노래의 전체 섹션을 알아볼 수 없게 만들 수 있습니다.스펙트로그램 피크를 잘 간격을 유지하면서 찾으려면 최대 필터라고 알려진 이미지 처리 기술을 빌릴 수 있습니다. 프로세스는 다음과 같습니다.

  • 최대 필터를 사용하여 스펙트로그램의 피크를 강조 표시합니다.
  • 원래 스펙트로그램과 비교하여 강조된 피크를 찾습니다.
  • (선택 사항) 일부 피크를 삭제합니다.

이 단계를 하나씩 살펴보겠습니다. 먼저 최대 필터가 어떻게 작동하는지 살펴보겠습니다.

단계: 최대 필터

최대 필터는 이미지의 피크를 강조합니다. 각 픽셀 주변의 이웃에서 최대값을 찾은 다음 픽셀을 해당 로컬 최대값으로 설정하여 이를 수행합니다. 다음 애니메이션은 각 픽셀 주변의 3x3 이웃을 보는 최대 필터를 보여줍니다.

위의 애니메이션에서 볼 수 있듯이, 최대 필터는 이미지의 각 픽셀을 차례로 가져와 주변 영역에서 최대값을 찾습니다. 그런 다음 필터링된 픽셀을 해당 지역 최대값으로 설정합니다. 이는 각 지역 피크를 주변 영역으로 확장하는 효과가 있습니다.

Like a Stone의 스펙트로그램에 최대 필터를 실행하면 다음과 같은 결과가 나옵니다.

최대 필터링된 스펙트로그램은 원래 스펙트로그램의 낮은 해상도 버전처럼 보입니다. 이는 신호의 피크가 확장되어 다른 픽셀을 차지했기 때문입니다. 필터링된 이미지에서 같은 색상의 각 상자는 원래 이미지의 로컬 피크에 해당합니다.

최대 필터에는 로컬 최대값을 찾을 때 사용할 상자의 크기를 제어하는 ​​매개변수가 있습니다. 이 매개변수를 설정하여 상자를 더 작게 만들면 피크가 더 많아집니다. 마찬가지로 이 매개변수를 더 크게 설정하면 피크가 줄어듭니다.

단계: 원래 피크 복구

최대 필터는 우리를 대신해 모든 작업을 하지 않습니다. 필터는 로컬 피크를 강조했지만, 그 위치를 찾지 못했습니다. 피크 위치를 찾으려면 원래 스펙트로그램과 필터링된 스펙트로그램에서 동일한 값을 갖는 지점을 찾아야 합니다.

이 트릭의 아이디어는 스펙트로그램의 모든 비피크 포인트가 로컬 피크로 대체되어 값이 변경되었다는 것입니다. 값이 변경되지 않은 유일한 포인트는 피크입니다.

아래는 위의 스펙트로그램의 확대된 부분입니다. 필터링된 스펙트로그램과 원래 스펙트로그램에서 값이 같은 지점이 강조 표시됩니다.

위 이미지에서 볼 수 있듯이, 두 스펙트로그램이 동일한 강조된 지점은 이미지의 해당 부분의 로컬 피크에 해당합니다.

이 그래프는 밤하늘의 이미지와 약간 비슷해 별자리 지도라고 불립니다. 컴퓨터 과학이

단계: (선택 사항) 피크 삭제

피크의 별자리 지도가 생기면 다음 단계는 잠재적으로 일부를 버리는 것입니다. 지문의 크기는 사용하는 피크의 수에 따라 달라집니다. 데이터베이스에 수백만 곡의 노래를 저장할 때 지문을 작게 유지하는 것이 중요합니다.

하지만 사용하는 피크의 수를 줄이면 시스템의 정확도가 떨어집니다. 지문의 피크가 적을수록 샘플을 올바른 노래에 매치할 가능성이 줄어듭니다.

지문의 피크 수를 줄이는 데는 몇 가지 옵션이 있습니다.

  • 상위 N개의 피크를 취합니다. N은 짧은 노래를 과도하게 표현하는 것을 피하기 위해 지문을 찍는 오디오의 길이에 비례해야 합니다.
  • 특정 임계값 위의 모든 피크를 가져옵니다. 이는 다른 방법처럼 시간당 특정 지문 크기를 보장하지는 않지만 더 정확한 결과를 제공할 수 있습니다.

우리는 지문을 구성하는 것을 거의 마쳤습니다. 다음 단계는 피크에서 해시 집합을 생성하는 것입니다.

해싱

해싱을 동기부여하기 위해, 우리의 지문이 스펙트로그램 피크의 모음일 뿐이라고 상상해 보세요. 각 피크의 주파수는 특정 수의 비트, 예를 들어 10으로 표현됩니다. 10비트의 정보로 2^10=1024개의 개별 주파수를 표현할 수 있습니다. 트랙당 수천 개의 이러한 포인트로, 우리는 빠르게 많은 반복을 얻습니다(abracadabra 구현 참조 ).

고유성은 지문에 중요한데, 검색을 훨씬 더 빠르게 하고 더 많은 노래를 인식하는 데 도움이 되기 때문입니다. Shazam의 고유성 문제에 대한 솔루션은 피크 쌍에서 해시를 만드는 것입니다.

위의 다이어그램은 스펙트로그램의 확대된 부분을 보여줍니다. 각 원은 피크를 나타내고 점선 상자는 해시를 나타냅니다. 해시는 두 개의 피크로 구성되어 있음을 알 수 있습니다. 각 해시에 대해 기록된 정보는 각 피크의 주파수 fA와 fB, 그리고 그 사이의 시간 델타 ΔT입니다.점을 페어링하는 장점은 두 개의 페어링된 점이 단일 점보다 훨씬 더 고유하다는 것입니다. 수학적으로 살펴보면 각 점에 주파수 정보가 10비트 있고 두 점 사이의 시간 차이가 10비트로 표현될 수 있다면 30비트의 정보가 있습니다. 2^30=1073741824는 단일 점에 대한 1024가지 가능성보다 훨씬 큽니다.

Shazam은 다음 알고리즘을 사용하여 쌍을 만듭니다.

  • 지점을 선택하세요. 이것을 앵커 포인트라고 합니다.
  • 앵커 포인트에 대한 스펙트로그램의 목표 구역을 계산합니다.
  • 대상 구역의 각 지점에 대해 앵커 지점과 쌍을 만듭니다.

다음 애니메이션에서 이 알고리즘을 볼 수 있습니다.

Shazam 논문에는 타겟 구역을 선택하는 방법에 대한 설명이 없지만, 논문에 포함된 이미지는 앵커 포인트보다 약간 앞서서 시작하고 앵커 포인트의 주파수를 중심으로 하는 것을 보여줍니다.

쌍이 생성되면 다음 정보와 함께 데이터베이스에 해시로 저장됩니다.

처음 세 개의 열(fA, fB 및 ΔT)은 해시를 구성합니다. "기타 정보"는 노래의 특정 시간에 해시를 찾는 데 사용됩니다. 이는 나중에 매칭에 사용됩니다.

특정 트랙의 모든 해시가 지문을 구성합니다. 다음 섹션에서는 Shazam이 이러한 지문을 어떻게 매치하는지에 대해 읽어볼 수 있습니다.

어울리는

데이터베이스에 지문 컬렉션이 주어졌을 때, Shazam은 주어진 오디오 샘플이 어떤 지문과 일치하는지 어떻게 알아낼까요? 여기서 시스템의 일치 부분이 등장합니다.

이전의 시스템 다이어그램을 떠올려 보세요.

인식 및 등록 흐름은 모두 지문을 생성합니다. 차이점은 지문을 어떻게 처리하는지에 있습니다. 등록 흐름은 향후 일치를 위해 지문을 저장하는 반면, 인식 흐름은 지문을 데이터베이스에 이미 있는 것과 일치시켜야 합니다.

매칭 알고리즘은 다음 단계로 구성됩니다.

  • 샘플의 지문과 일치하는 모든 해시를 데이터베이스에서 검색합니다.
  • 해시를 노래별로 그룹화하세요.
  • 각 노래의 해시가 일치하는지 확인해 보세요.
  • 가장 많이 정렬된 해시가 있는 트랙을 선택하세요.

각 단계를 차례로 살펴보겠습니다.

단계: 일치하는 해시 검색

첫 번째 단계는 방금 만든 지문의 해시와 일치하는 데이터베이스의 모든 해시를 찾는 것입니다( abracadabra 구현 ). 해시는 (fA, fB, ΔT)의 3-튜플이지만 abracadabra는 이를 hash(fA, fB, ΔT)로 저장합니다. 여기서 hash()는 단일 값을 반환하는 해시 함수 입니다렇게 하면 해시당 세 개 대신 하나의 값만 검색하면 됩니다.

단계: 노래별로 해시 그룹화

데이터베이스의 개별 해시 형식을 생각해 보세요.각 해시와 연관시킨 트랙 ID 덕분에 트랙별로 해시를 그룹화할 수 있습니다. 이를 통해 잠재적으로 일치하는 각 트랙에 점수를 매길 수 있습니다.

단계: 해시가 일치하는지 확인하세요

아브라카다브라 구현

샘플이 노래와 일치하면 해당 샘플에 있는 해시는 해당 노래의 일부 섹션에 있는 해시와 잘 일치해야 합니다. 아래 다이어그램은 이것이 어떻게 보일지 보여줍니다.

위의 다이어그램에서 샘플은 원래 노래의 섹션과 정렬되었습니다. 파란색 점은 해시의 앵커 포인트를 나타냅니다.

위의 다이어그램은 완벽한 시나리오를 보여주지만, 데이터베이스의 일치하는 해시가 완벽하게 일치하지 않을 가능성이 있습니다. 예를 들어, 노이즈가 노래의 다른 지점의 피크와 유사한 샘플의 피크를 도입했을 수 있습니다. 이는 다음과 같은 시나리오로 이어질 수 있습니다.

위의 다이어그램에서 빨간색 원은 샘플이 나온 섹션 외부의 노래의 지점과 일치하는 해시를 나타냅니다. 이 상황에서는 샘플이 노래와 완벽하게 일치한다는 것을 보기가 더 어렵습니다.더 나쁜 것은, 해시가 잘못된 노래와 매치될 수 있다는 것입니다! 여기서 해시 라인업을 확인하는 것이 필요합니다.

코드에서 해시가 일치하는지 확인하는 방법을 설명하기 위해 예를 살펴보겠습니다. 데이터베이스에서 일치하는 해시 목록을 가져와 트랙별로 그룹화했다고 가정해 보겠습니다. 주어진 트랙에 대해 해시가 원래 트랙에서 발생한 시간을 샘플에서 해시가 발생한 시간과 비교할 수 있습니다.

위의 표에서 Track time - Sample time이 10 인 모든 매치가 강조 표시된 것을 볼 수 있습니다. 이것들은 진짜 매치이고, 다른 두 행은 거짓 매치입니다. 이것이 사실인지 확인하려면 이전에 본 것과 비슷한 다이어그램을 살펴보겠습니다.위의 다이어그램에는 이전 표와 동일한 해시가 포함되어 있습니다. 보시다시피, 진정한 일치 항목에는 트랙 시간 - 샘플 시간이 있는데 , 이는 샘플이 트랙 시간에서 얼마나 멀리 시작되는지와 같습니다.

이것을 트랙의 점수로 어떻게 바꾸는지 보기 위해 이 데이터를 히스토그램으로 만들어 보겠습니다. 히스토그램은 막대 차트의 멋진 이름입니다. 각 트랙 시간 - 샘플 시간을 발생 횟수에 대해 플로팅합니다 .

위의 히스토그램의 각 막대는 빈 이라고 합니다 . 오디오 샘플에 얼마나 잘 맞는지에 대한 노래의 점수를 매기려면 가장 큰 빈을 선택하면 됩니다. 잘 맞지 않는 노래는 모든 빈에서 값이 낮고, 잘 맞는 노래는 빈 중 하나에서 큰 스파이크가 나타납니다.

이런 식으로 우리는 샘플을 데이터베이스에서 일치하는 해시를 가진 모든 노래와 비교하고 각각에 점수를 매길 수 있습니다. 가장 높은 점수를 받은 노래가 올바른 결과일 가능성이 높습니다.

왜 가장 많은 해시와 일치하는 노래를 선택하지 않는지 궁금할 수 있습니다. 구현하기가 훨씬 간단할 테니까요. 이 접근 방식의 문제점은 모든 노래가 길이가 같지 않다는 것입니다. 긴 노래는 짧은 노래보다 더 많은 일치를 얻을 가능성이 높고 일부 Spotify 트랙이 4시간이 넘으면 결과에 실제로 편향이 생길 수 있습니다.결론

여기까지 잘 왔어요, 긴 여정이었어요! 이 글에서는 Shazam이 오디오에서 지문을 추출하는 방법과 이 지문을 데이터베이스에 이미 등록한 지문과 매치하는 방법을 알아보았습니다.

요약하자면 Shazam은 다음과 같은 과정을 거쳐 노래를 등록 합니다.

  • 노래의 스펙트로그램을 계산합니다
  • 해당 스펙트로그램에서 피크를 추출합니다 .
  • 해당 피크를 해시 로 쌍으로 묶습니다.
  • 노래의 해시 컬렉션을 지문 으로 저장합니다.

Shazam은 오디오 샘플을 인식하기 위해 다음을 수행합니다 .

  • 오디오 샘플의 지문을 계산합니다
  • 데이터베이스에서 해당 지문과 일치하는 해시를 찾습니다.
  • 각각의 잠재적인 노래 매치에 대해:
  • 가장 높은 점수를 받은 노래를 반환하세요

아브라카다브라를 입력하세요

저는 이 논문의 구현인 abracadabra를 쓰는 과정에서 여기에 쓰여진 모든 것을 배웠습니다 . 이것이 코드에서 어떻게 보일지 보고 싶다면, 꼭 살펴보세요!

모든 것이 오픈 소스이며 저는 프로젝트를 문서화하기 위해 최선을 다했습니다. abracadabra는 다른 프로젝트에서 라이브러리로 사용할 수도 있으므로 자유롭게 리믹스하고 멋진 것을 빌드하세요. 사용한다면, 그것에 대해 듣고 싶습니다 .

추가 읽기

이 기사에서 언급된 내용에 대해 더 알고 싶다면 아래를 살펴보세요. 또한 페이지 전체에 몇 가지 유용한 링크를 흩뿌렸습니다.

  • dejavu 는 파이썬에서 노래 인식기를 구현한 또 다른 사례입니다. 저자는 이 기능이 어떻게 작동하는지에 대한 훌륭한 설명을 작성했습니다 .
  • 음악 식별을 위한 컴퓨터 비전은 데자뷰와 유사한 노래 인식의 또 다른 접근 방식입니다.
  • 약간 다른 접근 방식을 취하는 알고리즘이 Chromaprint 입니다 .
  • Musicbrainz는 음악 정보의 오픈소스 백과사전입니다. 이 페이지는 그들이 오디오를 지문화하는 방법을 설명합니다.
  • Shazam 지문으로 놀기(Playing with Shazam) 는 저자가 Shazam 알고리즘을 구현한 경험에 대한 2009년 기사입니다.
  • 오디오 지문을 이용해 동일 이벤트의 비디오를 정렬하는 것은 이 알고리즘이 음악을 넘어 활용되는 사례의 한 예입니다.