Как Shazam узнаёт песню за секунды — разбор от Perthirtysix
Микрофон ловит звук и превращает его в waveform, по сути последовательность чисел, давление воздуха во времени. Сырые волны бесполезны: та же песня громче даёт другой waveform.
Поэтому телефон прогоняет звук через Fast Fourier Transform. Каждые 23 миллисекунды FFT раскладывает кусок волны на частоты — какие чистые тона нужно сложить, чтобы получить этот фрагмент. Складываем срезы рядом, получаем spectrogram: время по X, частота по Y, яркость = громкость.
Но хранить весь spectrogram невозможно. Алгоритм выкидывает почти всё и оставляет только самые громкие пики — sparse constellation map. Это делает систему устойчивой к шуму: фон добавляет низкий уровень энергии, но редко создаёт самый громкий пик в регионе.
Понятно, что один пик ничего не значит, 1200 Hz встречается в тысячах песен. Но пара пиков: 1200 Hz и 2400 Hz с разницей в 0,3 секунды уже специфична. Алгоритм берёт каждый пик как anchor, определяет target zone справа от него и создаёт hash из двух частот и временного интервала.
Поиск работает через inverted index: вместо «какая песня совпадает?» система спрашивает «для каждого звука из клипа, в каких песнях он есть?». O(1) lookup, независимо от размера базы. Финальная проверка по timing: если хэши в клипе разделены 1,2 секунды, в песне тоже должны быть на том же расстоянии.
В полной статье, конечно, понятнее и с интерактивными демо, рекомендую: https://perthirtysix.com/how-the-heck-does-shazam-work
Интерактивы типа как на видео в этом посте.
@prog_stuff
Post #2812
1.18K
- ❤ 5
- 👍 1