A news anchor's cadence, an angry tone, a jazz trumpet: no transcript holds them. How it works ↓
That's the demo. Below: how well it works, and how.
01 · Words → sounds
Type a sound, get the sound
For each ready-made search: how many of the top 10 clips carry the right human label. Click a dot to run it.
CLAPGemma
CLAP, average
–
of 10 right · trained on sounds with captions
Gemma, average
–
of 10 right · never shown captioned sounds
02 · Heard, not named
The model hears the mood. Words can't reach it.
CREMA-D actors say the same sentences in six moods, so a transcript is identical. Typing the mood finds nothing; clicking a clip finds its kind. Bars: how many of an average clip's 10 nearest neighbours share its mood.
CLAPGemmachance
Typed “an angry voice”
–
angry clips in the top 10
Clicked an angry clip
–
neighbours also angry, on average (chance 1.7)
03 · On the map
Three collections, one space
Every clip sits in the same space, whatever it came from. The layer buttons at the top hide any of them.
04 · How it works
One model, two inputs, one space
Nothing is transcribed or tagged. Sound and words become the same kind of vector, and search is just “nearest”.
🎧
A clip
2–20 s of audio
→
🧠
CLAP or Gemma
audio encoder
→
A vector
512 / 768 numbers
→
✨
A dot on the map
UMAP squeezes it to 2-D
⌨️
Your words
“a dog barking”
→
🧠
The same model
text encoder
→
A vector
same space as the clips
→
🎯
Nearest clips light up
cosine similarity
Search by example skips words: it ranks clips by how close their vectors are to the clip you picked.
✓ / ✗ come from human labels the search never sees. Podcasts have no clip labels: ? means listen and judge.
Embeddings come from two finished sister studies (audio-vocab, podcast-vibe-search). Nothing was trained for this page.
05 · Fine print
What the numbers don't show
Labels are strict. A ✗ can still sound right: a giggle counts as laughter, but a crowd laughing inside an “applause” clip doesn't.
Neighbours confuse neighbours. “Clearing throat” and “shouting” reach only 4 of 10: their nearest clips are coughs and screams. Here one plain word beat a richer description (0 → 4 of 10).
The example chips are the best case. “Angry clip → similar” starts from the most typical angry clip; chart 02 shows the average.
Podcast clips are 20 s long, the others 2–10 s, so a short cough inside a podcast is diluted. Podcasts also cluster by show (same hosts, mic and music).
FSD50K audio plays once its zip is imported (it was embedded in Colab).
../audio-vocab/.venv/Scripts/python scripts/serve.py # http://127.0.0.1:8770/
../audio-vocab/.venv/Scripts/python scripts/build.py --drop podcasts # rebuild without a collection