#audio #pitch #speech #voice

bin+lib pyin

pYIN pitch detection algorithm written in Rust

3 stable releases

1.2.0 Jul 21, 2024
1.1.0 Jul 21, 2024
1.0.2 Apr 3, 2022

#402 in Algorithms

Download history 3/week @ 2024-08-25 2/week @ 2024-09-01 25/week @ 2024-09-15 17/week @ 2024-09-22 5/week @ 2024-09-29 1/week @ 2024-10-06

119 downloads per month
Used in aus

MIT license

58KB
1K SLoC

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

Dependencies

~16MB
~292K SLoC