1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
//! Streaming inference module for real-time ASR.
//!
//! This module provides `StreamSession` for continuous audio streaming
//! with chunked transcription support for ASR models.
//!
//! # Architecture
//!
//! ```text
//! Audio Chunks → [AudioBuffer] → [TemplateExecutor] → [Transcript Aggregation] → Text
//! ↑ ↓
//! feed() partial results
//! ↑ ↓
//! flush() ─────────────────────────────────────────────→ final text
//! ```
//!
//! # Unified Backend
//!
//! StreamSession uses `TemplateExecutor` internally, which automatically
//! selects the appropriate backend based on `model_metadata.json`:
//!
//! - `execution_template.type: "CandleModel"` → Candle (Whisper)
//! - `execution_template.type: "SimpleMode"` → ONNX (Wav2Vec2)
//!
//! # Example
//!
//! ```no_run
//! # fn _example() -> Result<(), Box<dyn std::error::Error>> {
//! use xybrid_core::streaming::{StreamSession, StreamConfig};
//!
//! # let audio_chunk_1: Vec<f32> = vec![];
//! # let audio_chunk_2: Vec<f32> = vec![];
//! // Create session - backend auto-detected from model_metadata.json
//! let config = StreamConfig::default();
//! let mut session = StreamSession::new("/path/to/whisper-model", config)?;
//!
//! // Feed audio chunks as they arrive
//! session.feed(&audio_chunk_1)?;
//! session.feed(&audio_chunk_2)?;
//!
//! // Get partial result anytime
//! if let Some(partial) = session.partial_result() {
//! println!("Partial: {}", partial.text);
//! }
//!
//! // Flush to get final transcription
//! let final_result = session.flush()?;
//! println!("Final: {}", final_result);
//! # Ok(())
//! # }
//! ```
pub use ;
pub use ;
pub use ;