1use std::ffi::{c_char, c_float, c_int, c_void};
5
6#[repr(C)]
8pub struct WhisperContext(c_void);
9
10#[repr(C)]
12pub struct WhisperState(c_void);
13
14#[repr(C)]
16pub struct WhisperFullParams(c_void);
17
18#[repr(C)]
20pub struct WhisperContextParams(c_void);
21
22pub const CRISPASR_SAMPLING_GREEDY: c_int = 0;
24pub const CRISPASR_SAMPLING_BEAM_SEARCH: c_int = 1;
25
26pub type CrispasrProgressCallback =
29 Option<unsafe extern "C" fn(processed: c_int, total: c_int, user_data: *mut c_void)>;
30
31extern "C" {
32 pub fn whisper_init_from_file_with_params(
34 path: *const c_char,
35 params: *const WhisperContextParams,
36 ) -> *mut WhisperContext;
37
38 pub fn whisper_context_default_params_by_ref() -> *mut WhisperContextParams;
39 pub fn whisper_free(ctx: *mut WhisperContext);
40 pub fn whisper_free_params(params: *mut WhisperFullParams);
41 pub fn whisper_free_context_params(params: *mut WhisperContextParams);
42
43 pub fn whisper_full(
45 ctx: *mut WhisperContext,
46 params: *const WhisperFullParams,
47 samples: *const c_float,
48 n_samples: c_int,
49 ) -> c_int;
50
51 pub fn whisper_full_default_params_by_ref(strategy: c_int) -> *mut WhisperFullParams;
52
53 pub fn whisper_full_n_segments(ctx: *mut WhisperContext) -> c_int;
55
56 pub fn whisper_full_get_segment_text(
57 ctx: *mut WhisperContext,
58 i_segment: c_int,
59 ) -> *const c_char;
60
61 pub fn whisper_full_get_segment_t0(ctx: *mut WhisperContext, i_segment: c_int) -> i64;
62
63 pub fn whisper_full_get_segment_t1(ctx: *mut WhisperContext, i_segment: c_int) -> i64;
64
65 pub fn whisper_full_get_segment_no_speech_prob(
66 ctx: *mut WhisperContext,
67 i_segment: c_int,
68 ) -> c_float;
69
70 pub fn whisper_full_lang_id(ctx: *mut WhisperContext) -> c_int;
72 pub fn whisper_lang_str(id: c_int) -> *const c_char;
73 pub fn whisper_lang_id(lang: *const c_char) -> c_int;
74
75 pub fn crispasr_params_set_vad(p: *mut WhisperFullParams, v: c_int);
77 pub fn crispasr_params_set_vad_model_path(p: *mut WhisperFullParams, path: *const c_char);
78 pub fn crispasr_params_set_vad_threshold(p: *mut WhisperFullParams, threshold: c_float);
79 pub fn crispasr_params_set_vad_min_speech_ms(p: *mut WhisperFullParams, ms: c_int);
80 pub fn crispasr_params_set_vad_min_silence_ms(p: *mut WhisperFullParams, ms: c_int);
81 pub fn crispasr_params_set_tdrz(p: *mut WhisperFullParams, v: c_int);
82}
83
84#[repr(C)]
95pub struct CrispasrSession(c_void);
96
97#[repr(C)]
100pub struct CrispasrSessionResult(c_void);
101
102#[repr(C)]
106pub struct CrispasrStream(c_void);
107
108#[repr(C)]
111pub struct CrispasrMic(c_void);
112
113#[repr(C)]
116pub struct CrispasrAlignResult(c_void);
117
118#[repr(C)]
122#[derive(Clone, Copy, Debug)]
123pub struct CrispasrVadAbiOpts {
124 pub threshold: c_float,
125 pub min_speech_duration_ms: c_int,
126 pub min_silence_duration_ms: c_int,
127 pub speech_pad_ms: c_int,
128 pub chunk_seconds: c_int,
129 pub n_threads: c_int,
130}
131
132impl Default for CrispasrVadAbiOpts {
133 fn default() -> Self {
134 Self {
135 threshold: 0.5,
136 min_speech_duration_ms: 250,
137 min_silence_duration_ms: 100,
138 speech_pad_ms: 30,
139 chunk_seconds: 30,
140 n_threads: 4,
141 }
142 }
143}
144
145#[repr(C)]
148#[derive(Clone, Copy, Debug)]
149pub struct CrispasrDiarizeSegAbi {
150 pub t0_cs: i64,
151 pub t1_cs: i64,
152 pub speaker: c_int,
153 pub _pad: c_int,
154}
155
156#[repr(C)]
160#[derive(Clone, Copy, Debug)]
161pub struct CrispasrDiarizeOptsAbi {
162 pub method: c_int,
163 pub n_threads: c_int,
164 pub slice_t0_cs: i64,
165 pub pyannote_model_path: *const c_char,
166}
167
168extern "C" {
169 pub fn crispasr_session_open(
170 model_path: *const c_char,
171 n_threads: c_int,
172 ) -> *mut CrispasrSession;
173
174 pub fn crispasr_session_open_explicit(
175 model_path: *const c_char,
176 backend_name: *const c_char,
177 n_threads: c_int,
178 ) -> *mut CrispasrSession;
179
180 pub fn crispasr_session_backend(s: *mut CrispasrSession) -> *const c_char;
181
182 pub fn crispasr_session_n_vocab(s: *mut CrispasrSession) -> c_int;
188 pub fn crispasr_session_token_text(s: *mut CrispasrSession, id: c_int) -> *const c_char;
189
190 pub fn crispasr_session_detected_language(
195 s: *mut CrispasrSession,
196 out_buf: *mut c_char,
197 out_cap: c_int,
198 ) -> c_int;
199
200 pub fn crispasr_session_available_backends(out_csv: *mut c_char, out_cap: c_int) -> c_int;
204
205 pub fn crispasr_session_transcribe(
206 s: *mut CrispasrSession,
207 pcm: *const c_float,
208 n_samples: c_int,
209 ) -> *mut CrispasrSessionResult;
210
211 pub fn crispasr_session_transcribe_lang(
217 s: *mut CrispasrSession,
218 pcm: *const c_float,
219 n_samples: c_int,
220 language: *const c_char,
221 ) -> *mut CrispasrSessionResult;
222
223 pub fn crispasr_session_transcribe_chunked_lang(
234 s: *mut CrispasrSession,
235 pcm: *const c_float,
236 n_samples: c_int,
237 chunk_seconds: c_int,
238 overlap_seconds: c_int,
239 language: *const c_char,
240 ) -> *mut CrispasrSessionResult;
241
242 pub fn crispasr_session_transcribe_chunked(
243 s: *mut CrispasrSession,
244 pcm: *const c_float,
245 n_samples: c_int,
246 chunk_seconds: c_int,
247 overlap_seconds: c_int,
248 ) -> *mut CrispasrSessionResult;
249
250 pub fn crispasr_session_set_progress_callback(
256 s: *mut CrispasrSession,
257 cb: CrispasrProgressCallback,
258 user_data: *mut c_void,
259 );
260
261 pub fn crispasr_session_transcribe_vad(
271 s: *mut CrispasrSession,
272 pcm: *const c_float,
273 n_samples: c_int,
274 sample_rate: c_int,
275 vad_model_path: *const c_char,
276 opts: *const CrispasrVadAbiOpts,
277 ) -> *mut CrispasrSessionResult;
278
279 pub fn crispasr_session_transcribe_vad_lang(
282 s: *mut CrispasrSession,
283 pcm: *const c_float,
284 n_samples: c_int,
285 sample_rate: c_int,
286 vad_model_path: *const c_char,
287 opts: *const CrispasrVadAbiOpts,
288 language: *const c_char,
289 ) -> *mut CrispasrSessionResult;
290
291 pub fn crispasr_diarize_segments_abi(
295 left_pcm: *const c_float,
296 right_pcm: *const c_float,
297 n_samples: c_int,
298 is_stereo: c_int,
299 segs: *mut CrispasrDiarizeSegAbi,
300 n_segs: c_int,
301 opts: *const CrispasrDiarizeOptsAbi,
302 ) -> c_int;
303
304 pub fn crispasr_detect_language_pcm(
310 samples: *const c_float,
311 n_samples: c_int,
312 method: c_int,
313 model_path: *const c_char,
314 n_threads: c_int,
315 use_gpu: c_int,
316 gpu_device: c_int,
317 flash_attn: c_int,
318 out_lang_buf: *mut c_char,
319 out_lang_cap: c_int,
320 out_confidence: *mut c_float,
321 ) -> c_int;
322
323 pub fn crispasr_align_words_abi(
330 aligner_model: *const c_char,
331 transcript: *const c_char,
332 samples: *const c_float,
333 n_samples: c_int,
334 t_offset_cs: i64,
335 n_threads: c_int,
336 ) -> *mut CrispasrAlignResult;
337
338 pub fn crispasr_align_result_n_words(r: *mut CrispasrAlignResult) -> c_int;
339 pub fn crispasr_align_result_word_text(r: *mut CrispasrAlignResult, i: c_int) -> *const c_char;
340 pub fn crispasr_align_result_word_t0(r: *mut CrispasrAlignResult, i: c_int) -> i64;
341 pub fn crispasr_align_result_word_t1(r: *mut CrispasrAlignResult, i: c_int) -> i64;
342 pub fn crispasr_align_result_free(r: *mut CrispasrAlignResult);
343
344 pub fn crispasr_cache_ensure_file_abi(
348 filename: *const c_char,
349 url: *const c_char,
350 quiet: c_int,
351 cache_dir_override: *const c_char,
352 out_buf: *mut c_char,
353 out_cap: c_int,
354 ) -> c_int;
355
356 pub fn crispasr_cache_dir_abi(
358 cache_dir_override: *const c_char,
359 out_buf: *mut c_char,
360 out_cap: c_int,
361 ) -> c_int;
362
363 pub fn crispasr_registry_lookup_abi(
365 backend: *const c_char,
366 out_filename: *mut c_char,
367 filename_cap: c_int,
368 out_url: *mut c_char,
369 url_cap: c_int,
370 out_size: *mut c_char,
371 size_cap: c_int,
372 ) -> c_int;
373
374 pub fn crispasr_registry_list_backends_abi(out_csv: *mut c_char, out_cap: c_int) -> c_int;
376
377 pub fn crispasr_registry_default_bundle_info_abi(
380 backend: *const c_char,
381 out_backend: *mut c_char,
382 backend_cap: c_int,
383 out_license: *mut c_char,
384 license_cap: c_int,
385 out_requires_acceptance: *mut c_int,
386 ) -> c_int;
387
388 pub fn crispasr_registry_default_bundle_artifact_abi(
390 backend: *const c_char,
391 index: c_int,
392 out_kind: *mut c_int,
393 out_filename: *mut c_char,
394 filename_cap: c_int,
395 out_url: *mut c_char,
396 url_cap: c_int,
397 out_size: *mut c_char,
398 size_cap: c_int,
399 ) -> c_int;
400
401 pub fn crispasr_session_stream_open(
403 s: *mut CrispasrSession,
404 n_threads: c_int,
405 step_ms: c_int,
406 length_ms: c_int,
407 keep_ms: c_int,
408 language: *const c_char,
409 translate: c_int,
410 ) -> *mut CrispasrStream;
411 pub fn crispasr_stream_feed(
412 s: *mut CrispasrStream,
413 pcm: *const c_float,
414 n_samples: c_int,
415 ) -> c_int;
416 pub fn crispasr_stream_get_text(
417 s: *mut CrispasrStream,
418 out_text: *mut c_char,
419 out_cap: c_int,
420 out_t0_s: *mut f64,
421 out_t1_s: *mut f64,
422 out_counter: *mut i64,
423 ) -> c_int;
424 pub fn crispasr_stream_flush(s: *mut CrispasrStream) -> c_int;
425 pub fn crispasr_stream_close(s: *mut CrispasrStream);
426
427 pub fn crispasr_stream_set_live_decode(s: *mut CrispasrStream, enabled: c_int);
431
432 pub fn crispasr_mic_open(
434 sample_rate: c_int,
435 channels: c_int,
436 cb: extern "C" fn(pcm: *const c_float, n_samples: c_int, userdata: *mut c_void),
437 userdata: *mut c_void,
438 ) -> *mut CrispasrMic;
439 pub fn crispasr_mic_start(m: *mut CrispasrMic) -> c_int;
440 pub fn crispasr_mic_stop(m: *mut CrispasrMic) -> c_int;
441 pub fn crispasr_mic_close(m: *mut CrispasrMic);
442 pub fn crispasr_mic_default_device_name() -> *const c_char;
443 pub fn crispasr_registry_lookup_by_filename_abi(
444 filename: *const c_char,
445 out_filename: *mut c_char,
446 filename_cap: c_int,
447 out_url: *mut c_char,
448 url_cap: c_int,
449 out_size: *mut c_char,
450 size_cap: c_int,
451 ) -> c_int;
452
453 pub fn crispasr_session_result_n_segments(r: *mut CrispasrSessionResult) -> c_int;
454 pub fn crispasr_session_result_segment_text(
455 r: *mut CrispasrSessionResult,
456 i: c_int,
457 ) -> *const c_char;
458 pub fn crispasr_session_result_segment_t0(r: *mut CrispasrSessionResult, i: c_int) -> i64;
459 pub fn crispasr_session_result_segment_t1(r: *mut CrispasrSessionResult, i: c_int) -> i64;
460
461 pub fn crispasr_session_result_n_words(r: *mut CrispasrSessionResult, i_seg: c_int) -> c_int;
462 pub fn crispasr_session_result_word_text(
463 r: *mut CrispasrSessionResult,
464 i_seg: c_int,
465 i_word: c_int,
466 ) -> *const c_char;
467 pub fn crispasr_session_result_word_t0(
468 r: *mut CrispasrSessionResult,
469 i_seg: c_int,
470 i_word: c_int,
471 ) -> i64;
472 pub fn crispasr_session_result_word_t1(
473 r: *mut CrispasrSessionResult,
474 i_seg: c_int,
475 i_word: c_int,
476 ) -> i64;
477 pub fn crispasr_session_result_word_p(
478 r: *mut CrispasrSessionResult,
479 i_seg: c_int,
480 i_word: c_int,
481 ) -> f32;
482 pub fn crispasr_session_result_segment_no_speech_prob(
486 r: *mut CrispasrSessionResult,
487 i_seg: c_int,
488 ) -> f32;
489
490 pub fn crispasr_session_result_n_logit_frames(r: *mut CrispasrSessionResult) -> c_int;
494 pub fn crispasr_session_result_n_logit_vocab(r: *mut CrispasrSessionResult) -> c_int;
495 pub fn crispasr_session_result_logits(r: *mut CrispasrSessionResult) -> *const c_float;
496
497 pub fn crispasr_session_result_free(r: *mut CrispasrSessionResult);
498 pub fn crispasr_session_close(s: *mut CrispasrSession);
499
500 pub fn crispasr_session_set_codec_path(s: *mut CrispasrSession, path: *const c_char) -> c_int;
502 pub fn crispasr_session_set_voice(
503 s: *mut CrispasrSession,
504 path: *const c_char,
505 ref_text_or_null: *const c_char,
506 ) -> c_int;
507 pub fn crispasr_session_set_speaker_name(s: *mut CrispasrSession, name: *const c_char)
508 -> c_int;
509 pub fn crispasr_session_n_speakers(s: *mut CrispasrSession) -> c_int;
510 pub fn crispasr_session_get_speaker_name(s: *mut CrispasrSession, i: c_int) -> *const c_char;
511 pub fn crispasr_session_set_instruct(s: *mut CrispasrSession, instruct: *const c_char)
513 -> c_int;
514 pub fn crispasr_session_set_tts_phonemes(s: *mut CrispasrSession, phonemes: *const c_char) -> c_int;
517 pub fn crispasr_session_is_custom_voice(s: *mut CrispasrSession) -> c_int;
519 pub fn crispasr_session_is_voice_design(s: *mut CrispasrSession) -> c_int;
520 pub fn crispasr_session_synthesize(
521 s: *mut CrispasrSession,
522 text: *const c_char,
523 out_n_samples: *mut c_int,
524 ) -> *mut f32;
525 pub fn crispasr_pcm_free(pcm: *mut f32);
526 pub fn crispasr_session_kokoro_clear_phoneme_cache(s: *mut CrispasrSession) -> c_int;
529
530 pub fn crispasr_session_set_source_language(
532 s: *mut CrispasrSession,
533 lang: *const c_char,
534 ) -> c_int;
535 pub fn crispasr_session_set_target_language(
536 s: *mut CrispasrSession,
537 lang: *const c_char,
538 ) -> c_int;
539 pub fn crispasr_session_set_punctuation(s: *mut CrispasrSession, enable: c_int) -> c_int;
540 pub fn crispasr_session_set_punc_model(
541 s: *mut CrispasrSession,
542 punc_model: *const c_char,
543 ) -> c_int;
544 pub fn crispasr_session_set_hotwords(
545 s: *mut CrispasrSession,
546 hotwords: *const c_char,
547 boost: c_float,
548 ) -> c_int;
549 pub fn crispasr_session_set_g2p_dict(s: *mut CrispasrSession, source: *const c_char) -> c_int;
550 pub fn crispasr_session_set_speaker_id(s: *mut CrispasrSession, id: c_int) -> c_int;
551 pub fn crispasr_session_set_translate(s: *mut CrispasrSession, enable: c_int) -> c_int;
552 pub fn crispasr_session_translate_text(
568 s: *mut CrispasrSession,
569 text: *const c_char,
570 src_lang: *const c_char,
571 tgt_lang: *const c_char,
572 max_tokens: c_int,
573 ) -> *mut c_char;
574 pub fn crispasr_session_translate_text_free(text: *mut c_char);
580 pub fn crispasr_session_set_temperature(
581 s: *mut CrispasrSession,
582 temperature: c_float,
583 seed: u64,
584 ) -> c_int;
585 pub fn crispasr_session_set_tts_seed(s: *mut CrispasrSession, seed: u64) -> c_int;
586 pub fn crispasr_session_set_max_new_tokens(
587 s: *mut CrispasrSession,
588 max_new_tokens: c_int,
589 ) -> c_int;
590 pub fn crispasr_session_set_frequency_penalty(
591 s: *mut CrispasrSession,
592 penalty: c_float,
593 ) -> c_int;
594 pub fn crispasr_session_set_tts_steps(s: *mut CrispasrSession, steps: c_int) -> c_int;
595 pub fn crispasr_session_set_tts_num_candidates(s: *mut CrispasrSession, n: c_int) -> c_int;
596 pub fn crispasr_session_set_top_p(s: *mut CrispasrSession, top_p: c_float) -> c_int;
597 pub fn crispasr_session_set_top_k(s: *mut CrispasrSession, top_k: c_int) -> c_int;
598 pub fn crispasr_session_set_do_sample(s: *mut CrispasrSession, enable: c_int) -> c_int;
599 pub fn crispasr_session_set_min_p(s: *mut CrispasrSession, min_p: c_float) -> c_int;
600 pub fn crispasr_session_set_repetition_penalty(s: *mut CrispasrSession, r: c_float) -> c_int;
601 pub fn crispasr_session_set_cfg_weight(s: *mut CrispasrSession, cfg_weight: c_float) -> c_int;
602 pub fn crispasr_session_set_tts_noise_temp(
603 s: *mut CrispasrSession,
604 noise_temp: c_float,
605 ) -> c_int;
606 pub fn crispasr_session_set_exaggeration(
607 s: *mut CrispasrSession,
608 exaggeration: c_float,
609 ) -> c_int;
610 pub fn crispasr_session_set_max_speech_tokens(s: *mut CrispasrSession, n: c_int) -> c_int;
611 pub fn crispasr_session_set_length_scale(s: *mut CrispasrSession, scale: c_float) -> c_int;
612 pub fn crispasr_session_set_best_of(s: *mut CrispasrSession, n: c_int) -> c_int;
613 pub fn crispasr_session_set_beam_size(s: *mut CrispasrSession, n: c_int) -> c_int;
614 pub fn crispasr_session_set_return_logits(s: *mut CrispasrSession, enable: c_int) -> c_int;
615 pub fn crispasr_session_set_grammar_text(
616 s: *mut CrispasrSession,
617 gbnf_text: *const c_char,
618 root_rule: *const c_char,
619 penalty: c_float,
620 ) -> c_int;
621 pub fn crispasr_session_set_fallback_thresholds(
622 s: *mut CrispasrSession,
623 entropy_thold: c_float,
624 logprob_thold: c_float,
625 no_speech_thold: c_float,
626 temperature_inc: c_float,
627 ) -> c_int;
628 pub fn crispasr_session_set_alt_n(s: *mut CrispasrSession, n: c_int) -> c_int;
629 pub fn crispasr_session_set_whisper_decode_extras(
630 s: *mut CrispasrSession,
631 suppress_nst: c_int,
632 suppress_regex: *const c_char,
633 carry_initial_prompt: c_int,
634 ) -> c_int;
635 pub fn crispasr_session_set_ask(s: *mut CrispasrSession, prompt: *const c_char) -> c_int;
636 pub fn crispasr_session_detect_language(
637 s: *mut CrispasrSession,
638 pcm: *const c_float,
639 n_samples: c_int,
640 lid_model_path: *const c_char,
641 method: c_int,
642 out_lang: *mut c_char,
643 out_lang_cap: c_int,
644 out_prob: *mut c_float,
645 ) -> c_int;
646
647 pub fn crispasr_text_detect_language(
662 text: *const c_char,
663 model_path: *const c_char,
664 n_threads: c_int,
665 out_label_buf: *mut c_char,
666 out_label_cap: c_int,
667 out_confidence: *mut c_float,
668 ) -> c_int;
669
670 pub fn crispasr_detect_backend_from_gguf(
671 path: *const c_char,
672 out_name: *mut c_char,
673 out_cap: c_int,
674 ) -> c_int;
675
676 pub fn crispasr_punc_init(model_path: *const c_char) -> *mut c_void;
678 pub fn crispasr_punc_process(ctx: *mut c_void, text: *const c_char) -> *mut c_char;
679 pub fn crispasr_punc_free_text(text: *mut c_char);
680 pub fn crispasr_punc_free(ctx: *mut c_void);
681
682 pub fn crispasr_c_api_version() -> *const c_char;
683
684 pub fn crispasr_kokoro_lang_is_german_abi(lang: *const c_char) -> bool;
687 pub fn crispasr_kokoro_lang_has_native_voice_abi(lang: *const c_char) -> bool;
688 pub fn crispasr_kokoro_resolve_model_for_lang_abi(
689 model_path: *const c_char,
690 lang: *const c_char,
691 out_path: *mut c_char,
692 out_path_len: c_int,
693 ) -> c_int;
694 pub fn crispasr_kokoro_resolve_fallback_voice_abi(
695 model_path: *const c_char,
696 lang: *const c_char,
697 out_path: *mut c_char,
698 out_path_len: c_int,
699 out_picked: *mut c_char,
700 out_picked_len: c_int,
701 ) -> c_int;
702
703 pub fn crispasr_titanet_init(model_path: *const c_char, n_threads: i32) -> *mut c_void;
705 pub fn crispasr_titanet_free(ctx: *mut c_void);
706 pub fn crispasr_titanet_embed(
707 ctx: *mut c_void,
708 pcm_16k: *const c_float,
709 n_samples: i32,
710 out: *mut c_float,
711 ) -> i32;
712 pub fn crispasr_titanet_cosine_sim(a: *const c_float, b: *const c_float, dim: i32) -> c_float;
713
714 pub fn crispasr_speaker_db_load(dir_path: *const c_char) -> *mut c_void;
716 pub fn crispasr_speaker_db_free(db: *mut c_void);
717 pub fn crispasr_speaker_db_count(db: *const c_void) -> i32;
718 pub fn crispasr_speaker_db_match(
719 db: *const c_void,
720 embedding: *const c_float,
721 dim: i32,
722 threshold: c_float,
723 out_name: *mut c_char,
724 out_cap: i32,
725 ) -> c_float;
726 pub fn crispasr_speaker_db_enroll(
727 dir_path: *const c_char,
728 name: *const c_char,
729 embedding: *const c_float,
730 dim: i32,
731 ) -> i32;
732
733 pub fn crispasr_speaker_embedder_make_abi(
742 model_spec: *const c_char,
743 n_threads: i32,
744 cache_dir: *const c_char,
745 ) -> *mut c_void;
746
747 pub fn crispasr_speaker_embedder_free_abi(embedder: *mut c_void);
748
749 pub fn crispasr_speaker_embedder_dim_abi(embedder: *const c_void) -> i32;
752
753 pub fn crispasr_speaker_embedder_embed_abi(
756 embedder: *mut c_void,
757 pcm_16k: *const c_float,
758 n_samples: i32,
759 out: *mut c_float,
760 ) -> i32;
761
762 pub fn crispasr_speaker_embedder_name_abi(embedder: *const c_void) -> *const c_char;
763
764 pub fn crispasr_speaker_cluster_abi(
769 embeddings: *const c_float,
770 n: i32,
771 dim: i32,
772 merge_threshold: c_float,
773 max_speakers: i32,
774 labels_out: *mut i32,
775 ) -> i32;
776
777 pub fn crispasr_pyannote_cache_compute_abi(
781 full_audio: *const c_float,
782 n_samples: i32,
783 model_path: *const c_char,
784 n_threads: i32,
785 ) -> *mut c_void;
786
787 pub fn crispasr_pyannote_cache_free_abi(cache: *mut c_void);
788
789 pub fn crispasr_pyannote_cache_apply_abi(
793 cache: *const c_void,
794 slice_t0_cs: i64,
795 segs: *mut CrispasrDiarizeSegAbi,
796 n_segs: i32,
797 ) -> i32;
798
799 pub fn crispasr_params_set_language(p: *mut WhisperFullParams, lang: *const c_char);
801 pub fn crispasr_params_set_translate(p: *mut WhisperFullParams, v: c_int);
802 pub fn crispasr_params_set_detect_language(p: *mut WhisperFullParams, v: c_int);
803 pub fn crispasr_params_set_token_timestamps(p: *mut WhisperFullParams, v: c_int);
804 pub fn crispasr_params_set_n_threads(p: *mut WhisperFullParams, n: c_int);
805 pub fn crispasr_params_set_max_len(p: *mut WhisperFullParams, n: c_int);
806 pub fn crispasr_params_set_best_of(p: *mut WhisperFullParams, n: c_int);
807 pub fn crispasr_params_set_split_on_word(p: *mut WhisperFullParams, v: c_int);
808 pub fn crispasr_params_set_no_context(p: *mut WhisperFullParams, v: c_int);
809 pub fn crispasr_params_set_single_segment(p: *mut WhisperFullParams, v: c_int);
810 pub fn crispasr_params_set_print_realtime(p: *mut WhisperFullParams, v: c_int);
811 pub fn crispasr_params_set_print_progress(p: *mut WhisperFullParams, v: c_int);
812 pub fn crispasr_params_set_print_timestamps(p: *mut WhisperFullParams, v: c_int);
813 pub fn crispasr_params_set_print_special(p: *mut WhisperFullParams, v: c_int);
814 pub fn crispasr_params_set_suppress_blank(p: *mut WhisperFullParams, v: c_int);
815 pub fn crispasr_params_set_temperature(p: *mut WhisperFullParams, t: c_float);
816 pub fn crispasr_params_set_max_tokens(p: *mut WhisperFullParams, n: c_int);
817 pub fn crispasr_params_set_initial_prompt(p: *mut WhisperFullParams, prompt: *const c_char);
818 pub fn crispasr_params_set_alt_n(p: *mut WhisperFullParams, n: c_int);
819
820 pub fn crispasr_token_t0(ctx: *mut WhisperContext, i_seg: c_int, i_tok: c_int) -> i64;
822 pub fn crispasr_token_t1(ctx: *mut WhisperContext, i_seg: c_int, i_tok: c_int) -> i64;
823 pub fn crispasr_token_p(ctx: *mut WhisperContext, i_seg: c_int, i_tok: c_int) -> c_float;
824 pub fn crispasr_token_n_alts(ctx: *mut WhisperContext, i_seg: c_int, i_tok: c_int) -> c_int;
825 pub fn crispasr_token_alt_id(
826 ctx: *mut WhisperContext,
827 i_seg: c_int,
828 i_tok: c_int,
829 i_alt: c_int,
830 ) -> i32;
831 pub fn crispasr_token_alt_p(
832 ctx: *mut WhisperContext,
833 i_seg: c_int,
834 i_tok: c_int,
835 i_alt: c_int,
836 ) -> c_float;
837 pub fn crispasr_token_alt_text(
838 ctx: *mut WhisperContext,
839 i_seg: c_int,
840 i_tok: c_int,
841 i_alt: c_int,
842 out: *mut c_char,
843 out_cap: c_int,
844 ) -> c_int;
845
846 pub fn crispasr_detect_language(
848 ctx: *mut WhisperContext,
849 pcm: *const c_float,
850 n_samples: c_int,
851 n_threads: c_int,
852 out_code: *mut c_char,
853 out_cap: c_int,
854 ) -> c_float;
855
856 pub fn crispasr_vad_segments(
858 vad_model_path: *const c_char,
859 pcm: *const c_float,
860 n_samples: c_int,
861 sample_rate: c_int,
862 threshold: c_float,
863 min_speech_ms: c_int,
864 min_silence_ms: c_int,
865 n_threads: c_int,
866 use_gpu: c_int,
867 out_spans: *mut *mut c_float,
868 ) -> c_int;
869 pub fn crispasr_vad_slices(
870 vad_model_path: *const c_char,
871 pcm: *const c_float,
872 n_samples: c_int,
873 sample_rate: c_int,
874 threshold: c_float,
875 min_speech_ms: c_int,
876 min_silence_ms: c_int,
877 speech_pad_ms: c_int,
878 max_chunk_duration_s: c_float,
879 n_threads: c_int,
880 out_spans: *mut *mut c_float,
881 ) -> c_int;
882 pub fn crispasr_vad_free(spans: *mut c_float);
883
884 pub fn crispasr_lcs_dedup_prefix_count(
886 prev_tail_tokens: *const i32,
887 n_prev: c_int,
888 curr_tokens: *const i32,
889 n_curr: c_int,
890 min_lcs_length: c_int,
891 ) -> c_int;
892
893 pub fn crispasr_stream_open(
895 ctx: *mut WhisperContext,
896 n_threads: c_int,
897 step_ms: c_int,
898 length_ms: c_int,
899 keep_ms: c_int,
900 language: *const c_char,
901 translate: c_int,
902 ) -> *mut CrispasrStream;
903
904 pub fn crispasr_parakeet_init(
906 model_path: *const c_char,
907 n_threads: c_int,
908 use_flash: c_int,
909 ) -> *mut c_void;
910 pub fn crispasr_parakeet_free(ctx: *mut c_void);
911 pub fn crispasr_parakeet_transcribe(
912 ctx: *mut c_void,
913 pcm: *const c_float,
914 n_samples: c_int,
915 language: *const c_char,
916 ) -> *mut c_void;
917 pub fn crispasr_parakeet_result_text(r: *mut c_void) -> *const c_char;
918 pub fn crispasr_parakeet_result_n_words(r: *mut c_void) -> c_int;
919 pub fn crispasr_parakeet_result_word_text(r: *mut c_void, i: c_int) -> *const c_char;
920 pub fn crispasr_parakeet_result_word_t0(r: *mut c_void, i: c_int) -> i64;
921 pub fn crispasr_parakeet_result_word_t1(r: *mut c_void, i: c_int) -> i64;
922 pub fn crispasr_parakeet_result_n_tokens(r: *mut c_void) -> c_int;
923 pub fn crispasr_parakeet_result_token_text(r: *mut c_void, i: c_int) -> *const c_char;
924 pub fn crispasr_parakeet_result_token_t0(r: *mut c_void, i: c_int) -> i64;
925 pub fn crispasr_parakeet_result_token_t1(r: *mut c_void, i: c_int) -> i64;
926 pub fn crispasr_parakeet_result_token_p(r: *mut c_void, i: c_int) -> c_float;
927 pub fn crispasr_parakeet_result_free(r: *mut c_void);
928
929 pub fn crispasr_enhance_audio_rnnoise(
931 in_pcm: *const c_float,
932 n_samples: i32,
933 out_pcm: *mut c_float,
934 out_cap: i32,
935 ) -> c_int;
936
937 pub fn crispasr_session_open_with_params(
939 model_path: *const c_char,
940 backend_name: *const c_char,
941 params: *const c_void,
942 ) -> *mut CrispasrSession;
943
944 pub fn crispasr_session_result_word_n_alts(
946 r: *mut CrispasrSessionResult,
947 i_seg: c_int,
948 i_word: c_int,
949 ) -> c_int;
950 pub fn crispasr_session_result_word_alt_text(
951 r: *mut CrispasrSessionResult,
952 i_seg: c_int,
953 i_word: c_int,
954 i_alt: c_int,
955 ) -> *const c_char;
956 pub fn crispasr_session_result_word_alt_p(
957 r: *mut CrispasrSessionResult,
958 i_seg: c_int,
959 i_word: c_int,
960 i_alt: c_int,
961 ) -> c_float;
962}