#ggml #whisper

sys whisper-rs-sys

Rust bindings for whisper.cpp (FFI bindings)

15 releases (7 breaking)

0.8.0 Nov 27, 2023
0.6.1 Jun 18, 2023
0.3.1 Mar 11, 2023
0.2.1 Dec 15, 2022
0.2.0 Oct 29, 2022

#547 in Data structures

Download history 126/week @ 2023-08-18 143/week @ 2023-08-25 106/week @ 2023-09-01 171/week @ 2023-09-08 143/week @ 2023-09-15 52/week @ 2023-09-22 340/week @ 2023-09-29 273/week @ 2023-10-06 223/week @ 2023-10-13 244/week @ 2023-10-20 260/week @ 2023-10-27 269/week @ 2023-11-03 243/week @ 2023-11-10 229/week @ 2023-11-17 354/week @ 2023-11-24 159/week @ 2023-12-01

1,023 downloads per month
Used in 7 crates (via whisper-rs)

Unlicense

2MB
44K SLoC

C 21K SLoC // 0.1% comments CUDA 6.5K SLoC // 0.0% comments C++ 6K SLoC // 0.1% comments Rust 6K SLoC // 0.0% comments Metal Shading Language 2.5K SLoC // 0.0% comments Objective-C 1.5K SLoC // 0.1% comments Objective-C++ 52 SLoC // 0.1% comments

whisper-rs

Rust bindings to whisper.cpp

Usage

git clone --recursive https://github.com/tazz4843/whisper-rs.git

cd whisper-rs

cargo run --example basic_use

cargo run --example audio_transcription
use whisper_rs::{WhisperContext, WhisperContextParameters, FullParams, SamplingStrategy};

fn main() {
    let path_to_model = std::env::args().nth(1).unwrap();

    // load a context and model
    let ctx = WhisperContext::new_with_params(
        path_to_model,
        WhisperContextParameters::default()
    ).expect("failed to load model");

    // create a params object
    let params = FullParams::new(SamplingStrategy::Greedy { best_of: 1 });

    // assume we have a buffer of audio data
    // here we'll make a fake one, floating point samples, 32 bit, 16KHz, mono
    let audio_data = vec![0_f32; 16000 * 2];

    // now we can run the model
    let mut state = ctx.create_state().expect("failed to create state");
    state
        .full(params, &audio_data[..])
        .expect("failed to run model");

    // fetch the results
    let num_segments = state
        .full_n_segments()
        .expect("failed to get number of segments");
    for i in 0..num_segments {
        let segment = state
            .full_get_segment_text(i)
            .expect("failed to get segment");
        let start_timestamp = state
            .full_get_segment_t0(i)
            .expect("failed to get segment start timestamp");
        let end_timestamp = state
            .full_get_segment_t1(i)
            .expect("failed to get segment end timestamp");
        println!("[{} - {}]: {}", start_timestamp, end_timestamp, segment);
    }
}

See examples/basic_use.rs for more details.

Lower level bindings are exposed if needed, but the above should be enough for most use cases. See the docs: https://docs.rs/whisper-rs/ for more details.

Building

See BUILDING.md for instructions for building whisper-rs on Windows and OSX M1. Linux builds should just work out of the box.

Troubleshooting

  • Something other than Windows/macOS/Linux isn't working!
    • I don't have a way to test these platforms, so I can't really help you.
      • If you can get it working, please open a PR with any changes to make it work and build instructions in BUILDING.md!
  • I get a panic during binding generation build!
    • You can attempt to fix it yourself, or you can set the WHISPER_DONT_GENERATE_BINDINGS environment variable. This skips attempting to build the bindings whatsoever and copies the existing ones. They may be out of date, but it's better than nothing.
      • WHISPER_DONT_GENERATE_BINDINGS=1 cargo build
    • If you can fix the issue, please open a PR!

License

Unlicense

tl;dr: public domain

Dependencies

~0–2MB
~39K SLoC