pub(crate) const MAX_TRANSCRIPT_BYTES: usize = 1024 * 1024;
mod audio;
mod protocol;
mod queue;
mod stream;
#[cfg(test)]
mod tests;
mod transcribe;
mod transport;
pub use transcribe::{TranscribeOptions, Transcription};
use crate::{client::validate_timeout, Client, Error};
pub use audio::PcmFormat;
use bytes::Bytes;
use futures_core::Stream;
use std::time::Duration;
pub use stream::TranscriptStream;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum TranscriptionMode {
#[default]
Written,
Verbatim,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum TranscriptionOutputContract {
#[default]
RevisedHypotheses,
AppendFragments,
}
impl TranscriptionOutputContract {
pub(super) fn wire(self) -> i32 {
match self {
Self::RevisedHypotheses => {
rimelabs_api::StreamingOutputContract::RevisedHypotheses as i32
}
Self::AppendFragments => rimelabs_api::StreamingOutputContract::AppendFragments as i32,
}
}
}
#[derive(Clone, Debug)]
pub struct TranscriptionOptions {
language: String,
output_contract: TranscriptionOutputContract,
mode: TranscriptionMode,
context_terms: Vec<String>,
input_format: PcmFormat,
timeout: Option<Duration>,
}
impl TranscriptionOptions {
pub fn new(language: impl Into<String>) -> Self {
Self {
language: language.into(),
output_contract: TranscriptionOutputContract::default(),
mode: TranscriptionMode::Written,
context_terms: Vec::new(),
input_format: PcmFormat::default(),
timeout: None,
}
}
pub fn output_contract(mut self, contract: TranscriptionOutputContract) -> Self {
self.output_contract = contract;
self
}
pub fn mode(mut self, mode: TranscriptionMode) -> Self {
self.mode = mode;
self
}
pub fn context_terms(mut self, terms: Vec<String>) -> Self {
self.context_terms = terms;
self
}
pub fn input_format(mut self, format: PcmFormat) -> Self {
self.input_format = format;
self
}
pub fn timeout(mut self, timeout: Option<Duration>) -> Self {
self.timeout = timeout;
self
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum TranscriptionUpdate {
Partial {
text: String,
},
Delta {
text: String,
},
Final {
text: String,
language: String,
},
}
pub struct Stt<'a> {
pub(crate) client: &'a Client,
}
impl Stt<'_> {
pub fn stream<S>(
&self,
source: S,
options: TranscriptionOptions,
) -> Result<TranscriptStream, Error>
where
S: Stream<Item = Result<Bytes, Error>> + Send + 'static,
{
self.client.ensure_open()?;
crate::client::require_runtime()?;
options.input_format.validate()?;
validate_timeout(options.timeout)?;
stream::start(self.client.inner.clone(), source, options)
}
}
#[derive(Clone, Copy)]
pub(crate) struct Limits {
pub acceptance: Duration,
pub completion: Duration,
}
impl Default for Limits {
fn default() -> Self {
Self {
acceptance: Duration::from_secs(10),
completion: Duration::from_secs(120),
}
}
}