Artem Shelamanov A*

home/portfolio/kolo

Kolo

I got tired of Spotify recommending music I don't actually like, so, like any sane ML engineer, I decided to build my own Spotify - with some ML experiments and questionable amounts of tinkering along the way.

fig. 1 · the taste universe, live. every dot is a track from my library, placed by how it sounds. move across it to turn it.
01

How it works.

Three steps, all running on my own machine. No accounts, no cloud.

  1. 01

    Listen

    Every track in my library goes through MuQ-MuLan, an audio model that turns it into a 512-dimensional vector. Songs that sound alike land close together.

  2. 02

    Map

    K-means splits those vectors into six clusters, and t-SNE and UMAP flatten them into a 3D map I can fly through inside the player. I named the clusters by hand.

  3. 03

    Predict

    A small ensemble (an RBF support-vector regressor plus Extra Trees) learns my star ratings from the vectors, then guesses how I would rate anything I have not heard yet.

2,065
tracks embedded
1,208
ratings it learned from
0.47
stars of average error
90%
of guesses within one star
02

My taste, in six clusters.

K-means found the groups. I looked at what sat near each centre and named them myself.

  1. Drift Phonk & Bass House 345
  2. British Garage Indie & Alt-Rock 312
  3. Cinematic Ambient & Neoclassical OST 255
  4. Dark Alt-Pop & Trap-Rock 244
  5. Indie Dance & Synth-Rock 205
  6. Atmospheric Indie & Dream Pop 195
A 2D t-SNE projection of the library, coloured by cluster
fig. 2 · the same library flattened to two dimensions with t-SNE.
03

The player.

The player itself is React and Vite with an optional Tauri desktop shell: ratings in half stars, a queue, a loudness limiter, and imports from YouTube links or Spotify playlists.

04

Does it work?

Mostly. On ratings it has never seen, it lands within one star nine times out of ten.

The model is conservative and regresses toward the middle. Its worst miss: it predicted 3.4 stars for a track I gave half a star.

On a discovery run it scored 30 new tracks and kept four at four stars or more, including Kiasmos and David August.