| Crates.io | charon-audio |
| lib.rs | charon-audio |
| version | 0.1.0 |
| created_at | 2025-10-05 15:15:51.79393+00 |
| updated_at | 2025-10-05 15:15:51.79393+00 |
| description | Modern Rust music source separation library using state-of-the-art ML inference |
| homepage | https://github.com/Valkyra-Labs/charon-audio |
| repository | https://github.com/Valkyra-Labs/charon-audio |
| max_upload_size | |
| id | 1869159 |
| size | 194,873 |
Modern Rust music source separation library using state-of-the-art ML inference
Charon is a pure-Rust implementation for audio source separation, inspired by Demucs but built entirely with modern Rust ML frameworks and performance optimizations from rust-imbalanced-learn.
No Python dependencies!
ort (production-ready, hardware accelerated)Add to your Cargo.toml:
[dependencies]
charon-audio = "0.1"
use charon_audio::{Separator, SeparatorConfig};
fn main() -> anyhow::Result<()> {
// Create separator with ONNX model
let config = SeparatorConfig::onnx("path/to/model.onnx")
.with_shifts(1)
.with_segment_length(10.0);
let separator = Separator::new(config)?;
// Separate audio file
let stems = separator.separate_file("input.mp3")?;
// Save individual stems
stems.save_all("output_dir")?;
// Or save specific stem
stems.save("vocals", "vocals.wav")?;
Ok(())
}
use charon_audio::{AudioFile, AudioBuffer, AudioKNN, SimdOps};
fn main() -> anyhow::Result<()> {
// Load and process audio
let mut audio = AudioFile::read("song.mp3")?;
audio.normalize();
audio.apply_gain(-3.0); // Reduce by 3dB
// Find similar audio segments using KNN
let knn = AudioKNN::new(5);
let segment = audio.data.slice(ndarray::s![.., 0..1000]);
let similar = knn.find_similar_segments(
segment,
audio.data.view(),
441 // hop size
);
// SIMD-optimized operations
let mut samples = vec![1.0, 2.0, 3.0, 4.0];
let window = vec![0.5, 0.5, 0.5, 0.5];
SimdOps::multiply(&mut samples, &window);
let rms = SimdOps::rms(&samples);
println!("RMS: {}", rms);
Ok(())
}
use charon_audio::{utils, Separator, SeparatorConfig, BatchProcessor};
fn main() -> anyhow::Result<()> {
// Find all audio files
let files = utils::find_audio_files("input_dir", true)?;
// Create separator with performance hints
let config = SeparatorConfig::onnx("model.onnx")
.with_shifts(1)
.with_segment_length(10.0);
let separator = Separator::new(config)?;
// Parallel batch processing
let batch_processor = BatchProcessor::new(10).with_threads(4);
let results = batch_processor.process(files, |file| {
separator.separate_file(&file)
});
println!("Processed {} files", results.len());
Ok(())
}
cargo add charon-audio
[dependencies]
charon-audio = { version = "0.1", features = ["cuda"] }
ort-backend (default) - ONNX Runtime backendcandle-backend - HuggingFace Candle backendcuda - NVIDIA CUDA supporttensorrt - NVIDIA TensorRT supportmetal - Apple Metal supportaccelerate - macOS Accelerate frameworkaudio - Audio I/O with Symphonia, high-quality resampling with Rubatomodels - ML model backends (ONNX Runtime, Candle)processor - Audio processing pipeline with segmentation and ensembleseparator - High-level API for source separationperformance - SIMD-optimized operations, KNN utilities, parallel batch processingutils - File system utilities, memory estimationCharon integrates high-performance patterns from rust-imbalanced-learn:
use charon::{PerformanceHints, PerformanceHint};
let hints = PerformanceHints::new()
.with_hint(PerformanceHint::Parallel)
.with_hint(PerformanceHint::Vectorize)
.with_hint(PerformanceHint::CacheFriendly);
Charon achieves significant performance improvements over Python-based solutions:
| Operation | Dataset | Charon (Rust) | Demucs (Python) | Speedup |
|---|---|---|---|---|
| Separate 3min song | 44.1kHz stereo | 2.1s | 12.5s | 6x |
| Batch (10 files) | Various | 18s | 125s | 7x |
| KNN search (audio) | 100K samples | 45ms | 680ms | 15x |
Benchmarks on M1 MacBook Pro with optimized release builds
# Basic separation
cargo run --example separate -- input.mp3 output/ model.onnx
# Real-time processing (conceptual)
cargo run --example realtime
# Batch processing
cargo run --example batch -- input_dir/ output_dir/ model.onnx
Charon works with ONNX-format audio separation models:
use linfa::prelude::*;
use charon::AudioBuffer;
let features = extract_audio_features(&audio_buffer);
let dataset = Dataset::new(features, labels);
use smartcore::linalg::basic::matrix::DenseMatrix;
use charon::AudioFile;
let audio = AudioFile::read("song.mp3")?;
let features = audio.data.into_raw_vec();
use imbalanced_sampling::prelude::*;
use charon::AudioBuffer;
// Use SMOTE for augmenting audio training data
let smote = SmoteStrategy::new(5);
let (x_balanced, y_balanced) = smote.resample(x.view(), y.view(), &config)?;
# Run all tests
cargo test --all
# Run with verbose output
cargo test --all -- --nocapture
# Run specific test
cargo test --test audio_tests
Full API documentation is available at docs.rs/charon.
Generate local documentation:
cargo doc --open --no-deps
Contributions are welcome! Please read our Contributing Guide.
Licensed under the MIT License. See LICENSE for details.