Rust crate providing audio file I/O utilities and helpers.
audio_samples_io is the I/O layer of the AudioSamples ecosystem. It builds on top of the representations provided by audio_samples to provide reading, writing, and streaming for WAV and FLAC files.
audio_samples
├── core types, signal generation, DSP, analysis
├── audio_samples_io
│ └── file I/O: read and write WAV and FLAC
├── audio_samples_python
│ └── python bindings via PyO3
├── audio_samples_streaming
│ └── streaming pipeline, device I/O, rodio, async
└── audio_samples_ml
└── STT and TTS integrations
| Crate | What it provides | Start here if... |
|---|---|---|
audio_samples |
AudioSamples<T>, core types, signal generation, DSP, analysis |
You need in-memory audio representations or signal processing primitives |
audio_samples_io |
Read and write WAV and FLAC files | You need to load or save audio files with minimal setup |
audio_samples_python |
Python bindings via PyO3 and NumPy interop | You want to use the library from Python or integrate with Python workflows |
audio_samples_streaming |
Chunk-based streaming, real-time device I/O, async pipelines | You need real-time audio processing or streaming pipelines |
audio_samples_ml |
Speech-to-text (STT) and text-to-speech (TTS) integrations | You want to integrate transcription or synthesis into your audio pipeline |
Currently supports .wav (including RF64/BW64 64-bit variants for files over 4 GiB), .flac, and .aiff/AIFF-C files. Read paths detect the container from the file's magic bytes, falling back to the extension.
Planned:
- opus / ogg
- mp3
Install via:
cargo add audio_samples_iouse std::time::Duration;
use audio_samples_io::error::AudioIOResult;
use audio_samples::{AudioSamples, sample_rate, sine_wave};
pub fn main() -> AudioIOResult<()> {
// create and write a basic signal and read it back
let sine_wave: AudioSamples<f32> =
sine_wave::<f32>(440.0, Duration::from_secs_f64(10.0), sample_rate!(44100), 1.0);
audio_samples_io::write("./sine_wave.wav", &sine_wave)?;
let read_sine_wave: AudioSamples<f32> = audio_samples_io::read("./sine_wave.wav")?;
println!("{:#}", read_sine_wave);
println!("Duration: {:.1}s", read_sine_wave.duration_seconds());
Ok(())
}Checkout the wav benchmark summary doc for a comparison against Hound and libsndfile. Check out flac benchmark summary
To run the benchmarks (Criterion) reading and writing.
cargo bench --bench wav_rw --features "wav"cargo bench --bench flac_rw --features "flac"I have included a small benchmark reported binary for collating benchmarks to a markdown file
cargo run --bin benchmark_reporter --features benchmark_reportingbenchmark_report.md— Markdown summary generated by the reporter binarybenchmark_results.csv— Detailed CSV export of benchmark rows (times in μs)benchmark_summary.csv— Executive summary CSV
MIT License
Contributions are welcome. Please submit a pull request and see CONTRIBUTING.md for guidance.
If you use AudioSamples in research, please cite:
@inproceedings{geraghty2026audio,
author = {Geraghty, Jack and Golpayegani, Fatemeh and Hines, Andrew},
title = {Audio Made Simple: A Modern Framework for Audio Processing},
booktitle = {ACM Multimedia Systems Conference 2026 (MMSys '26)},
year = {2026},
month = apr,
publisher = {ACM},
address = {Hong Kong, Hong Kong},
doi = {10.1145/3793853.3799811},
note = {Accepted for publication}
}