use std::{ffi::CString, ptr::NonNull};
use vosk_sys::*;
pub struct Model(pub(crate) NonNull<VoskModel>);
impl Model {
#[must_use]
pub fn new(model_path: impl Into<String>) -> Option<Self> {
let model_path_c = CString::new(model_path.into()).ok()?;
let model_ptr = unsafe { vosk_model_new(model_path_c.as_ptr()) };
Some(Self(NonNull::new(model_ptr)?))
}
#[must_use]
pub fn find_word(&mut self, word: &str) -> Option<u32> {
let word_c = CString::new(word).ok()?;
let symbol = unsafe { vosk_model_find_word(self.0.as_ptr(), word_c.as_ptr()) };
if symbol == -1 {
None
} else {
Some(u32::try_from(symbol).unwrap())
}
}
}
impl Drop for Model {
fn drop(&mut self) {
unsafe { vosk_model_free(self.0.as_ptr()) }
}
}
unsafe impl Send for Model {}
unsafe impl Sync for Model {}
pub struct SpeakerModel(pub(crate) NonNull<VoskSpkModel>);
impl SpeakerModel {
#[must_use]
pub fn new(model_path: impl Into<String>) -> Option<Self> {
let model_path_c = CString::new(model_path.into()).ok()?;
let model_ptr = unsafe { vosk_spk_model_new(model_path_c.as_ptr()) };
Some(Self(NonNull::new(model_ptr)?))
}
}
impl Drop for SpeakerModel {
fn drop(&mut self) {
unsafe { vosk_spk_model_free(self.0.as_ptr()) }
}
}
unsafe impl Send for SpeakerModel {}
unsafe impl Sync for SpeakerModel {}