use std::pin::Pin;
use async_trait::async_trait;
use bytes::Bytes;
use futures::Stream;
use serde::{Deserialize, Serialize};
use crate::audio::AudioFormat;
use crate::capabilities::Capabilities;
use crate::error::{Result, SttError};
use crate::transcript::{Segment, SpeakerTag, Word};
#[derive(Debug, Clone, Default)]
pub struct StreamOptions {
pub format: Option<AudioFormat>,
pub language: Option<String>,
pub diarize: bool,
pub model: Option<String>,
pub extra: Option<serde_json::Value>,
}
#[async_trait]
pub trait StreamingSession: Send {
fn capabilities(&self) -> &'static Capabilities;
async fn push_audio(&mut self, chunk: Bytes) -> Result<()>;
async fn finish(&mut self) -> Result<()>;
async fn close(&mut self) -> Result<()>;
fn events(
&mut self,
) -> Pin<Box<dyn Stream<Item = std::result::Result<StreamEvent, SttError>> + Send + '_>>;
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum StreamEvent {
Partial {
text: String,
start_ms: u32,
end_ms: u32,
words: Vec<Word>,
},
Final { segment: Segment },
SpeakerTurn { speaker: SpeakerTag, at_ms: u32 },
UtteranceEnd { at_ms: u32 },
Metadata(serde_json::Value),
}