38 个版本

0.9.0 2024年8月12日
0.8.0 2024年7月8日
0.7.1 2024年5月30日
0.6.11 2024年1月3日
0.3.5 2021年7月28日

#55音频

Download history 181/week @ 2024-05-20 128/week @ 2024-05-27 30/week @ 2024-06-03 19/week @ 2024-06-10 23/week @ 2024-06-17 65/week @ 2024-07-01 152/week @ 2024-07-08 9/week @ 2024-07-15 50/week @ 2024-07-22 5/week @ 2024-07-29 3/week @ 2024-08-05 147/week @ 2024-08-12

每月205次下载
2 crates 中使用

GPL-3.0-only

340KB
7.5K SLoC

crate build doc

bliss音乐分析器 - Rust版本

bliss-rs是bliss的Rust改进版本,一个用于通过分析歌曲并计算它们之间距离来制作播放列表的库。

与bliss类似,它简化了“智能”播放列表和/或连续播放的创建,类似于Spotify/Grooveshark Radio,同时也简化了为现有音频播放器创建插件的开发。例如,您可以使用它制作舒缓的播放列表来帮助您入睡,快速播放列表来让您在白天开始行动等。

目前(如果您正在寻找易于使用的流畅播放体验),blissify实现了MPD的bliss。

还有python绑定。轮子是用maturin编译的;源代码在此处提供以供参考。

注意1:bliss-rs输出的功能与C-bliss使用的功能不兼容,因为它基于实际文献使用不同的、更精确的值。它也更快。

示例

对于简单的分析和距离计算,请参阅examples/distance.rsexamples/analyze.rs

如果您只想尝试从包含歌曲的文件夹中制作播放列表,这个示例包含了您需要的一切。用法

    cargo run --features=serde --release --example=playlist /path/to/folder /path/to/first/song

不要忘记--release 标志!

默认情况下,它将播放列表输出到stdout,但您可以使用-o <path>将其输出到特定路径。

为了避免多次分析整个文件夹,它还将在/tmp/analysis.json中存储分析。您可以通过使用-a <path>将此文件存储在特定位置来自定义此行为。

可用的代码示例

计算两首歌曲之间的距离

use bliss_audio::decoder::bliss_ffmpeg::FFmpeg as Decoder;
use bliss_audio::decoder::Decoder as DecoderTrait;
use bliss_audio::BlissError;

fn main() -> Result<(), BlissError> {
    let song1 = Decoder::from_path("/path/to/song1")?;
    let song2 = Decoder::from_path("/path/to/song2")?;
        
    println!("Distance between song1 and song2 is {}", song1.distance(&song2));
    Ok(())
}

从一首歌曲创建播放列表

use bliss_audio::decoder::bliss_ffmpeg::FFmpeg as Decoder;
use bliss_audio::decoder::Decoder as DecoderTrait;
use bliss_audio::{BlissError, Song};
use noisy_float::prelude::n32;

fn main() -> Result<(), BlissError> {
    let paths = vec!["/path/to/song1", "/path/to/song2", "/path/to/song3"];
    let mut songs: Vec<Song> = paths
        .iter()
        .map(|path| Decoder::song_from_path(path))
        .collect::<Result<Vec<Song>, BlissError>>()?;

    // Assuming there is a first song
    let first_song = songs.first().unwrap().to_owned();

    songs.sort_by_cached_key(|song| n32(first_song.distance(&song)));
    println!(
        "Playlist is: {:?}",
        songs
            .iter()
            .map(|song| &song.path)
            .collect::<Vec<&String>>()
    );
    Ok(())
}

进一步使用

与其重新发明获取用户库、播放歌曲等方法并将其嵌入到bliss中,不如查看库模块。它实现了常见的分析函数,并允许无缝地将分析后的歌曲放入sqlite数据库中。

参见blissify获取参考实现。

交叉编译

要将bliss-rs从linux交叉编译到x86_64 windows,通过以下方式安装x86_64-pc-windows-gnu目标:

    rustup target add x86_64-pc-windows-gnu

确保您的计算机上已安装x86_64-w64-mingw32-gcc

然后下载并解压ffmpeg的预构建二进制文件后,运行

    FFMPEG_DIR=/path/to/prebuilt/ffmpeg cargo build --target x86_64-pc-windows-gnu --release

将生成一个.rlib库文件。如果您想生成共享的.dll库,请在编译前将以下内容添加到Cargo.toml中,并且如果您想生成.lib静态库,请添加

    [lib]
    crate-type = ["cdylib"]

    [lib]
    crate-type = ["staticlib"]

当然,您可以通过将它们编译成.exe文件来自行测试示例。

    FFMPEG_DIR=/path/to/prebuilt/ffmpeg cargo build --target x86_64-pc-windows-gnu --release --examples

警告:要在Windows上完成所有上述操作并使其工作,需要在Windows的%PATH%avcodec-59.dll等)上安装ffmpeg的dll。通常在目标Windows上安装ffmpeg就足够了,但您也可以从/path/to/prebuilt/ffmpeg/bin中提取它们,并将它们放在您用cargo生成的旁边(无论是bliss的dll还是可执行文件)。

致谢

  • 此库在频谱/音色分析方面严重依赖aubioRust绑定,所以向librosa的创作者和贡献者以及@katyo表示感谢,他为Rust制作了aubio绑定。
  • 色度提取的第一部分基本上是将librosa的librosachroma特征提取从Python重写到Rust,只使用了所需的最小功能。同样感谢两位创作者和贡献者。
  • 最后,感谢Christof Weiss为我指明色度特征总结的正确方向,这些总结基本上是将AudioLabs Erlangen的一些出色的笔记本从Python重写到Rust,您可以在这里找到。

依赖关系

~14–26MB
~428K SLoC