Skip to content

Sytronik/pyin-rs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

44 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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.

Build & Run

You can use this both as an executable binary and as a library (C shared library and Rust library).

As an executable binary

cargo run --release <input_file> <output_npy_file> <fmin> <fmax> --frame_ms <frame length in miliseconds>

or

cargo build --release
./target/release/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.

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
LD_LIBRARY_PATH=target/release ./test_pyin

Using pYIN as a Rust library

Add the following to your Cargo.toml:

[dependencies]
pyin = "1.0"

TODO

  • Input from stdio
  • More options supported by command-line arguments