diff --git a/src/whisper_state.rs b/src/whisper_state.rs index 4a9c254..22418ee 100644 --- a/src/whisper_state.rs +++ b/src/whisper_state.rs @@ -346,25 +346,43 @@ impl WhisperState { Ok(unsafe { whisper_rs_sys::whisper_full_get_segment_t1_from_state(self.ptr, segment) }) } + fn full_get_segment_raw(&self, segment: c_int) -> Result<&CStr, WhisperError> { + let ret = + unsafe { whisper_rs_sys::whisper_full_get_segment_text_from_state(self.ptr, segment) }; + if ret.is_null() { + return Err(WhisperError::NullPointer); + } + unsafe { Ok(CStr::from_ptr(ret)) } + } + + /// Get the raw bytes of the specified segment. + /// + /// # Arguments + /// * segment: Segment index. + /// + /// # Returns + /// `Ok(Vec)` on success, with the returned bytes or + /// `Err(WhisperError::NullPointer)` on failure (this is the only possible error) + /// + /// # C++ equivalent + /// `const char * whisper_full_get_segment_text(struct whisper_context * ctx, int i_segment)` + pub fn full_get_segment_bytes(&self, segment: c_int) -> Result, WhisperError> { + Ok(self.full_get_segment_raw(segment)?.to_bytes().to_vec()) + } + /// Get the text of the specified segment. /// /// # Arguments /// * segment: Segment index. /// /// # Returns - /// Ok(String) on success, Err(WhisperError) on failure. + /// `Ok(String)` on success, with the UTF-8 validated string, or + /// `Err(WhisperError)` on failure (either `NullPointer` or `InvalidUtf8`) /// /// # C++ equivalent /// `const char * whisper_full_get_segment_text(struct whisper_context * ctx, int i_segment)` pub fn full_get_segment_text(&self, segment: c_int) -> Result { - let ret = - unsafe { whisper_rs_sys::whisper_full_get_segment_text_from_state(self.ptr, segment) }; - if ret.is_null() { - return Err(WhisperError::NullPointer); - } - let c_str = unsafe { CStr::from_ptr(ret) }; - let r_str = c_str.to_str()?; - Ok(r_str.to_string()) + Ok(self.full_get_segment_raw(segment)?.to_str()?.to_string()) } /// Get the text of the specified segment. @@ -376,38 +394,16 @@ impl WhisperState { /// * segment: Segment index. /// /// # Returns - /// Ok(String) on success, Err(WhisperError) on failure. + /// `Ok(String)` on success, or + /// `Err(WhisperError::NullPointer)` on failure (this is the only possible error) /// /// # C++ equivalent /// `const char * whisper_full_get_segment_text(struct whisper_context * ctx, int i_segment)` pub fn full_get_segment_text_lossy(&self, segment: c_int) -> Result { - let ret = - unsafe { whisper_rs_sys::whisper_full_get_segment_text_from_state(self.ptr, segment) }; - if ret.is_null() { - return Err(WhisperError::NullPointer); - } - let c_str = unsafe { CStr::from_ptr(ret) }; - Ok(c_str.to_string_lossy().to_string()) - } - - /// Get the bytes of the specified segment. - /// - /// # Arguments - /// * segment: Segment index. - /// - /// # Returns - /// `Ok(Vec)` on success, `Err(WhisperError)` on failure. - /// - /// # C++ equivalent - /// `const char * whisper_full_get_segment_text(struct whisper_context * ctx, int i_segment)` - pub fn full_get_segment_bytes(&self, segment: c_int) -> Result, WhisperError> { - let ret = - unsafe { whisper_rs_sys::whisper_full_get_segment_text_from_state(self.ptr, segment) }; - if ret.is_null() { - return Err(WhisperError::NullPointer); - } - let c_str = unsafe { CStr::from_ptr(ret) }; - Ok(c_str.to_bytes().to_vec()) + Ok(self + .full_get_segment_raw(segment)? + .to_string_lossy() + .to_string()) } /// Get number of tokens in the specified segment.