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,
pub foxnose_embedder_path: *const c_char,
pub min_speakers: c_int,
pub max_speakers: c_int,
pub num_speakers: c_int,
pub _pad2: c_int,
}
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_session_speech_to_speech(
s: *mut CrispasrSession,
in_samples: *const f32,
n_in_samples: c_int,
out_text: *mut *mut c_char,
out_n_samples: *mut c_int,
) -> *mut f32;
pub fn crispasr_session_separate(
s: *mut CrispasrSession,
pcm_stereo: *const f32,
n_samples: c_int,
) -> c_int;
pub fn crispasr_session_separate_n_stems(s: *mut CrispasrSession) -> c_int;
pub fn crispasr_session_separate_stem_name(
s: *mut CrispasrSession,
stem_idx: c_int,
) -> *const c_char;
pub fn crispasr_session_separate_stem(
s: *mut CrispasrSession,
stem_idx: c_int,
out_n_samples: *mut c_int,
) -> *const f32;
pub fn crispasr_session_separate_sample_rate(s: *mut CrispasrSession) -> c_int;
pub fn crispasr_session_synthesize_raw(
s: *mut CrispasrSession,
text: *const c_char,
out_n_samples: *mut c_int,
) -> *mut f32;
pub fn crispasr_session_accept_marking_responsibility(
s: *mut CrispasrSession,
attestation: *const c_char,
) -> c_int;
pub fn crispasr_session_set_speaker_identity(
s: *mut CrispasrSession,
identity: *const c_char,
) -> c_int;
pub fn crispasr_session_input_sample_rate(s: *mut CrispasrSession) -> c_int;
pub fn crispasr_session_output_sample_rate(s: *mut CrispasrSession) -> c_int;
pub fn crispasr_session_input_channels(s: *mut CrispasrSession) -> c_int;
pub fn crispasr_session_output_channels(s: *mut CrispasrSession) -> c_int;
pub fn crispasr_pcm_free(pcm: *mut f32);
pub fn crispasr_watermark_embed(pcm: *mut f32, n_samples: c_int, alpha: c_float);
pub fn crispasr_watermark_detect(pcm: *const c_float, n_samples: c_int) -> c_float;
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_tts_reference_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_sensitivity(
s: *mut CrispasrSession,
preset: *const c_char,
) -> 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_min_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;
}
#[repr(C)]
pub struct CrispasrChatSession(c_void);
pub const CRISPASR_CHAT_ERR_ABORTED: i32 = 40;
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct CrispasrChatError {
pub code: i32,
pub message: [c_char; 256],
}
impl Default for CrispasrChatError {
fn default() -> Self {
Self {
code: 0,
message: [0; 256],
}
}
}
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct CrispasrChatMessage {
pub role: *const c_char,
pub content: *const c_char,
}
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct CrispasrChatOpenParams {
pub n_threads: c_int,
pub n_threads_batch: c_int,
pub n_ctx: c_int,
pub n_batch: c_int,
pub n_ubatch: c_int,
pub n_gpu_layers: c_int,
pub use_mmap: bool,
pub use_mlock: bool,
pub embeddings: bool,
pub chat_template: *const c_char,
}
impl Default for CrispasrChatOpenParams {
fn default() -> Self {
Self {
n_threads: 0,
n_threads_batch: 0,
n_ctx: 0,
n_batch: 0,
n_ubatch: 0,
n_gpu_layers: 0,
use_mmap: false,
use_mlock: false,
embeddings: false,
chat_template: std::ptr::null(),
}
}
}
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct CrispasrChatGenerateParams {
pub max_tokens: c_int,
pub temperature: c_float,
pub top_k: c_int,
pub top_p: c_float,
pub min_p: c_float,
pub repeat_penalty: c_float,
pub repeat_last_n: c_int,
pub seed: u32,
pub stop: *const *const c_char,
pub n_stop: usize,
pub prefill_only: bool,
}
impl Default for CrispasrChatGenerateParams {
fn default() -> Self {
Self {
max_tokens: 0,
temperature: 0.0,
top_k: 0,
top_p: 0.0,
min_p: 0.0,
repeat_penalty: 0.0,
repeat_last_n: 0,
seed: 0,
stop: std::ptr::null(),
n_stop: 0,
prefill_only: false,
}
}
}
pub type CrispasrChatOnToken =
Option<unsafe extern "C" fn(utf8_chunk: *const c_char, user: *mut c_void)>;
pub type CrispasrChatAbortCallback = Option<unsafe extern "C" fn(user: *mut c_void) -> bool>;
extern "C" {
pub fn crispasr_chat_open_params_default(out: *mut CrispasrChatOpenParams);
pub fn crispasr_chat_generate_params_default(out: *mut CrispasrChatGenerateParams);
pub fn crispasr_chat_open(
model_path: *const c_char,
params: *const CrispasrChatOpenParams,
err: *mut CrispasrChatError,
) -> *mut CrispasrChatSession;
pub fn crispasr_chat_close(s: *mut CrispasrChatSession);
pub fn crispasr_chat_reset(s: *mut CrispasrChatSession, err: *mut CrispasrChatError) -> i32;
pub fn crispasr_chat_generate(
s: *mut CrispasrChatSession,
messages: *const CrispasrChatMessage,
n_messages: usize,
params: *const CrispasrChatGenerateParams,
err: *mut CrispasrChatError,
) -> *mut c_char;
pub fn crispasr_chat_generate_stream(
s: *mut CrispasrChatSession,
messages: *const CrispasrChatMessage,
n_messages: usize,
params: *const CrispasrChatGenerateParams,
on_token: CrispasrChatOnToken,
user: *mut c_void,
err: *mut CrispasrChatError,
) -> i32;
pub fn crispasr_chat_set_abort_callback(
s: *mut CrispasrChatSession,
cb: CrispasrChatAbortCallback,
user: *mut c_void,
);
pub fn crispasr_chat_template_name(s: *mut CrispasrChatSession) -> *const c_char;
pub fn crispasr_chat_n_ctx(s: *mut CrispasrChatSession) -> i32;
pub fn crispasr_chat_count_tokens(
s: *mut CrispasrChatSession,
messages: *const CrispasrChatMessage,
n_messages: usize,
err: *mut CrispasrChatError,
) -> i32;
pub fn crispasr_chat_memory_estimate(
model_path: *const c_char,
params: *const CrispasrChatOpenParams,
err: *mut CrispasrChatError,
) -> usize;
pub fn crispasr_chat_string_free(s: *mut c_char);
pub fn crispasr_chat_ai_disclosure_text() -> *const c_char;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn diarize_abi_layout() {
use std::mem::{offset_of, size_of};
assert_eq!(size_of::<CrispasrDiarizeSegAbi>(), 24);
assert_eq!(size_of::<CrispasrDiarizeOptsAbi>(), 48);
assert_eq!(offset_of!(CrispasrDiarizeOptsAbi, slice_t0_cs), 8);
assert_eq!(offset_of!(CrispasrDiarizeOptsAbi, pyannote_model_path), 16);
assert_eq!(
offset_of!(CrispasrDiarizeOptsAbi, foxnose_embedder_path),
24
);
assert_eq!(offset_of!(CrispasrDiarizeOptsAbi, min_speakers), 32);
assert_eq!(offset_of!(CrispasrDiarizeOptsAbi, num_speakers), 40);
}
#[test]
fn chat_abi_layout() {
use std::mem::{offset_of, size_of};
assert_eq!(size_of::<CrispasrChatError>(), 260);
assert_eq!(offset_of!(CrispasrChatError, message), 4);
assert_eq!(size_of::<CrispasrChatMessage>(), 16);
assert_eq!(offset_of!(CrispasrChatMessage, content), 8);
assert_eq!(size_of::<CrispasrChatOpenParams>(), 40);
assert_eq!(offset_of!(CrispasrChatOpenParams, n_gpu_layers), 20);
assert_eq!(offset_of!(CrispasrChatOpenParams, use_mmap), 24);
assert_eq!(offset_of!(CrispasrChatOpenParams, use_mlock), 25);
assert_eq!(offset_of!(CrispasrChatOpenParams, embeddings), 26);
assert_eq!(offset_of!(CrispasrChatOpenParams, chat_template), 32);
assert_eq!(size_of::<CrispasrChatGenerateParams>(), 56);
assert_eq!(offset_of!(CrispasrChatGenerateParams, seed), 28);
assert_eq!(offset_of!(CrispasrChatGenerateParams, stop), 32);
assert_eq!(offset_of!(CrispasrChatGenerateParams, n_stop), 40);
assert_eq!(offset_of!(CrispasrChatGenerateParams, prefill_only), 48);
}
}