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.

Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support