시스템 디자인

마법 같은 음악 인식 기술: Shazam은 어떻게 노래를 찾아낼까?

오디오 지문 기술의 비밀을 파헤치다: 논문으로 살펴보는 작동 원리

2025.04.15 | 조회 1.24K |
0
|
데브필 DevPill의 프로필 이미지

데브필 DevPill

Top 1% 개발자로 거듭나는 성공 처방전

Introduction

당신의 폰을 카페에 들고 간 적이 있나요? 갑자기 흘러나오는 노래에 "이게 무슨 곡이지?"라는 생각이 들었을 때, Shazam 앱을 실행하면 마법처럼 노래를 찾아냅니다. 단 몇 초 만에 말이죠. 이런 기술이 어떻게 가능한 걸까요?

오늘은 음악 인식 앱 중 가장 유명한 Shazam의 작동 원리를 파헤쳐 보려 합니다. 2003년 발표된 Shazam 설립자들의 논문에서 밝힌 내용을 바탕으로, 실제 구현 프로젝트인 'abracadabra'를 통해 그 내부 메커니즘을 살펴보겠습니다.

주변 소음과 왜곡된 소리 속에서도 정확히 노래를 찾아내는 이 기술은 단순히 일치하는 부분을 찾는 것 이상의 깊은 과학이 숨어 있습니다. 사람의 지문이 개인을 식별하듯, Shazam은 "오디오 지문(audio fingerprint)"을 만들어 수백만 곡 중에서 정확한 한 곡을 찾아냅니다.

크고 시끄러운 클럽에서도, 라디오에서 흘러나오는 노래도, 심지어 휴대폰 스피커로 재생되는 음악도 인식할 수 있는 이 기술의 비밀을 함께 알아보세요. 푸리에 변환, 스펙트로그램, 피크 탐지 등 복잡한 개념들이 어떻게 우리 일상의 마법이 되었는지, Cameron MacLeod가 작성한 <How does Shazam work?>를 번역해 소개합니다.


🚀 (광고): 면접관이 놓을 수 없는 이력서를 만들고 싶다면?

이번에 새로 전자책을 출시했습니다 :)

작년부터 인프런을 통해서 이력서 및 취업 멘토링을 해주고 있습니다. 좋은 기회로 부트캠프로부터 졸업생 대상으로 단체 멘토링 역시 진행하고 있구요. 어느새 수십 명의 예비 개발자 분들의 이력서를 검토해주게 되었네요.

그러다보니 멘티 분들이 놓치는 실수가 공통적으로 겹치는 걸 발견했습니다.

면접관은 하루에도 수십 개의 이력서를 검토하면서 단 3초 만에 "더 볼지 말지"를 결정합니다. 그런데 그 귀중한 3초 안에 자신의 경험과 역량을 제대로 드러내지 못하고 있었어요.

제가 주로 해드린 피드백은 아래와 같습니다:

  • 10페이지 이력서를 1장으로 압축해 서류 합격률 3배 높이는 법
  • 기술 스택을 과도하게 나열하는 대신 깊이를 보여주는 전략
  • 문제 해결 경험을 구체적 수치로 표현해 임팩트 만드는 방법
  • 면접관을 당신의 편으로 만드는 이력서 작성의 황금 법칙

이런 경험들을 바탕으로 "면접관을 사로잡는 이력서 전략"이라는 짧은 가이드를 작성했습니다. 개발자로서 기술적 역량을 쌓는 것도 중요하지만 그 역량을 효과적으로 어필하는 법도 알아야 한다고 생각합니다.

서류 탈락에 지치셨나요? 당신의 개발자 이력서가 3초 안에 면접관의 시선을 사로잡을 수 있습니다. 현직 멘토가 수십 명의 개발자를 코칭하며 발견한 이력서 전략을 공개합니다.

관심 있으신 분들은 [링크]에서 확인해보세요.

다시 본론으로 돌아가볼까요?


Shazam은 어떻게 작동하나요?

첨부 이미지

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

논문에서 설명하지 않은 부분은 abracadabra가 어떻게 접근했는지 보충 설명하겠습니다. 또한 관련 섹션에서는 Python 코드로 따라할 수 있도록 abracadabra 코드베이스의 해당 부분 링크도 포함했습니다.

이 논문 이후로 기술은 계속 발전했고 Shazam도 알고리즘을 개선했을 것입니다. 그러나 오디오 식별 시스템의 핵심 원리는 변하지 않았으며, 원래 Shazam 방식을 사용해 얻을 수 있는 정확도는 여전히 인상적입니다.

이 글을 최대한 이해하기 위해서는 다음 개념을 알고 있어야 합니다:

목차

  • Shazam이란?
  • 노래 인식이 왜 어려운가?
  • 시스템 개요
  • 스펙트로그램 계산하기
    • 푸리에 변환
    • 스펙트로그램
  • 지문화(Fingerprinting)
    • 왜 지문은 스펙트로그램 피크에 기반하는가?
    • 피크 찾기
    • 해싱
  • 매칭
  • 결론

Shazam이란?

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

첨부 이미지

Shazam이 앱이 되기 전에는 전화번호였습니다. 노래를 식별하려면 이 번호로 전화를 걸고 휴대폰 마이크를 음악 쪽으로 향하게 했습니다. 30초 후 Shazam은 통화를 종료하고 듣고 있던 노래에 대한 정보를 문자로 보내주었습니다. 2002년 당시 휴대폰을 사용했던 분들이라면 당시 통화 품질이 이런 작업을 얼마나 어렵게 만들었는지 이해할 수 있을 것입니다!

노래 인식이 왜 어려운가?

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

첨부 이미지

위 그래프는 컴퓨터에 저장된 Chris Cornell의 "Like a Stone"의 모습입니다. 이제 다음 트랙 섹션을 살펴보세요:

첨부 이미지

이 오디오 섹션이 위 트랙에서 왔는지 확인하려면 무차별 대입 방식을 사용할 수 있습니다. 예를 들어, 오디오 섹션을 트랙을 따라 슬라이드하면서 일치하는 지점이 있는지 확인할 수 있습니다:

첨부 이미지

이 방법은 조금 느리지만 작동할 것입니다. 이제 이 오디오가 어떤 트랙에서 왔는지 모르고 검색할 1천만 곡의 데이터베이스가 있다고 상상해보세요. 이것은 훨씬 더 오래 걸릴 것입니다!

더 나쁜 점은, 이 예시에서 마이크를 통해 녹음된 샘플로 넘어가면 배경 소음, 주파수 효과, 진폭 변화 등이 추가됩니다. 이 모든 것이 오디오의 형태를 크게 변화시킬 수 있습니다. 슬라이딩 방식은 이 문제에 그다지 잘 작동하지 않습니다.

다행히도, Shazam의 접근 방식은 이보다 훨씬 스마트합니다. 다음 섹션에서는 이것이 어떻게 작동하는지에 대해 상위 수준에서 개요를 살펴보겠습니다.

시스템 개요

Shazam이 앞서 설명한 슬라이딩 접근 방식을 사용하지 않는다면, 어떻게 작동할까요? 다음의 상위 수준 다이어그램을 살펴보세요:

첨부 이미지

가장 먼저 눈에 띄는 점은 다이어그램이 등록(register)과 인식(recognise) 흐름으로 나뉜다는 것입니다. 등록 흐름은 노래를 기억하여 나중에 인식할 수 있게 합니다. 인식 흐름은 짧은 오디오 섹션을 식별합니다.

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

  1. 노래/오디오의 스펙트로그램(spectrogram)을 계산합니다. 이것은 시간에 따른 주파수 그래프입니다. 스펙트로그램에 대해서는 나중에 더 자세히 설명하겠습니다.
  2. 해당 스펙트로그램에서 피크를 찾습니다. 이것은 오디오에서 가장 큰 주파수를 나타내며 지문을 만드는 데 도움이 됩니다.
  3. 이러한 피크를 해싱합니다. 간단히 말해, 이는 피크들을 쌍으로 묶어 더 나은 지문을 만드는 것을 의미합니다.

이러한 해시를 계산한 후, 등록 흐름은 이를 데이터베이스에 저장합니다. 인식 흐름은 일치 단계를 통해 이를 데이터베이스에 이미 있는 해시와 비교하여 어떤 노래가 재생 중인지 식별합니다.

다음 섹션에서는 이러한 각 단계에 대해 더 자세히 알아보겠습니다.

스펙트로그램 계산하기

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

푸리에 변환

푸리에 변환은 오디오를 가져와 해당 오디오에 존재하는 주파수를 알려줍니다. 예를 들어, 20 헤르츠 사인파를 가져와 푸리에 변환을 사용하면 20 헤르츠(Hz) 주변에서 큰 스파이크가 보일 것입니다:

첨부 이미지

위 이미지에서 20Hz 주변에 큰 스파이크가 있고 다른 주파수에는 아무것도 없는 것을 볼 수 있습니다. 사인파는 이러한 특성 때문에 '순수 음'이라고 불리는데, 단일 주파수만 포함하기 때문입니다.

푸리에 변환의 결과를 주파수 스펙트럼이라고 합니다. 신호의 푸리에 변환을 취할 때, 시간 도메인에서 주파수 도메인으로 이동한다고 말합니다. 이는 그래프의 하단에 시간이나 주파수 중 무엇이 있는지를 설명하는 용어입니다. 수학적 용어로, 도메인은 대체로 그래프의 X축입니다.

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

20Hz 사인파에 강도가 절반인 50Hz 사인파를 추가하면, 결과 주파수 스펙트럼은 20Hz에서 스파이크를 보이고 50Hz에서 더 작은 스파이크를 보여줄 것입니다:

첨부 이미지

보시다시피, 여러 오디오 파형을 함께 추가하면 그 안에 존재하는 주파수가 결합됩니다. 사실, 모든 오디오 신호는 이러한 파형으로 재구성될 수 있습니다. 자세한 내용은 3Blue1Brown의 푸리에 변환에 관한 비디오를 참고하세요.

주파수 도메인의 한 가지 좋은 특성은 시간 도메인에서는 명확하지 않은 것들을 볼 수 있도록 도와준다는 것입니다. 예를 들어, 이전의 두 주파수가 있는 신호에 노이즈를 추가하면 시간 도메인에서는 시각적으로 매우 다르게 보입니다. 그러나 주파수 도메인에서는 두 스파이크가 여전히 매우 명확합니다:

첨부 이미지

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

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

첨부 이미지

위와 같은 실제 오디오 파일에는 다양한 주파수가 포함되어 있습니다. 이는 좋은 일입니다. 왜냐하면 존재하는 주파수가 노래를 고유하게 식별할 수 있기 때문입니다.

스펙트로그램

전체 노래에 대해 푸리에 변환을 실행하면 전체 노래에서 존재하는 주파수의 강도를 볼 수 있습니다. 그러나 존재하는 주파수는 시간에 따라 변합니다. 시간에 따라 변하는 주파수를 더 잘 표현하기 위해서는 푸리에 변환을 수행하기 전에 노래를 작은 섹션으로 나눠야 합니다. 이를 스펙트로그램 만들기라고 합니다.

다음은 스펙트로그램이 어떻게 작동하는지에 대한 간단한 애니메이션입니다:

첨부 이미지
첨부 이미지
첨부 이미지

위 애니메이션에서 볼 수 있듯이, 노래는 먼저 작은 섹션으로 나뉩니다. 다음으로 푸리에 변환을 사용하여 이러한 각 섹션의 주파수 스펙트럼을 계산합니다. 이러한 모든 주파수 스펙트럼을 함께 모으면 스펙트로그램이 됩니다.

이를 구체적으로 보기 위해 Like a Stone의 스펙트로그램을 살펴보겠습니다:

첨부 이미지

스펙트로그램이 2차원처럼 보이지만, 실제로는 다음 축을 가진 3D 그래프입니다:

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

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

위 스펙트로그램을 보면 가장 밝은 부분(가장 강한 주파수)이 거의 전적으로 5000Hz 이하에서 발생합니다. 이는 음악에서 꽤 일반적입니다. 예를 들어, 대부분의 피아노는 27Hz-4186Hz의 주파수 범위를 가집니다.

트랙에 존재하는 주파수는 많은 식별 정보를 포함하고 있으며, 스펙트로그램을 계산하면 그 정보에 접근할 수 있습니다. 다음 섹션에서는 이 모든 정보를 트랙의 고유한 지문으로 바꾸는 방법을 배우게 됩니다.

지문화(Fingerprinting)

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

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

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

왜 지문은 스펙트로그램 피크에 기반하는가?

스펙트로그램 피크는 오디오 신호의 어느 시점에서 큰 주파수입니다. 스펙트로그램에서 이를 인식할 수 있는데, 가장 밝은 점이 될 것입니다.

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

스펙트로그램 피크는 노이즈에 의해 영향을 받을 가능성이 가장 적은 지점입니다. 노이즈가 스펙트로그램 피크보다 커야 인식할 수 없게 되며, 스펙트로그램 피크는 트랙에서 가장 큰 주파수 성분입니다.

이를 시각적으로 이해하기 위해 노이즈가 추가된 푸리에 변환 신호의 이전 예제를 살펴보세요. 노이즈가 추가되어도 주파수 피크는 대략적인 형태를 유지합니다.

첨부 이미지

오디오 지문화에 스펙트로그램 피크를 사용하는 또 다른 장점은 저장해야 하는 데이터양을 줄인다는 것입니다. 가장 큰 주파수 성분만 저장하면 다른 모든 것을 저장할 필요가 없습니다. 이렇게 하면 검색할 데이터가 적어 지문 검색 속도가 빨라집니다.

그러나 지문에 주파수 피크를 사용하기 전에 먼저 그것들을 찾아야 합니다. 다음 섹션에서 그 방법을 배우게 됩니다.

피크 찾기

이전 섹션에서 논의했듯이, 스펙트로그램의 피크는 신호에서 가장 강한 주파수를 나타냅니다. 주파수 피크가 오디오 지문에서 사용 가능하려면, 시스템이 노래의 모든 부분을 인식할 수 있도록 스펙트로그램 전체에 고르게 분포되어야 합니다.

예를 들어, 모든 피크가 노래의 시작 부분에 있다면 지문은 이후 부분을 커버하지 못할 것입니다:

첨부 이미지

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

또한 시스템이 노이즈와 주파수 왜곡을 처리할 수 있도록 피크가 주파수별로 고르게 분포되어야 합니다. 때로는 노이즈가 매우 크고 특정 주파수 범위에 집중될 수 있습니다. 예를 들어 배경의 자동차 경적 소리:

첨부 이미지

위 애니메이션에서 피크는 시간적으로 잘 분포되어 있지만 작은 주파수 대역에 뭉쳐 있습니다. 자동차 경적과 같은 큰 소음이 들어오면 어떤 피크가 선택되는지 변경하여 노래의 전체 섹션을 인식 불가능하게 만들 수 있습니다.

피크를 잘 분포시키면서 스펙트로그램 피크를 찾기 위해 최대 필터(maximum filter)라는 이미지 처리 기술을 빌려올 수 있습니다. 과정은 다음과 같습니다:

  1. 최대 필터를 사용하여 스펙트로그램의 피크를 강조합니다.
  2. 원래 스펙트로그램과 비교하여 강조된 피크를 찾습니다.
  3. (선택 사항) 일부 피크를 버립니다.

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

1단계: 최대 필터

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

첨부 이미지

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

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

첨부 이미지

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

최대 필터에는 지역 최대값을 찾을 때 사용할 상자의 크기를 제어하는 매개변수가 있습니다. 이 매개변수를 더 작은 상자로 설정하면 더 많은 피크를 얻게 됩니다. 마찬가지로, 이 매개변수를 더 크게 설정하면 더 적은 피크를 얻게 됩니다.

2단계: 원래 피크 복구

최대 필터가 모든 작업을 하지는 않습니다. 필터는 지역 피크를 강조했지만 위치를 찾지 않았습니다. 피크 위치를 찾기 위해서는 원래 스펙트로그램과 필터링된 스펙트로그램에서 값이 같은 지점을 찾아야 합니다.

이 트릭 뒤의 아이디어는 스펙트로그램의 모든 비-피크 지점이 지역 피크로 대체되었기 때문에 값이 변경되었다는 것입니다. 값이 변경되지 않은 유일한 지점은 피크입니다.

다음은 위 스펙트로그램의 확대된 섹션입니다. 필터링된 스펙트로그램과 원래 스펙트로그램에서 값이 같은 지점이 강조되어 있습니다:

첨부 이미지

위 이미지에서 볼 수 있듯이, 두 스펙트로그램이 같은 값을 가진 강조된 지점은 이미지의 해당 부분의 지역 피크에 해당합니다.

모든 피크를 함께 그리면 성좌 지도(constellation map)라고 불리는 것이 만들어집니다. 다음은 Like a Stone의 성좌 지도입니다:

첨부 이미지

이 그래프는 밤하늘의 이미지와 비슷하게 생겼기 때문에 성좌 지도라고 불립니다. 컴퓨터 과학이 낭만적이지 않다고 누가 말했나요?

3단계: (선택 사항) 피크 버리기

피크의 성좌 지도를 얻은 후, 다음 단계는 일부를 버리는 것입니다. 지문의 크기는 사용하는 피크 수에 따라 달라집니다. 데이터베이스에 수백만 곡을 저장할 때는 지문을 작게 유지하는 것이 중요합니다.

그러나 사용하는 피크 수를 줄이면 시스템의 정확도가 낮아집니다. 지문의 피크가 적을수록 샘플을 올바른 노래와 일치시킬 기회가 줄어듭니다.

지문에서 피크 수를 줄이는 몇 가지 옵션이 있습니다:

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

지문 구성을 거의 완료했습니다. 다음 단계는 피크에서 해시 세트를 생성하는 것입니다.

해싱

[abracadabra 구현]

해싱의 필요성을 설명하기 위해, 지문이 단순히 스펙트로그램 피크의 모음이라고 상상해보세요. 각 피크의 주파수는 특정 수의 비트, 예를 들어 10비트로 표현될 것입니다. 10비트의 정보로는 2^10=1024개의 개별 주파수를 표현할 수 있습니다. 트랙당 수천 개의 이런 포인트가 있으면 중복되는 것들이 빠르게 많아집니다.

지문에 있어 고유성은 중요합니다. 검색을 훨씬 빠르게 하고 더 많은 노래를 인식하는 데 도움이 되기 때문입니다. Shazam이 고유성 문제를 해결한 방법은 피크 쌍에서 해시를 만드는 것입니다:

첨부 이미지

위 다이어그램은 스펙트로그램의 확대된 부분을 보여줍니다. 각 원은 피크를 나타내고 점선 상자는 해시를 나타냅니다. 해시가 두 개의 피크로 구성된 것을 볼 수 있습니다. 각 해시에 기록되는 정보는 각 피크의 주파수인 fA와 fB, 그리고 그 사이의 시간 차이인 𝚫T입니다.

포인트를 쌍으로 묶는 장점은 쌍으로 묶인 두 포인트가 단일 포인트보다 훨씬 고유하다는 것입니다. 수학적으로 보면, 각 포인트가 10비트의 주파수 정보를 가지고 있고, 두 포인트 사이의 시간 차이가 10비트로 표현될 수 있다면 30비트의 정보를 가지게 됩니다. 2^30=1,073,741,824로, 단일 포인트의 1,024가지 가능성보다 훨씬 큽니다.

Shazam은 다음 알고리즘을 사용하여 쌍을 생성합니다:

  1. 한 점을 선택합니다. 이것을 앵커 포인트라고 합니다.
  2. 앵커 포인트에 대한 스펙트로그램의 대상 영역을 계산합니다.
  3. 대상 영역의 모든 포인트에 대해 앵커 포인트와 쌍을 만듭니다.

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

첨부 이미지

대상 영역 선택은 Shazam 논문에 설명되어 있지 않지만, 논문에 포함된 이미지는 앵커 포인트의 시간보다 약간 앞에서 시작하고 앵커 포인트의 주파수를 중심으로 한 것으로 보여줍니다.

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

다른 정보들다른 정보들
포인트 A 주파수 (fA)포인트 B 주파수 (fB)시간 차이 (𝚫T)포인트 A 시간트랙 ID

처음 세 열(fA, fB 및 𝚫T)이 해시를 구성합니다. "포인트 A 시간"과 "트랙 ID"는 해시를 노래의 특정 시간에 위치시키는 데 사용됩니다. 이는 나중에 일치 과정에서 사용될 것입니다.

특정 트랙의 모든 해시가 지문을 구성합니다. 다음 섹션에서는 Shazam이 이러한 지문을 어떻게 일치시키는지 알아보겠습니다.

일치(Matching)

데이터베이스에 지문 모음이 있다면, Shazam은 주어진 오디오 샘플이 어떤 것과 일치하는지 어떻게 알아낼까요? 여기서 시스템의 일치 부분이 사용됩니다. 앞서 본 시스템 다이어그램을 기억해 보세요:

첨부 이미지

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

일치 알고리즘은 다음 단계를 포함합니다:

  1. 샘플의 지문과 일치하는 데이터베이스의 모든 해시를 검색합니다.
  2. 이러한 해시를 노래별로 그룹화합니다.
  3. 각 노래에 대해 해시가 정렬되는지 확인합니다.
  4. 가장 많은 정렬된 해시를 가진 트랙을 선택합니다.

이 단계들을 차례로 살펴보겠습니다.

1단계: 일치하는 해시 검색

[abracadabra 구현]

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

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

데이터베이스의 개별 해시 형식을 기억해 보세요:

포인트 A 주파수 (fA)포인트 B 주파수 (fB)시간 차이 (𝚫T)포인트 A 시간트랙 ID

각 해시와 연결한 트랙 ID 덕분에 해시를 트랙별로 그룹화할 수 있습니다. 이를 통해 잠재적으로 일치하는 각 트랙의 점수를 매길 수 있습니다.

3단계: 해시가 정렬되는지 확인

[abracadabra 구현]

샘플이 노래와 일치한다면, 해당 샘플에 있는 해시는 노래의 일부 섹션의 해시와 정확히 정렬되어야 합니다. 아래 다이어그램은 이것이 어떻게 보일지 보여줍니다:

첨부 이미지

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

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

첨부 이미지

위 다이어그램에서 빨간색 원은 샘플이 온 섹션 외부의 노래 지점과 일치하는 해시를 나타냅니다. 이 상황에서는 샘플이 노래와 완벽하게 일치한다는 것을 보기 어렵습니다.

더 나쁜 점은, 때로는 해시가 잘못된 노래와 일치할 수 있다는 것입니다! 여기서 해시가 정렬되는지 확인하는 것이 중요합니다.

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

샘플 시간트랙 시간트랙 시간 - 샘플 시간
31310
41410
72013
51510
6126
11110

위 표에서 트랙 시간 - 샘플 시간이 10인 모든 일치 항목이 강조 표시되어 있습니다. 이들은 진정한 일치이며, 다른 두 행은 거짓 일치입니다. 이것이 사실인지 확인하기 위해 이전에 본 것과 유사한 다이어그램을 살펴보겠습니다:

첨부 이미지

위 다이어그램에는 이전 표의 동일한 해시가 포함되어 있습니다. 보시다시피, 진정한 일치는 샘플이 트랙 시간에 시작하는 시간만큼의 트랙 시간 - 샘플 시간을 가집니다.

이것을 트랙의 점수로 바꾸는 방법을 보기 위해 이 데이터를 히스토그램으로 만들어 보겠습니다. 히스토그램은 막대 차트의 고급 이름입니다. 각 '트랙 시간 - 샘플 시간'을 그것이 발생하는 횟수에 대해 그릴 것입니다:

첨부 이미지

위 히스토그램의 각 막대는 빈(bin)이라고 합니다. 오디오 샘플과 얼마나 잘 일치하는지에 따라 노래의 점수를 매기기 위해서는 가장 큰 빈을 취하기만 하면 됩니다. 좋은 일치가 아닌 노래는 모든 빈에서 낮은 값을 가질 것이지만, 좋은 일치인 노래는 빈 중 하나에서 큰 스파이크를 가질 것입니다.

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

단순히 가장 많은 해시와 일치하는 노래를 선택하는 것이 구현하기 훨씬 간단할 텐데 왜 그렇게 하지 않느냐고 궁금할 수 있습니다. 이 접근 방식의 문제는 모든 노래의 길이가 같지 않다는 것입니다. 길이가 긴 노래는 길이가 짧은 노래보다 더 많은 일치를 얻을 가능성이 높으며, 일부 Spotify 트랙이 4시간을 넘는 경우 결과에 정말 영향을 줄 수 있습니다!

결론

여기까지 읽으신 여러분 수고하셨습니다. 긴 여정이었죠! 이 글을 통해 Shazam이 오디오에서 지문을 추출하는 방법과 이러한 지문을 이미 데이터베이스에 등록된 것과 일치시키는 방법을 배웠습니다.

요약하자면, Shazam은 노래를 등록하기 위해 다음을 수행합니다:

  1. 노래의 스펙트로그램을 계산합니다
  2. 해당 스펙트로그램에서 피크를 추출합니다
  3. 이러한 피크를 해시로 쌍을 만듭니다
  4. 노래의 해시 모음을 지문으로 저장합니다

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

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

abracadabra 소개

저는 이 논문을 구현한 abracadabra를 작성하는 과정에서 여기에 쓴 모든 것을 배웠습니다.

코드로 어떻게 보일지 관심이 있다면 살펴보세요! 모든 것이 오픈 소스이고 프로젝트를 최대한 문서화했습니다. abracadabra는 다른 프로젝트에서 라이브러리로도 사용할 수 있으므로 자유롭게 재구성하고 멋진 것을 만들어 보세요. 사용하시면 알려주시길 바랍니다.

 


👥 더 나은 데브필을 만드는 데 의견을 보태주세요

Top 1% 개발자로 거듭나기 위한 처방전, DevPill 구독자 여러분 안녕하세요 :) 

저는 여러분들이 너무 궁금합니다. 

어떤 마음으로 뉴스레터를 구독해주시는지, 

어떤 환경에서 최고의 개발자가 되기 위해 고군분투하고 계신지, 

제가 드릴 수 있는 도움은 어떤 게 있을지. 

아래 설문조사에 참여해주시면 더 나은 콘텐츠를 제작할 수 있도록 힘쓰겠습니다. 설문에 참여해주시는 분들 전원 1개월 유료 멤버십 구독권을 선물드립니다. 유료 멤버십에서는 아래와 같은 혜택이 제공됩니다.

  • DevPill과의 1:1 온라인 커피챗
  • 멤버십 전용 슬랙 채널 참여권
    • 채용 정보 공유 / 스터디 그룹 형성 / 실시간 기술 질의응답
  • 이력서/포트폴리오 템플릿

 

설문 참여하고 유료 멤버십 혜택받기 →

첨부 이미지

 

 

다가올 뉴스레터가 궁금하신가요?

지금 구독해서 새로운 레터를 받아보세요

이번 뉴스레터 어떠셨나요?

데브필 DevPill 님에게 ☕️ 커피와 ✉️ 쪽지를 보내보세요!

댓글

의견을 남겨주세요

확인
의견이 있으신가요? 제일 먼저 댓글을 달아보세요 !
© 2025 데브필 DevPill

Top 1% 개발자로 거듭나는 성공 처방전

뉴스레터 문의dev.redpill@gmail.com

메일리 로고

도움말 자주 묻는 질문 오류 및 기능 관련 제보 뉴스레터 광고 문의

서비스 이용 문의admin@team.maily.so

메일리 사업자 정보

메일리 (대표자: 이한결) | 사업자번호: 717-47-00705 | 서울 서초구 강남대로53길 8, 8층 11-7호

이용약관 | 개인정보처리방침 | 정기결제 이용약관 | 라이선스