use std::pin::Pin;
use async_trait::async_trait;
use futures::Stream;
use crate::error::AudioResult;
use crate::frame::AudioFrame;
#[derive(Debug, Clone, Default)]
pub struct SttOptions {
pub language: Option<String>,
pub diarize: bool,
pub word_timestamps: bool,
pub smart_format: bool,
pub model_hint: Option<String>,
}
#[derive(Debug, Clone, Default)]
pub struct Transcript {
pub text: String,
pub words: Vec<Word>,
pub speakers: Vec<Speaker>,
pub confidence: f32,
pub language_detected: Option<String>,
}
#[derive(Debug, Clone)]
pub struct Word {
pub text: String,
pub start_ms: u32,
pub end_ms: u32,
pub confidence: f32,
pub speaker: Option<u32>,
}
#[derive(Debug, Clone)]
pub struct Speaker {
pub id: u32,
pub label: Option<String>,
}
#[async_trait]
pub trait SttProvider: Send + Sync {
async fn transcribe(&self, audio: &AudioFrame, opts: &SttOptions) -> AudioResult<Transcript>;
async fn transcribe_stream(
&self,
audio: Pin<Box<dyn Stream<Item = AudioFrame> + Send>>,
opts: &SttOptions,
) -> AudioResult<Pin<Box<dyn Stream<Item = AudioResult<Transcript>> + Send>>>;
}