WAVE: Weighted Audio Vibe Engine
The crowd model and default weights behind the radio and recommendations of Knob, a self-hosted music server. A server maps its own library onto the crowd pack and offline, on CPU, learns which songs and artists people play together. It never sends a listener's library or history anywhere.
| File | What it is |
|---|---|
CrowdPack.bin |
Artist and recording vectors learnt from public listening (format version 2, 682 MB) |
weights.json |
The engine's default weights: how much each signal counts when a station picks the next song |
Crowd pack
Vectors trained with skip-gram with negative sampling (item2vec) over listening sessions from the full ListenBrainz listens dump 2723 (15 October 2026, CC0): 2.9 billion listens in 136 million sessions (a session ends after 30 minutes without a listen).
| Artists | 3,716,239, 64 dimensions |
| Recordings | 8,000,000 (the most-heard; at least 5 sessions each), 32 dimensions |
| Context | 3 songs either side within a session, 5 negative samples |
| Rank | Each recording's place among its artist's recordings by sessions heard (1 = most heard) |
| SHA-256 | b65359b1fca904eb9655576a0328690d0ba7a8c939d47b911aaa681a6e69e228 |
No listener data is in the pack. Artists and recordings are identified only by 64-bit keys hashed from their normalised names, so a server looks up its own songs by artist and title. No MusicBrainz ids are needed.
Format (little-endian): "SNCP", int32 version, then the artist table (int32 count, int32 dimensions, rows of
uint64 key, float32 scale, int8 values) and the recording table (int32 count, int32 dimensions, rows of uint64 key,
int32 artist row, uint16 rank, float32 scale, int8 values). Rows are fixed-size and sorted by key, so a server
binary-searches the file for its few thousand songs instead of loading it. Values are unit vectors quantised to signed
bytes with one scale per row.
Install: put CrowdPack.bin in the server's cache (enrichment) folder and restart. The recommendation studio
shows how many songs and artists it mapped.
Weights
A station scores each candidate song with a weighted sum of signals: genre and era of the seed, the household's own
co-listening, what the crowd plays next (CrowdNext), artists the crowd hears together (CrowdArtist), sound
similarity, likes, skips and spacing. These weights were trained on one household's cleaned listening history, with
the crowd pack mapped onto its library. Against the earlier hand-set defaults:
| Before | After | |
|---|---|---|
| Next plays predicted in the library (hit rate) | 39.5% | 44.0% |
| First listens predicted | 0% | 6-11% |
The station's character (genre, era, sound, seed artist, spacing, skips, dislikes, hearts) is never trained. Genre
flow and the sound of the join between songs (GenreFlow, SoundFit) did not predict next plays, so they are at 0.
Each Knob household trains its own weights from its history, starting from these.
Licence
The listening data is ListenBrainz's, under CC0. The vectors and weights are released under AGPL-3.0.