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 在 音频
每月205次下载
在 2 crates 中使用
340KB
7.5K SLoC
bliss音乐分析器 - Rust版本
bliss-rs是bliss的Rust改进版本,一个用于通过分析歌曲并计算它们之间距离来制作播放列表的库。
与bliss类似,它简化了“智能”播放列表和/或连续播放的创建,类似于Spotify/Grooveshark Radio,同时也简化了为现有音频播放器创建插件的开发。例如,您可以使用它制作舒缓的播放列表来帮助您入睡,快速播放列表来让您在白天开始行动等。
目前(如果您正在寻找易于使用的流畅播放体验),blissify实现了MPD的bliss。
还有python绑定。轮子是用maturin编译的;源代码在此处提供以供参考。
注意1:bliss-rs输出的功能与C-bliss使用的功能不兼容,因为它基于实际文献使用不同的、更精确的值。它也更快。
示例
对于简单的分析和距离计算,请参阅examples/distance.rs
和examples/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还是可执行文件)。
致谢
- 此库在频谱/音色分析方面严重依赖aubio的Rust绑定,所以向librosa的创作者和贡献者以及@katyo表示感谢,他为Rust制作了aubio绑定。
- 色度提取的第一部分基本上是将librosa的librosa的chroma特征提取从Python重写到Rust,只使用了所需的最小功能。同样感谢两位创作者和贡献者。
- 最后,感谢Christof Weiss为我指明色度特征总结的正确方向,这些总结基本上是将AudioLabs Erlangen的一些出色的笔记本从Python重写到Rust,您可以在这里找到。
依赖关系
~14–26MB
~428K SLoC