Prove HN: Bliss – A library for making beautiful audio playlists, written in Rust

An initiate-provide library to produce audio playlists by evaluating distance between songs.

Display cloak: this page is set bliss-rs. For the frail bliss in C, overview


What’s bliss?

bliss-audio repo badge

bliss-audio crate badge

bliss-audio build badge

bliss-audio doc badge

is a library designed to produce beautiful playlists, by evaluating distance between songs.
It is miles especially important constructed-in in existing audio players, or for learn purposes.

You can overview it in dawdle for MPD
through blissify
for example.

The most essential algorithm works by first extracting frequent audio descriptors
(tempo, timbre, chroma…) from every music proper into a put of numeric components
per music. Once here is performed, the distance between two songs shall be merely
computed the utilization of the present distance() draw (which is appropriate
an euclidean distance, in truth).

Playlists can then be made by striking together shut songs (overview
“utilization” allotment for added data).

bliss is written in Rust (overview the
makes narrate of ffmpeg
and aubio.
Python bindings
are furthermore readily accessible.


The availability code is straight away accessible here.

It is miles soundless in pattern, so don’t hesitate to publish PRs, bug experiences, and so forth.


The finest skill is appropriate to add bliss-rs = "0.2.4" to your Cargo.toml.

In case you narrate MPD and want to produce beautiful playlists appropriate away, install
blissify instead: cargo install blissify.

You can also narrate the equipped
playlist instance
to produce playlists from a folder containing songs, and
a initiating music. Snappy instance whereas you happen to rob to possess to narrate it:

cargo flee --components=serde --free up --instance=playlist /route/to/folder /route/to/first/music

64-bits applications for blissify are readily accessible for Archlinux and Debian/Ubuntu:

Library utilization

Song::contemporary() does the overall heavy lifting, overview below:

Compute distance between two songs:

     narrate bliss_audio::{BlissError, Song};

     fn distinguished() -> Result {
         let song1 = Song::contemporary("/route/to/song1")?;
         let song2 = Song::contemporary("/route/to/song2")?;

         println!("Distance between song1 and song2 is {}", song1.distance(song2));

Analyze several songs and produce a playlist from the most essential music:

    narrate bliss_audio::{BlissError, Song};
    narrate noisy_float::prelude::n32;
    fn distinguished() -> Result {    
        let paths = vec!["/path/to/song1", "/path/to/song2", "/path/to/song3"];    
        let mut songs: Vec = paths    
            .method(|route| Song::contemporary(route))    
            .gain:: , BlissError>>()?;    
        // Assuming there is a distinguished music    
        let first_song = songs.first().unwrap().to_owned();  
        songs.sort_by_cached_key(|music| n32(first_song.distance(&music)));  
            "Playlist is: {:?}",  
                .method(|music| &music.route)  
                .gain:: >()  

For extra data, overview the

Technical minute print

The diagnosis course of works this skill:

Every music analyzed with Song::contemporary, has an diagnosis
discipline, which an in flip be transformed proper into a vector the utilization of

Every value represents an factor of the music, and an Evaluation
shall be indexed with AnalysisIndex, to safe tell discipline
(e.g. music.diagnosis[AnalysisIndex::Tempo] will get the tempo value.)

Right here’s what the assorted parts describe:

  • Tempo
    has one associated descriptor, that makes narrate of the spectral flux as an onset
    detection draw.
  • Timbre has seven diverse descriptors: the
    zero-crossing rate,
    and the indicate / median of the spectral centroid, spectral roll-off, and
    spectral flatness.
  • Loudness has two descriptors, the indicate / median loudness,
    which is a dimension of how loud the sound is, i.e. the amplitude
    delta of how remarkable the speaker membrane would possibly per chance perhaps perhaps well fair soundless switch when producing sounds.

    This descriptor is on the overall no longer extinct in learn papers because it very remarkable
    relies on the skill songs are recorded / encoded, but it wishes to be an integral
    allotment of a playlist-making algorithm. A truly soothing music will soundless wake
    you up if its quantity is modified into up to the maximum, even though it resembles a lot to
    other soothing tracks.

  • Chroma components
    possess ten diverse descriptors, which can per chance be interval components in step with
    this paper.

As you’ve noticed, the chroma components produce up for half of of the
components. Whereas the euclidean distance (every numeric feature counts for the
identical amount as the choice within the distance) offers very good
results, experimenting with metric studying, or merely adjusting
the distance coefficients would possibly per chance perhaps perhaps well toughen your abilities, so don’t hesitate
to slay so!

For extra on these components, and a few dialogue on metric studying, overview
this thesis, that became once made
namely for founding the premise of bliss’ innards.

And blissv1?

Some folk would possibly per chance perhaps perhaps possess noticed that the outdated location of bliss’
repository became once here.
This repo contains the frail bliss code, which became once written in C. On the choice hand, it has
been re-written in Rust, in teach to place into effect from the bottom up a extra scientific come
to song data retrieval.

The frail C library is soundless bugfixed though, and its webpage is
soundless accessible,
though it’s recommanded to narrate the Rust
model, as it’s faster and further total.

Display cloak that the components generated by C-bliss and bliss-rs are furthermore

Be half of the pack! Be half of 8000+ others registered customers, and safe chat, produce groups, post updates and produce chums all around the sphere!