pyin

Crates.iopyin
lib.rspyin
version1.2.0
sourcesrc
created_at2022-04-03 11:01:15.91429
updated_at2024-07-21 11:20:46.363196
descriptionpYIN pitch detection algorithm written in Rust
homepage
repositoryhttps://github.com/Sytronik/pyin-rs
max_upload_size
id561266
size100,743
Jeongmin Liu (Sytronik)

documentation

https://docs.rs/pyin

README

pYIN algorithm written in Rust

Crates.io Version Docs.rs Crates.io Downloads

This crate provides a pitch estimate for each frame of the audio signal and a probability that the frame is a voiced region.

The implementation is based on librosa. For easy translation from Python + Numpy to Rust, the implementation is written on top of ndarray crate.

Download & Run

You can download the executable binary from the Releases page.

pyin <input_file> <output_npy_file> <fmin> <fmax> --frame_ms <frame length in miliseconds>

Note

  • Supported audio files: the same as Creak crate.
    • Multi-channel audio files are supported.
  • output file: npy file contains the output ndarray with
    • shape: (4, no. of channels in input audio, no. of frames)
    • [0, :, :]: timestamp [sec]
    • [1, :, :]: f0 array [Hz]
    • [2, :, :]: voiced flag(1.0 for voiced, 0.0 for unvoiced) array
    • [3, :, :]: voiced probability array
  • If "-" is used as the output filename, the app will send output data to stdout.

Build & Run

You can use this both as an executable binary and as a library (C shared library and Rust library). When you build, you can use BLAS by turning on the blas feature flag.

As an executable binary

cargo run -F build-binary[,blas] --release <input_file> <output_npy_file> <fmin> <fmax> --frame_ms <frame length in miliseconds>

or

cargo build -F build-binary[,blas] --release
./target/release/pyin <input_file> <output_npy_file> <fmin> <fmax> --frame_ms <frame length in miliseconds>

Example using pYIN as a C shared library

The example is in test/test.c. To build and run it with GCC,

./compile_test.sh [blas]
LD_LIBRARY_PATH=target/release ./test_pyin

Using pYIN as a Rust library

Add the following to your Cargo.toml:

[dependencies]
pyin = "1.2.0"
# or, pyin = {version = "1.2.0", features = ["blas"]}

TODO

  • Input from stdio
  • More options supported by command-line arguments
Commit count: 36

cargo fmt