Find Duplicate Audio (Chromaprint)

Select a folder to scan. Uses spectral fingerprinting (Chromaprint-inspired, pure browser JS) to find duplicate and similar audio files.

Supported: MP3, WAV, FLAC, OGG, M4A, AAC
Ready
0 items

📖 How Audio Duplicate Detection Works

A complete guide to finding duplicate and similar audio files using spectral fingerprinting. Covers the algorithm, the Hamming threshold slider, the custom player, and every button in the interface.

100% Private — Your Audio Files Never Leave Your Computer Everything runs inside your browser using the Web Audio API. No uploads, no accounts, no tracking. Close the tab and all data is gone.

🎵 What This Tool Does

This tool finds duplicate and similar audio files by analyzing the actual sound content of each file — not file names or metadata. It creates a spectral fingerprint from the audio waveform and compares fingerprints using Hamming distance, the same core idea used by the AcoustID / Chromaprint system that powers music databases worldwide.

Unlike image duplicate finders, which compare visual pixels, audio comparison works in the frequency domain. The tool can detect the same song re-encoded at a different bitrate, slightly pitch-shifted, or re-exported from a DAW — as long as the harmonic content is similar.

Spectral Fingerprinting

Converts audio to 16 frequency bands per frame and hashes adjacent-band comparisons into a compact binary fingerprint.

Hamming Distance Matching

Counts differing bits between two fingerprints. Small Hamming distance = similar content. The threshold slider controls how strict matching is.

Runs in Background

Audio decoding uses the Web Audio API and continues processing even when you switch browser tabs — no pausing, unlike video scanning.

Built-In Audio Player

Every card has a custom play/pause/seek/mute player. Playing one track automatically pauses all others.

🧠 How the Chromaprint Algorithm Works

The algorithm is a pure-JavaScript implementation inspired by Chromaprint (used by AcoustID, MusicBrainz, and Shazam-style identification). Here is what happens step by step when you scan a file:

  1. Decode & Resample to 11,025 Hz

    The browser decodes the audio file at its native sample rate using AudioContext.decodeAudioData(). An OfflineAudioContext then resamples to a fixed 11,025 Hz mono signal. All files are normalized to the same rate before any analysis, so MP3, WAV, FLAC, and OGG are directly comparable.

  2. Apply a Hann Window & Split into Frames

    The mono audio stream is divided into overlapping frames of 4,096 samples each, stepping forward 1,024 samples (hop size) per frame. Before analysis, each frame is multiplied by a Hann window function — a smooth bell curve that eliminates edge artifacts at frame boundaries and improves frequency resolution.

  3. Compute the Frequency Spectrum (FFT)

    A pure-JavaScript Cooley-Tukey Fast Fourier Transform converts each windowed frame from the time domain to the frequency domain, producing a magnitude spectrum. Each FFT output bin represents the energy at a specific frequency. The spectrum for a 4,096-sample frame at 11,025 Hz covers frequencies from 0 Hz up to ~5,512 Hz at ~2.7 Hz resolution per bin.

  4. Divide Into 16 Frequency Bands & Hash

    The magnitude spectrum is divided into 16 equal-width frequency bands. The total energy in each band is summed. Then 15 adjacent-band comparisons are made: is band N louder than band N+1? Each comparison sets one bit in a 15-bit sub-fingerprint. This is the same core idea as Chromaprint: it captures relative spectral shape, not absolute values, making it robust against loudness normalization and bitrate changes.

  5. Build the Full Fingerprint

    One sub-fingerprint (15-bit integer) is produced per frame. The full audio file produces an array of these integers — typically hundreds to thousands depending on file length. This array is the audio "fingerprint" stored in memory for comparison.

  6. Compare Using Hamming Distance

    To compare two files, their fingerprint arrays are XOR'd element by element. Each XOR result is popcount'd (number of differing bits counted). The total errors are divided by the total bits compared to produce a distance percentage. If this percentage falls below the threshold set by the slider, the files are grouped as duplicates. A duration pre-check rejects pairs where one file is shorter than 50% of the other.

Why XOR + popcount? XOR produces a 1 for every bit position where the two fingerprints differ. Counting those 1-bits (popcount) gives the Hamming distance — the number of differing bits. Two identical recordings produce distance 0. Completely random fingerprints average ~50% distance. Most re-encoded or similar-content pairs fall below 5% distance.

🎚️ Understanding the Hamming Threshold Slider

The slider labeled Hamming Threshold (0–50) controls how strictly two fingerprints must match to be grouped as duplicates. It is the most important control on this page.

Low values (0–5) — Very strict

Only nearly identical files match. Use for exact duplicates, same file at different bitrates, or lossless vs. lossy exports of the same master. Very few false positives. May miss slightly re-encoded or pitch-shifted copies.

Medium values (6–20) — Balanced (default: 10)

Catches re-encoded versions, different bitrates (320k vs 128k), and slight post-processing. The default of 10 is a good starting point for music libraries. Some false positives are possible for songs with similar instrumentation.

High values (21–50) — Loose

Groups files with similar overall spectral character, even if the content is different. Useful for finding all tracks with similar timbral texture (e.g. all recordings from the same session). Expect more false positives — always review before deleting.

Re-clustering is instant. When you adjust the slider and release it, all already-scanned fingerprints are re-grouped using the new threshold immediately — no re-scanning needed. The scan only needs to run once per folder.
The slider uses quadratic scaling. Moving from 0 to 10 feels more impactful than moving from 40 to 50, which makes fine-tuning at low thresholds easier. The actual comparison threshold in percent is (slider²) / 50 — so slider 10 = 2% bit-error rate, slider 20 = 8%, slider 30 = 18%, slider 50 = 50%.

✅ What It Finds — and What It Might Miss

✅ Finds Well
  • The same track at different bitrates (e.g. 320k MP3 vs 128k MP3)
  • Lossless vs. lossy exports of the same master (WAV vs MP3)
  • Re-encoded copies in different formats (FLAC → OGG)
  • Lightly normalized or level-adjusted versions
  • The same recording with slightly different silence at start/end
  • Duplicate podcasts or spoken-word recordings
  • Sound effects saved in multiple formats
⚠️ May Struggle With
  • Heavily pitch-shifted versions (more than ~2 semitones)
  • Time-stretched recordings
  • Remixes with significant additional instrumentation
  • Short clips (under ~15 seconds) — less fingerprint data
  • Files with heavy noise or severe compression artifacts
  • Very different song sections compared (intro vs bridge)
If you're looking for covers, alternate versions, or live vs studio recordings, try the Essentia HPCP algorithm instead — it uses Harmonic Pitch Class Profiles and is more robust for musically related but not identical recordings.

▶️ The Custom Audio Player

Every audio card has a built-in player. Here's how to use it:

All audio player controls and their functions
ControlWhat it does
▶️ Play buttonStarts playback. Automatically pauses any other playing track on the page.
⏸️ Pause buttonPauses playback. Audio position is remembered.
Progress barClick anywhere on the bar to seek to that position. Drag left/right to scrub.
🔊 / 🔇 Mute buttonMutes or unmutes this individual track.
🔇 Audio (toolbar)Mutes or unmutes all audio on the page at once.
Time displayShows current position / total duration (e.g. 1:23 / 3:45).
← / → arrow keysWhen the progress bar is focused, seeks backward or forward 5 seconds.
Exclusive playback. When you press play on any card, all other currently-playing tracks pause automatically. This makes it easy to audition multiple candidates from a duplicate group one by one.

📋 Step-by-Step: How to Use the Audio Duplicate Finder

Step 1

Select a Folder to Scan

Click 📁 Select Folder to Scan. A native folder picker opens (Chrome / Edge). Or drag and drop a folder onto the page. All audio files inside the folder and its subfolders are collected.

Supported formats: MP3, WAV, FLAC, OGG, M4A, AAC. Files over 100 MB are skipped. Non-audio files are silently ignored.

Audio scanning runs fully in the background — you can switch browser tabs freely. Unlike video scanning, the Web Audio API does not pause when the tab is hidden.
Step 2

Wait for the Scan

A progress bar shows how many files have been processed. Processing speed depends on file length and your CPU — expect roughly 1–3 seconds per track for typical music files. Duplicate groups appear live as they're found — you don't have to wait for the full scan to finish before reviewing results.

Click Stop at any time to halt the scan. Results found so far remain visible.

Step 3

Adjust the Hamming Threshold

After scanning, use the Hamming Threshold slider to control matching sensitivity. Moving the slider re-groups all already-processed fingerprints instantly — no re-scanning is needed.

  • Start at the default of 10 (strict — exact and near-exact duplicates)
  • Move to 15–20 if you want to catch more re-encoded versions
  • Move below 5 only if you want only genuinely identical files
Step 4

Review the Groups

Results appear in numbered groups. Each group contains audio files that the algorithm considers similar. Use the built-in players to listen to each file before making decisions.

  • Click a card to select it (blue border)
  • Ctrl+Click (Cmd+Click on Mac) to add to the compare list (purple border)
  • Click the 🔍 icon on hover to open a full-screen preview with the modal-size player
  • Right-click any card for the context menu
  • Click & drag on empty space to box-select multiple cards
Step 5

Compare Files Side-by-Side

Ctrl+Click two or more cards, then click ⚖️ Compare in the toolbar. A modal opens showing each file with its own modal-size player, file metadata (duration, size, type, path), and a similarity percentage. For 3+ files, a full pairwise similarity matrix is shown.

Each file in the compare modal also has Copy Name, Move, and Delete buttons for quick actions without closing the modal.

Step 6

Move, Delete, or Copy

Select files and use the toolbar. With Queue Mode on (recommended), files are staged for review first:

📋 CopyCopy filename(s) to clipboard
📂 MoveStage for move to Audio-Duplicates folder
🗑️ DeleteStage for permanent deletion
⚖️ CompareView and listen side-by-side
Step 7

Queue Mode — Review Before You Commit

Queue Mode (enabled by default) stages files instead of acting immediately. Switch to the Move Queue or Delete Queue tab in the sidebar. Review the queued files, listen to them, remove any you change your mind about, then click Move All Files or Delete All Files to execute.

The default destination folder for Move is Audio-Duplicates, created inside the scanned folder. You can rename it in the queue input field.

🏛️ Quick Reference — All Controls

All toolbar buttons and keyboard shortcuts for the audio duplicate finder
Button / ControlWhat it does
🔄 New SearchReload the page and start a fresh scan
📋 Copy (N)Copy selected filenames to clipboard. N = count.
📂 Move (N)Move selected files or stage them in Move Queue
🗑️ Delete (N)Delete selected files or stage in Delete Queue
✕ Deselect AllRemove selection from all cards
⚖️ Compare (N)Open compare modal for Ctrl+clicked files. Needs 2+.
🔇 AudioMute / unmute all audio players on the page
Queue Mode checkboxStage files for review before executing. Recommended on.
Hamming Threshold sliderControls matching strictness. Re-clusters instantly on release.
Click cardSelect / deselect the file
Ctrl + Click cardAdd / remove from compare list (purple border)
Click & drag (empty area)Box-select multiple cards
Ctrl + dragAdd to existing selection with box
Right-click cardContext menu: Copy / Move / Delete / Compare
🔍 hover icon on cardOpen full-size preview with modal-size player
▶️ on card playerPlay audio. Pauses all other players on page.

💡 Tips for Best Results

Back Up First

Always back up your audio library before deleting anything. Deleted files bypass the recycle bin and cannot be recovered.

Listen Before Deleting

Play both tracks using the built-in players before removing one. The algorithm is good but not perfect — always verify by ear for important files.

Start Strict, Then Loosen

Begin with the default threshold of 10. Review those results first. Only raise the slider if you want to catch more approximate matches.

Compare the Metadata

In the Compare modal, check file size and duration. A larger file is usually higher quality. Keep the FLAC or high-bitrate version; delete the compressed copy.

Move, Don't Delete

Use Move to an "Audio-Duplicates" folder rather than deleting outright. Review the moved files after a few days before permanently removing them.

Scan One Genre at a Time

For very large libraries, scan by genre or artist subfolder. This reduces false positives from tracks with similar instrumentation and keeps groups manageable.

No Matches? Try a Different Algorithm

If Chromaprint finds nothing but copies clearly exist, try Essentia HPCP (better for harmonic similarity) or Meyda MFCC (better for timbral texture and spoken word).

⚠️ Known Limitations

Pure-JavaScript FFT has no hardware acceleration.

The FFT runs on the CPU in JavaScript. Processing a typical 3–4 minute track takes 1–3 seconds depending on your device. Very large libraries (1,000+ tracks) can take several minutes. Close other browser tabs to free up CPU.

No undo for file deletion.

The File System Access API bypasses the OS recycle bin entirely. Deleted audio files are gone permanently. Queue Mode exists for exactly this reason — always review before executing.

Memory limit for very large collections.

Each fingerprint is stored in memory as an array of integers. For very large libraries (10,000+ long tracks), RAM usage can become significant. Scan in subfolders if you run into performance issues.

Single folder at a time.

You can't scan two separate folders in one session. Workaround: scan their common parent directory so both are included in the same scan.

Move and Delete require Chrome or Edge.

The File System Access API is only available in Chrome 86+ and Edge 86+. Firefox and Safari can scan and display results but cannot move or delete files. Use "Download List" to export results in those browsers.

False positives at loose thresholds.

At higher threshold values (20+), songs with similar instrumentation (e.g. two jazz piano tracks) may be grouped together even if they're different recordings. Always listen before deleting.

🔒 Privacy & Security

Zero network activity after page load. Audio decoding and fingerprint computation all run locally via the Web Audio API. Open DevTools → Network tab during a scan: zero outbound requests.
No accounts, no cookies, no analytics. The only localStorage data is your OS detection and Queue Mode preference. No file names, paths, or fingerprints are ever saved or transmitted.
Folder access is scoped and session-only. Browser permission covers only the folder you selected, lasts only while the tab is open, and can be revoked from browser site settings at any time.
Purely static — no backend. Sakarto is HTML, CSS, and JavaScript. There is no server-side component, database, or API endpoint receiving any data from you.

❓ Frequently Asked Questions

Why is this called "Chromaprint-inspired" instead of the real Chromaprint?
The official Chromaprint library (used by MusicBrainz and AcoustID) is written in C++ and requires either a native binary or a WebAssembly build to run in a browser. This implementation is a pure-JavaScript port of the core ideas — Hann windowing, Cooley-Tukey FFT, 16-band spectral hashing, and Hamming distance comparison. The fingerprints it produces differ from official Chromaprint output and cannot be submitted to AcoustID, but the algorithmic approach is the same and works well for local duplicate detection. The practical advantage over using real Chromaprint WASM is zero dependencies, zero CDN requests, and full offline capability.
The same song in MP3 and FLAC isn't being grouped. Why?
MP3 compression modifies frequency content, so the spectral fingerprint of a FLAC and an MP3 from the same master will differ slightly even though they sound identical to the ear. Try raising the Hamming Threshold to 12–15 — this range reliably catches lossless vs. lossy pairs in most cases. Also check that both files have similar duration: the duration pre-check silently excludes pairs where one file is less than 50% the length of the other, which catches truncated or partial copies. Very heavily compressed MP3s (below 96 kbps) may differ enough that even a raised threshold won't match them against a lossless source.
How does the Hamming Threshold slider actually work? What do the numbers mean?
The slider uses quadratic scaling — the raw slider value is squared and divided by 50 to get a bit-error percentage. So slider 10 ≈ 2% bit-error rate, slider 20 ≈ 8%, slider 30 ≈ 18%, and slider 50 = 50%. Quadratic scaling means moving from 0 to 10 has a much bigger effect than moving from 40 to 50, making it easier to fine-tune at strict thresholds where most of the meaningful differences lie. Two identical files produce 0% error. Two completely unrelated audio files average around 50% error. Most re-encoded duplicates fall below 4–6%.
Two different songs are being grouped together. How do I fix it?
Lower the Hamming Threshold slider. Songs with similar overall spectral character — for example two acoustic guitar tracks with similar strumming patterns, or two bass-heavy electronic tracks — can produce fingerprints close enough to match at higher thresholds. Drop the slider to 5–8 if you're seeing unwanted matches. Always use the built-in player to listen to both tracks before acting on any group. If you're unsure, Move rather than Delete — the files land in a subfolder you can review and undo manually.
Why is scanning slow for some files?
Processing time scales directly with file length: each second of audio produces roughly 10 FFT frames, so a 60-minute podcast can take 10–20 seconds on a mid-range laptop. FLAC files also require decoding before the FFT runs, adding a few extra seconds per file. Scanning runs fully in the background via the Web Audio API (it doesn't pause when you switch tabs), so you can browse other pages while it runs. Closing other browser tabs frees up CPU and noticeably speeds up large scans.
Can Chromaprint find cover versions or remixes?
To a limited degree at higher thresholds, yes — particularly when the cover uses similar instrumentation and tempo to the original. But Chromaprint compares spectral energy shape, not which notes are played, so it's not designed for harmonic similarity. A cover performed on piano instead of guitar will have a very different spectral fingerprint even if it's the same melody. For reliable cover and alternate-version detection, use Essentia HPCP instead — its Harmonic Pitch Class Profiles are instrument-agnostic and specifically designed for this use case.
Re-clustering with the slider feels slow for my library. Is that normal?
Re-clustering runs in a background Web Worker and compares every fingerprint in memory against every other, so it scales with the square of file count. For a folder of 500 files that's 125,000 comparisons — very fast. For 5,000 files it's 12.5 million, which can take a few seconds even in a Worker. A progress indicator shows how far along it is. If re-clustering consistently takes more than 15 seconds, consider scanning by genre or artist subfolder rather than your entire library at once.
What formats are supported, and why are some files silently skipped?
Any format your browser can natively decode: MP3, WAV, FLAC, OGG, M4A, AAC. Files over 100 MB are skipped to avoid browser memory issues on larger devices. Formats the browser can't decode — WMA, APE, AIFF on older browsers, Opus in some configurations — are silently ignored. Files are identified by both MIME type and file extension, so an MP3 with a generic extension will still be processed as long as the browser can decode it.
Does this work on Firefox or Safari?
Scanning, fingerprint generation, the built-in player, result display, and the Compare modal all work in Firefox and Safari. The one thing that doesn't work is Move and Delete — those rely on the File System Access API, which is only available in Chrome 86+ and Edge 86+. In other browsers you can scan, listen, compare, and use Download List to export a report, then handle the files manually in your OS file manager.