Merge branch 'master' into whisper-cpp-1-7-x
# Conflicts: # sys/build.rs
This commit is contained in:
commit
cc92f1bcb1
3 changed files with 44 additions and 31 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
|
@ -2,3 +2,5 @@
|
|||
**/Cargo.lock
|
||||
/.idea
|
||||
/.vscode
|
||||
*.bin
|
||||
*.wav
|
||||
|
|
@ -1,54 +1,59 @@
|
|||
#![allow(clippy::uninlined_format_args)]
|
||||
/*
|
||||
wget https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-tiny.bin
|
||||
wget https://github.com/ggerganov/whisper.cpp/raw/master/samples/jfk.wav
|
||||
cargo run --example basic_use ggml-tiny.bin jfk.wav
|
||||
*/
|
||||
|
||||
use whisper_rs::{FullParams, SamplingStrategy, WhisperContext, WhisperContextParameters};
|
||||
|
||||
// note that running this example will not do anything, as it is just a
|
||||
// demonstration of how to use the library, and actual usage requires
|
||||
// more dependencies than the base library.
|
||||
pub fn usage() -> Result<(), &'static str> {
|
||||
fn main() {
|
||||
let model_path = std::env::args()
|
||||
.nth(1)
|
||||
.expect("Please specify path to model");
|
||||
let wav_path = std::env::args()
|
||||
.nth(2)
|
||||
.expect("Please specify path to wav file");
|
||||
let language = "en";
|
||||
|
||||
let samples: Vec<i16> = hound::WavReader::open(wav_path)
|
||||
.unwrap()
|
||||
.into_samples::<i16>()
|
||||
.map(|x| x.unwrap())
|
||||
.collect();
|
||||
|
||||
// load a context and model
|
||||
let ctx = WhisperContext::new_with_params("path/to/model", WhisperContextParameters::default())
|
||||
let ctx = WhisperContext::new_with_params(&model_path, WhisperContextParameters::default())
|
||||
.expect("failed to load model");
|
||||
// make a state
|
||||
|
||||
let mut state = ctx.create_state().expect("failed to create state");
|
||||
|
||||
// create a params object
|
||||
// note that currently the only implemented strategy is Greedy, BeamSearch is a WIP
|
||||
// n_past defaults to 0
|
||||
let mut params = FullParams::new(SamplingStrategy::Greedy { best_of: 1 });
|
||||
|
||||
// edit things as needed
|
||||
// here we set the number of threads to use to 1
|
||||
params.set_n_threads(1);
|
||||
// we also enable translation
|
||||
params.set_translate(true);
|
||||
// and set the language to translate to to english
|
||||
params.set_language(Some("en"));
|
||||
params.set_language(Some(&language));
|
||||
|
||||
// we also explicitly disable anything that prints to stdout
|
||||
params.set_print_special(false);
|
||||
params.set_print_progress(false);
|
||||
params.set_print_realtime(false);
|
||||
params.set_print_timestamps(false);
|
||||
|
||||
// assume we have a buffer of audio data
|
||||
// here we'll make a fake one, integer samples, 16 bit, 16KHz, stereo
|
||||
let audio_data = vec![0_i16; 16000 * 2];
|
||||
|
||||
// we must convert to 16KHz mono f32 samples for the model
|
||||
// some utilities exist for this
|
||||
// note that you don't need to use these, you can do it yourself or any other way you want
|
||||
// these are just provided for convenience
|
||||
// SIMD variants of these functions are also available, but only on nightly Rust: see the docs
|
||||
let mut inter_audio_data = Vec::with_capacity(audio_data.len());
|
||||
whisper_rs::convert_integer_to_float_audio(&audio_data, &mut inter_audio_data)
|
||||
let mut inter_samples = vec![Default::default(); samples.len()];
|
||||
|
||||
whisper_rs::convert_integer_to_float_audio(&samples, &mut inter_samples)
|
||||
.expect("failed to convert audio data");
|
||||
let audio_data = whisper_rs::convert_stereo_to_mono_audio(&inter_audio_data)
|
||||
let samples = whisper_rs::convert_stereo_to_mono_audio(&inter_samples)
|
||||
.expect("failed to convert audio data");
|
||||
|
||||
// now we can run the model
|
||||
// note the key we use here is the one we created above
|
||||
state
|
||||
.full(params, &audio_data[..])
|
||||
.full(params, &samples[..])
|
||||
.expect("failed to run model");
|
||||
|
||||
// fetch the results
|
||||
|
|
@ -67,10 +72,4 @@ pub fn usage() -> Result<(), &'static str> {
|
|||
.expect("failed to get segment end timestamp");
|
||||
println!("[{} - {}]: {}", start_timestamp, end_timestamp, segment);
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn main() {
|
||||
println!("running this example does nothing! see the source code for usage");
|
||||
}
|
||||
|
|
|
|||
12
sys/build.rs
12
sys/build.rs
|
|
@ -32,6 +32,7 @@ fn main() {
|
|||
|
||||
#[cfg(feature = "coreml")]
|
||||
println!("cargo:rustc-link-lib=static=whisper.coreml");
|
||||
|
||||
#[cfg(feature = "openblas")]
|
||||
{
|
||||
if let Ok(openblas_path) = env::var("OPENBLAS_PATH") {
|
||||
|
|
@ -194,6 +195,17 @@ fn main() {
|
|||
};
|
||||
let vulkan_lib_path = vulkan_path.join("Lib");
|
||||
println!("cargo:rustc-link-search={}", vulkan_lib_path.display());
|
||||
} else if cfg!(target_os = "macos") {
|
||||
println!("cargo:rerun-if-env-changed=VULKAN_SDK");
|
||||
println!("cargo:rustc-link-lib=vulkan");
|
||||
let vulkan_path = match env::var("VULKAN_SDK") {
|
||||
Ok(path) => PathBuf::from(path),
|
||||
Err(_) => panic!(
|
||||
"Please install Vulkan SDK and ensure that VULKAN_SDK env variable is set"
|
||||
),
|
||||
};
|
||||
let vulkan_lib_path = vulkan_path.join("lib");
|
||||
println!("cargo:rustc-link-search={}", vulkan_lib_path.display());
|
||||
} else {
|
||||
println!("cargo:rustc-link-lib=vulkan");
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue