use std::ffi::{c_char, c_float, c_int, c_void};
#[repr(C)]
pub struct WhisperContext(c_void);
#[repr(C)]
pub struct WhisperState(c_void);
#[repr(C)]
pub struct WhisperFullParams(c_void);
#[repr(C)]
pub struct WhisperContextParams(c_void);
pub const CRISPASR_SAMPLING_GREEDY: c_int = 0;
pub const CRISPASR_SAMPLING_BEAM_SEARCH: c_int = 1;
pub type CrispasrProgressCallback =
Option<unsafe extern "C" fn(processed: c_int, total: c_int, user_data: *mut c_void)>;
extern "C" {
pub fn whisper_init_from_file_with_params(
path: *const c_char,
params: *const WhisperContextParams,
) -> *mut WhisperContext;
pub fn whisper_context_default_params_by_ref() -> *mut WhisperContextParams;
pub fn whisper_free(ctx: *mut WhisperContext);
pub fn whisper_free_params(params: *mut WhisperFullParams);
pub fn whisper_free_context_params(params: *mut WhisperContextParams);
pub fn whisper_full(
ctx: *mut WhisperContext,
params: *const WhisperFullParams,
samples: *const c_float,
n_samples: c_int,
) -> c_int;
pub fn whisper_full_default_params_by_ref(strategy: c_int) -> *mut WhisperFullParams;
pub fn whisper_full_n_segments(ctx: *mut WhisperContext) -> c_int;
pub fn whisper_full_get_segment_text(
ctx: *mut WhisperContext,
i_segment: c_int,
) -> *const c_char;
pub fn whisper_full_get_segment_t0(ctx: *mut WhisperContext, i_segment: c_int) -> i64;
pub fn whisper_full_get_segment_t1(ctx: *mut WhisperContext, i_segment: c_int) -> i64;
pub fn whisper_full_get_segment_no_speech_prob(
ctx: *mut WhisperContext,
i_segment: c_int,
) -> c_float;
pub fn whisper_full_lang_id(ctx: *mut WhisperContext) -> c_int;
pub fn whisper_lang_str(id: c_int) -> *const c_char;
pub fn whisper_lang_id(lang: *const c_char) -> c_int;
pub fn crispasr_params_set_vad(p: *mut WhisperFullParams, v: c_int);
pub fn crispasr_params_set_vad_model_path(p: *mut WhisperFullParams, path: *const c_char);
pub fn crispasr_params_set_vad_threshold(p: *mut WhisperFullParams, threshold: c_float);
pub fn crispasr_params_set_vad_min_speech_ms(p: *mut WhisperFullParams, ms: c_int);
pub fn crispasr_params_set_vad_min_silence_ms(p: *mut WhisperFullParams, ms: c_int);
pub fn crispasr_params_set_tdrz(p: *mut WhisperFullParams, v: c_int);
}
#[repr(C)]
pub struct CrispasrSession(c_void);
#[repr(C)]
pub struct CrispasrSessionResult(c_void);
#[repr(C)]
pub struct CrispasrStream(c_void);
#[repr(C)]
pub struct CrispasrMic(c_void);
#[repr(C)]
pub struct CrispasrAlignResult(c_void);
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct CrispasrVadAbiOpts {
pub threshold: c_float,
pub min_speech_duration_ms: c_int,
pub min_silence_duration_ms: c_int,
pub speech_pad_ms: c_int,
pub chunk_seconds: c_int,
pub n_threads: c_int,
}
impl Default for CrispasrVadAbiOpts {
fn default() -> Self {
Self {
threshold: 0.5,
min_speech_duration_ms: 250,
min_silence_duration_ms: 100,
speech_pad_ms: 30,
chunk_seconds: 30,
n_threads: 4,
}
}
}
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct CrispasrDiarizeSegAbi {
pub t0_cs: i64,
pub t1_cs: i64,
pub speaker: c_int,
pub _pad: c_int,
}
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct CrispasrDiarizeOptsAbi {
pub method: c_int,
pub n_threads: c_int,
pub slice_t0_cs: i64,
pub pyannote_model_path: *const c_char,
}
extern "C" {
pub fn crispasr_session_open(
model_path: *const c_char,
n_threads: c_int,
) -> *mut CrispasrSession;
pub fn crispasr_session_open_explicit(
model_path: *const c_char,
backend_name: *const c_char,
n_threads: c_int,
) -> *mut CrispasrSession;
pub fn crispasr_session_backend(s: *mut CrispasrSession) -> *const c_char;
pub fn crispasr_session_n_vocab(s: *mut CrispasrSession) -> c_int;
pub fn crispasr_session_token_text(s: *mut CrispasrSession, id: c_int) -> *const c_char;
pub fn crispasr_session_detected_language(
s: *mut CrispasrSession,
out_buf: *mut c_char,
out_cap: c_int,
) -> c_int;
pub fn crispasr_session_available_backends(out_csv: *mut c_char, out_cap: c_int) -> c_int;
pub fn crispasr_session_transcribe(
s: *mut CrispasrSession,
pcm: *const c_float,
n_samples: c_int,
) -> *mut CrispasrSessionResult;
pub fn crispasr_session_transcribe_lang(
s: *mut CrispasrSession,
pcm: *const c_float,
n_samples: c_int,
language: *const c_char,
) -> *mut CrispasrSessionResult;
pub fn crispasr_session_transcribe_chunked_lang(
s: *mut CrispasrSession,
pcm: *const c_float,
n_samples: c_int,
chunk_seconds: c_int,
overlap_seconds: c_int,
language: *const c_char,
) -> *mut CrispasrSessionResult;
pub fn crispasr_session_transcribe_chunked(
s: *mut CrispasrSession,
pcm: *const c_float,
n_samples: c_int,
chunk_seconds: c_int,
overlap_seconds: c_int,
) -> *mut CrispasrSessionResult;
pub fn crispasr_session_set_progress_callback(
s: *mut CrispasrSession,
cb: CrispasrProgressCallback,
user_data: *mut c_void,
);
pub fn crispasr_session_transcribe_vad(
s: *mut CrispasrSession,
pcm: *const c_float,
n_samples: c_int,
sample_rate: c_int,
vad_model_path: *const c_char,
opts: *const CrispasrVadAbiOpts,
) -> *mut CrispasrSessionResult;
pub fn crispasr_session_transcribe_vad_lang(
s: *mut CrispasrSession,
pcm: *const c_float,
n_samples: c_int,
sample_rate: c_int,
vad_model_path: *const c_char,
opts: *const CrispasrVadAbiOpts,
language: *const c_char,
) -> *mut CrispasrSessionResult;
pub fn crispasr_diarize_segments_abi(
left_pcm: *const c_float,
right_pcm: *const c_float,
n_samples: c_int,
is_stereo: c_int,
segs: *mut CrispasrDiarizeSegAbi,
n_segs: c_int,
opts: *const CrispasrDiarizeOptsAbi,
) -> c_int;
pub fn crispasr_detect_language_pcm(
samples: *const c_float,
n_samples: c_int,
method: c_int,
model_path: *const c_char,
n_threads: c_int,
use_gpu: c_int,
gpu_device: c_int,
flash_attn: c_int,
out_lang_buf: *mut c_char,
out_lang_cap: c_int,
out_confidence: *mut c_float,
) -> c_int;
pub fn crispasr_align_words_abi(
aligner_model: *const c_char,
transcript: *const c_char,
samples: *const c_float,
n_samples: c_int,
t_offset_cs: i64,
n_threads: c_int,
) -> *mut CrispasrAlignResult;
pub fn crispasr_align_result_n_words(r: *mut CrispasrAlignResult) -> c_int;
pub fn crispasr_align_result_word_text(r: *mut CrispasrAlignResult, i: c_int) -> *const c_char;
pub fn crispasr_align_result_word_t0(r: *mut CrispasrAlignResult, i: c_int) -> i64;
pub fn crispasr_align_result_word_t1(r: *mut CrispasrAlignResult, i: c_int) -> i64;
pub fn crispasr_align_result_free(r: *mut CrispasrAlignResult);
pub fn crispasr_cache_ensure_file_abi(
filename: *const c_char,
url: *const c_char,
quiet: c_int,
cache_dir_override: *const c_char,
out_buf: *mut c_char,
out_cap: c_int,
) -> c_int;
pub fn crispasr_cache_dir_abi(
cache_dir_override: *const c_char,
out_buf: *mut c_char,
out_cap: c_int,
) -> c_int;
pub fn crispasr_registry_lookup_abi(
backend: *const c_char,
out_filename: *mut c_char,
filename_cap: c_int,
out_url: *mut c_char,
url_cap: c_int,
out_size: *mut c_char,
size_cap: c_int,
) -> c_int;
pub fn crispasr_registry_list_backends_abi(out_csv: *mut c_char, out_cap: c_int) -> c_int;
pub fn crispasr_registry_default_bundle_info_abi(
backend: *const c_char,
out_backend: *mut c_char,
backend_cap: c_int,
out_license: *mut c_char,
license_cap: c_int,
out_requires_acceptance: *mut c_int,
) -> c_int;
pub fn crispasr_registry_default_bundle_artifact_abi(
backend: *const c_char,
index: c_int,
out_kind: *mut c_int,
out_filename: *mut c_char,
filename_cap: c_int,
out_url: *mut c_char,
url_cap: c_int,
out_size: *mut c_char,
size_cap: c_int,
) -> c_int;
pub fn crispasr_session_stream_open(
s: *mut CrispasrSession,
n_threads: c_int,
step_ms: c_int,
length_ms: c_int,
keep_ms: c_int,
language: *const c_char,
translate: c_int,
) -> *mut CrispasrStream;
pub fn crispasr_stream_feed(
s: *mut CrispasrStream,
pcm: *const c_float,
n_samples: c_int,
) -> c_int;
pub fn crispasr_stream_get_text(
s: *mut CrispasrStream,
out_text: *mut c_char,
out_cap: c_int,
out_t0_s: *mut f64,
out_t1_s: *mut f64,
out_counter: *mut i64,
) -> c_int;
pub fn crispasr_stream_flush(s: *mut CrispasrStream) -> c_int;
pub fn crispasr_stream_close(s: *mut CrispasrStream);
pub fn crispasr_stream_set_live_decode(s: *mut CrispasrStream, enabled: c_int);
pub fn crispasr_mic_open(
sample_rate: c_int,
channels: c_int,
cb: extern "C" fn(pcm: *const c_float, n_samples: c_int, userdata: *mut c_void),
userdata: *mut c_void,
) -> *mut CrispasrMic;
pub fn crispasr_mic_start(m: *mut CrispasrMic) -> c_int;
pub fn crispasr_mic_stop(m: *mut CrispasrMic) -> c_int;
pub fn crispasr_mic_close(m: *mut CrispasrMic);
pub fn crispasr_mic_default_device_name() -> *const c_char;
pub fn crispasr_registry_lookup_by_filename_abi(
filename: *const c_char,
out_filename: *mut c_char,
filename_cap: c_int,
out_url: *mut c_char,
url_cap: c_int,
out_size: *mut c_char,
size_cap: c_int,
) -> c_int;
pub fn crispasr_session_result_n_segments(r: *mut CrispasrSessionResult) -> c_int;
pub fn crispasr_session_result_segment_text(
r: *mut CrispasrSessionResult,
i: c_int,
) -> *const c_char;
pub fn crispasr_session_result_segment_t0(r: *mut CrispasrSessionResult, i: c_int) -> i64;
pub fn crispasr_session_result_segment_t1(r: *mut CrispasrSessionResult, i: c_int) -> i64;
pub fn crispasr_session_result_n_words(r: *mut CrispasrSessionResult, i_seg: c_int) -> c_int;
pub fn crispasr_session_result_word_text(
r: *mut CrispasrSessionResult,
i_seg: c_int,
i_word: c_int,
) -> *const c_char;
pub fn crispasr_session_result_word_t0(
r: *mut CrispasrSessionResult,
i_seg: c_int,
i_word: c_int,
) -> i64;
pub fn crispasr_session_result_word_t1(
r: *mut CrispasrSessionResult,
i_seg: c_int,
i_word: c_int,
) -> i64;
pub fn crispasr_session_result_word_p(
r: *mut CrispasrSessionResult,
i_seg: c_int,
i_word: c_int,
) -> f32;
pub fn crispasr_session_result_segment_no_speech_prob(
r: *mut CrispasrSessionResult,
i_seg: c_int,
) -> f32;
pub fn crispasr_session_result_n_logit_frames(r: *mut CrispasrSessionResult) -> c_int;
pub fn crispasr_session_result_n_logit_vocab(r: *mut CrispasrSessionResult) -> c_int;
pub fn crispasr_session_result_logits(r: *mut CrispasrSessionResult) -> *const c_float;
pub fn crispasr_session_result_free(r: *mut CrispasrSessionResult);
pub fn crispasr_session_close(s: *mut CrispasrSession);
pub fn crispasr_session_set_codec_path(s: *mut CrispasrSession, path: *const c_char) -> c_int;
pub fn crispasr_session_set_voice(
s: *mut CrispasrSession,
path: *const c_char,
ref_text_or_null: *const c_char,
) -> c_int;
pub fn crispasr_session_set_speaker_name(s: *mut CrispasrSession, name: *const c_char)
-> c_int;
pub fn crispasr_session_n_speakers(s: *mut CrispasrSession) -> c_int;
pub fn crispasr_session_get_speaker_name(s: *mut CrispasrSession, i: c_int) -> *const c_char;
pub fn crispasr_session_set_instruct(s: *mut CrispasrSession, instruct: *const c_char)
-> c_int;
pub fn crispasr_session_set_tts_phonemes(s: *mut CrispasrSession, phonemes: *const c_char) -> c_int;
pub fn crispasr_session_is_custom_voice(s: *mut CrispasrSession) -> c_int;
pub fn crispasr_session_is_voice_design(s: *mut CrispasrSession) -> c_int;
pub fn crispasr_session_synthesize(
s: *mut CrispasrSession,
text: *const c_char,
out_n_samples: *mut c_int,
) -> *mut f32;
pub fn crispasr_pcm_free(pcm: *mut f32);
pub fn crispasr_session_kokoro_clear_phoneme_cache(s: *mut CrispasrSession) -> c_int;
pub fn crispasr_session_set_source_language(
s: *mut CrispasrSession,
lang: *const c_char,
) -> c_int;
pub fn crispasr_session_set_target_language(
s: *mut CrispasrSession,
lang: *const c_char,
) -> c_int;
pub fn crispasr_session_set_punctuation(s: *mut CrispasrSession, enable: c_int) -> c_int;
pub fn crispasr_session_set_punc_model(
s: *mut CrispasrSession,
punc_model: *const c_char,
) -> c_int;
pub fn crispasr_session_set_hotwords(
s: *mut CrispasrSession,
hotwords: *const c_char,
boost: c_float,
) -> c_int;
pub fn crispasr_session_set_g2p_dict(s: *mut CrispasrSession, source: *const c_char) -> c_int;
pub fn crispasr_session_set_speaker_id(s: *mut CrispasrSession, id: c_int) -> c_int;
pub fn crispasr_session_set_translate(s: *mut CrispasrSession, enable: c_int) -> c_int;
pub fn crispasr_session_translate_text(
s: *mut CrispasrSession,
text: *const c_char,
src_lang: *const c_char,
tgt_lang: *const c_char,
max_tokens: c_int,
) -> *mut c_char;
pub fn crispasr_session_translate_text_free(text: *mut c_char);
pub fn crispasr_session_set_temperature(
s: *mut CrispasrSession,
temperature: c_float,
seed: u64,
) -> c_int;
pub fn crispasr_session_set_tts_seed(s: *mut CrispasrSession, seed: u64) -> c_int;
pub fn crispasr_session_set_max_new_tokens(
s: *mut CrispasrSession,
max_new_tokens: c_int,
) -> c_int;
pub fn crispasr_session_set_frequency_penalty(
s: *mut CrispasrSession,
penalty: c_float,
) -> c_int;
pub fn crispasr_session_set_tts_steps(s: *mut CrispasrSession, steps: c_int) -> c_int;
pub fn crispasr_session_set_tts_num_candidates(s: *mut CrispasrSession, n: c_int) -> c_int;
pub fn crispasr_session_set_top_p(s: *mut CrispasrSession, top_p: c_float) -> c_int;
pub fn crispasr_session_set_top_k(s: *mut CrispasrSession, top_k: c_int) -> c_int;
pub fn crispasr_session_set_do_sample(s: *mut CrispasrSession, enable: c_int) -> c_int;
pub fn crispasr_session_set_min_p(s: *mut CrispasrSession, min_p: c_float) -> c_int;
pub fn crispasr_session_set_repetition_penalty(s: *mut CrispasrSession, r: c_float) -> c_int;
pub fn crispasr_session_set_cfg_weight(s: *mut CrispasrSession, cfg_weight: c_float) -> c_int;
pub fn crispasr_session_set_tts_noise_temp(
s: *mut CrispasrSession,
noise_temp: c_float,
) -> c_int;
pub fn crispasr_session_set_exaggeration(
s: *mut CrispasrSession,
exaggeration: c_float,
) -> c_int;
pub fn crispasr_session_set_max_speech_tokens(s: *mut CrispasrSession, n: c_int) -> c_int;
pub fn crispasr_session_set_length_scale(s: *mut CrispasrSession, scale: c_float) -> c_int;
pub fn crispasr_session_set_best_of(s: *mut CrispasrSession, n: c_int) -> c_int;
pub fn crispasr_session_set_beam_size(s: *mut CrispasrSession, n: c_int) -> c_int;
pub fn crispasr_session_set_return_logits(s: *mut CrispasrSession, enable: c_int) -> c_int;
pub fn crispasr_session_set_grammar_text(
s: *mut CrispasrSession,
gbnf_text: *const c_char,
root_rule: *const c_char,
penalty: c_float,
) -> c_int;
pub fn crispasr_session_set_fallback_thresholds(
s: *mut CrispasrSession,
entropy_thold: c_float,
logprob_thold: c_float,
no_speech_thold: c_float,
temperature_inc: c_float,
) -> c_int;
pub fn crispasr_session_set_alt_n(s: *mut CrispasrSession, n: c_int) -> c_int;
pub fn crispasr_session_set_whisper_decode_extras(
s: *mut CrispasrSession,
suppress_nst: c_int,
suppress_regex: *const c_char,
carry_initial_prompt: c_int,
) -> c_int;
pub fn crispasr_session_set_ask(s: *mut CrispasrSession, prompt: *const c_char) -> c_int;
pub fn crispasr_session_detect_language(
s: *mut CrispasrSession,
pcm: *const c_float,
n_samples: c_int,
lid_model_path: *const c_char,
method: c_int,
out_lang: *mut c_char,
out_lang_cap: c_int,
out_prob: *mut c_float,
) -> c_int;
pub fn crispasr_text_detect_language(
text: *const c_char,
model_path: *const c_char,
n_threads: c_int,
out_label_buf: *mut c_char,
out_label_cap: c_int,
out_confidence: *mut c_float,
) -> c_int;
pub fn crispasr_detect_backend_from_gguf(
path: *const c_char,
out_name: *mut c_char,
out_cap: c_int,
) -> c_int;
pub fn crispasr_punc_init(model_path: *const c_char) -> *mut c_void;
pub fn crispasr_punc_process(ctx: *mut c_void, text: *const c_char) -> *mut c_char;
pub fn crispasr_punc_free_text(text: *mut c_char);
pub fn crispasr_punc_free(ctx: *mut c_void);
pub fn crispasr_c_api_version() -> *const c_char;
pub fn crispasr_kokoro_lang_is_german_abi(lang: *const c_char) -> bool;
pub fn crispasr_kokoro_lang_has_native_voice_abi(lang: *const c_char) -> bool;
pub fn crispasr_kokoro_resolve_model_for_lang_abi(
model_path: *const c_char,
lang: *const c_char,
out_path: *mut c_char,
out_path_len: c_int,
) -> c_int;
pub fn crispasr_kokoro_resolve_fallback_voice_abi(
model_path: *const c_char,
lang: *const c_char,
out_path: *mut c_char,
out_path_len: c_int,
out_picked: *mut c_char,
out_picked_len: c_int,
) -> c_int;
pub fn crispasr_titanet_init(model_path: *const c_char, n_threads: i32) -> *mut c_void;
pub fn crispasr_titanet_free(ctx: *mut c_void);
pub fn crispasr_titanet_embed(
ctx: *mut c_void,
pcm_16k: *const c_float,
n_samples: i32,
out: *mut c_float,
) -> i32;
pub fn crispasr_titanet_cosine_sim(a: *const c_float, b: *const c_float, dim: i32) -> c_float;
pub fn crispasr_speaker_db_load(dir_path: *const c_char) -> *mut c_void;
pub fn crispasr_speaker_db_free(db: *mut c_void);
pub fn crispasr_speaker_db_count(db: *const c_void) -> i32;
pub fn crispasr_speaker_db_match(
db: *const c_void,
embedding: *const c_float,
dim: i32,
threshold: c_float,
out_name: *mut c_char,
out_cap: i32,
) -> c_float;
pub fn crispasr_speaker_db_enroll(
dir_path: *const c_char,
name: *const c_char,
embedding: *const c_float,
dim: i32,
) -> i32;
pub fn crispasr_speaker_embedder_make_abi(
model_spec: *const c_char,
n_threads: i32,
cache_dir: *const c_char,
) -> *mut c_void;
pub fn crispasr_speaker_embedder_free_abi(embedder: *mut c_void);
pub fn crispasr_speaker_embedder_dim_abi(embedder: *const c_void) -> i32;
pub fn crispasr_speaker_embedder_embed_abi(
embedder: *mut c_void,
pcm_16k: *const c_float,
n_samples: i32,
out: *mut c_float,
) -> i32;
pub fn crispasr_speaker_embedder_name_abi(embedder: *const c_void) -> *const c_char;
pub fn crispasr_speaker_cluster_abi(
embeddings: *const c_float,
n: i32,
dim: i32,
merge_threshold: c_float,
max_speakers: i32,
labels_out: *mut i32,
) -> i32;
pub fn crispasr_pyannote_cache_compute_abi(
full_audio: *const c_float,
n_samples: i32,
model_path: *const c_char,
n_threads: i32,
) -> *mut c_void;
pub fn crispasr_pyannote_cache_free_abi(cache: *mut c_void);
pub fn crispasr_pyannote_cache_apply_abi(
cache: *const c_void,
slice_t0_cs: i64,
segs: *mut CrispasrDiarizeSegAbi,
n_segs: i32,
) -> i32;
pub fn crispasr_params_set_language(p: *mut WhisperFullParams, lang: *const c_char);
pub fn crispasr_params_set_translate(p: *mut WhisperFullParams, v: c_int);
pub fn crispasr_params_set_detect_language(p: *mut WhisperFullParams, v: c_int);
pub fn crispasr_params_set_token_timestamps(p: *mut WhisperFullParams, v: c_int);
pub fn crispasr_params_set_n_threads(p: *mut WhisperFullParams, n: c_int);
pub fn crispasr_params_set_max_len(p: *mut WhisperFullParams, n: c_int);
pub fn crispasr_params_set_best_of(p: *mut WhisperFullParams, n: c_int);
pub fn crispasr_params_set_split_on_word(p: *mut WhisperFullParams, v: c_int);
pub fn crispasr_params_set_no_context(p: *mut WhisperFullParams, v: c_int);
pub fn crispasr_params_set_single_segment(p: *mut WhisperFullParams, v: c_int);
pub fn crispasr_params_set_print_realtime(p: *mut WhisperFullParams, v: c_int);
pub fn crispasr_params_set_print_progress(p: *mut WhisperFullParams, v: c_int);
pub fn crispasr_params_set_print_timestamps(p: *mut WhisperFullParams, v: c_int);
pub fn crispasr_params_set_print_special(p: *mut WhisperFullParams, v: c_int);
pub fn crispasr_params_set_suppress_blank(p: *mut WhisperFullParams, v: c_int);
pub fn crispasr_params_set_temperature(p: *mut WhisperFullParams, t: c_float);
pub fn crispasr_params_set_max_tokens(p: *mut WhisperFullParams, n: c_int);
pub fn crispasr_params_set_initial_prompt(p: *mut WhisperFullParams, prompt: *const c_char);
pub fn crispasr_params_set_alt_n(p: *mut WhisperFullParams, n: c_int);
pub fn crispasr_token_t0(ctx: *mut WhisperContext, i_seg: c_int, i_tok: c_int) -> i64;
pub fn crispasr_token_t1(ctx: *mut WhisperContext, i_seg: c_int, i_tok: c_int) -> i64;
pub fn crispasr_token_p(ctx: *mut WhisperContext, i_seg: c_int, i_tok: c_int) -> c_float;
pub fn crispasr_token_n_alts(ctx: *mut WhisperContext, i_seg: c_int, i_tok: c_int) -> c_int;
pub fn crispasr_token_alt_id(
ctx: *mut WhisperContext,
i_seg: c_int,
i_tok: c_int,
i_alt: c_int,
) -> i32;
pub fn crispasr_token_alt_p(
ctx: *mut WhisperContext,
i_seg: c_int,
i_tok: c_int,
i_alt: c_int,
) -> c_float;
pub fn crispasr_token_alt_text(
ctx: *mut WhisperContext,
i_seg: c_int,
i_tok: c_int,
i_alt: c_int,
out: *mut c_char,
out_cap: c_int,
) -> c_int;
pub fn crispasr_detect_language(
ctx: *mut WhisperContext,
pcm: *const c_float,
n_samples: c_int,
n_threads: c_int,
out_code: *mut c_char,
out_cap: c_int,
) -> c_float;
pub fn crispasr_vad_segments(
vad_model_path: *const c_char,
pcm: *const c_float,
n_samples: c_int,
sample_rate: c_int,
threshold: c_float,
min_speech_ms: c_int,
min_silence_ms: c_int,
n_threads: c_int,
use_gpu: c_int,
out_spans: *mut *mut c_float,
) -> c_int;
pub fn crispasr_vad_slices(
vad_model_path: *const c_char,
pcm: *const c_float,
n_samples: c_int,
sample_rate: c_int,
threshold: c_float,
min_speech_ms: c_int,
min_silence_ms: c_int,
speech_pad_ms: c_int,
max_chunk_duration_s: c_float,
n_threads: c_int,
out_spans: *mut *mut c_float,
) -> c_int;
pub fn crispasr_vad_free(spans: *mut c_float);
pub fn crispasr_lcs_dedup_prefix_count(
prev_tail_tokens: *const i32,
n_prev: c_int,
curr_tokens: *const i32,
n_curr: c_int,
min_lcs_length: c_int,
) -> c_int;
pub fn crispasr_stream_open(
ctx: *mut WhisperContext,
n_threads: c_int,
step_ms: c_int,
length_ms: c_int,
keep_ms: c_int,
language: *const c_char,
translate: c_int,
) -> *mut CrispasrStream;
pub fn crispasr_parakeet_init(
model_path: *const c_char,
n_threads: c_int,
use_flash: c_int,
) -> *mut c_void;
pub fn crispasr_parakeet_free(ctx: *mut c_void);
pub fn crispasr_parakeet_transcribe(
ctx: *mut c_void,
pcm: *const c_float,
n_samples: c_int,
language: *const c_char,
) -> *mut c_void;
pub fn crispasr_parakeet_result_text(r: *mut c_void) -> *const c_char;
pub fn crispasr_parakeet_result_n_words(r: *mut c_void) -> c_int;
pub fn crispasr_parakeet_result_word_text(r: *mut c_void, i: c_int) -> *const c_char;
pub fn crispasr_parakeet_result_word_t0(r: *mut c_void, i: c_int) -> i64;
pub fn crispasr_parakeet_result_word_t1(r: *mut c_void, i: c_int) -> i64;
pub fn crispasr_parakeet_result_n_tokens(r: *mut c_void) -> c_int;
pub fn crispasr_parakeet_result_token_text(r: *mut c_void, i: c_int) -> *const c_char;
pub fn crispasr_parakeet_result_token_t0(r: *mut c_void, i: c_int) -> i64;
pub fn crispasr_parakeet_result_token_t1(r: *mut c_void, i: c_int) -> i64;
pub fn crispasr_parakeet_result_token_p(r: *mut c_void, i: c_int) -> c_float;
pub fn crispasr_parakeet_result_free(r: *mut c_void);
pub fn crispasr_enhance_audio_rnnoise(
in_pcm: *const c_float,
n_samples: i32,
out_pcm: *mut c_float,
out_cap: i32,
) -> c_int;
pub fn crispasr_session_open_with_params(
model_path: *const c_char,
backend_name: *const c_char,
params: *const c_void,
) -> *mut CrispasrSession;
pub fn crispasr_session_result_word_n_alts(
r: *mut CrispasrSessionResult,
i_seg: c_int,
i_word: c_int,
) -> c_int;
pub fn crispasr_session_result_word_alt_text(
r: *mut CrispasrSessionResult,
i_seg: c_int,
i_word: c_int,
i_alt: c_int,
) -> *const c_char;
pub fn crispasr_session_result_word_alt_p(
r: *mut CrispasrSessionResult,
i_seg: c_int,
i_word: c_int,
i_alt: c_int,
) -> c_float;
}