use std::collections::BTreeMap;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum TaskKind {
Vad,
Asr,
Diar,
SourceSeparation,
Tts,
}
impl TaskKind {
pub fn as_str(self) -> &'static str {
match self {
TaskKind::Vad => "vad",
TaskKind::Asr => "asr",
TaskKind::Diar => "diar",
TaskKind::SourceSeparation => "sep",
TaskKind::Tts => "tts",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum RunMode {
Offline,
Streaming,
}
impl RunMode {
pub fn as_str(self) -> &'static str {
match self {
RunMode::Offline => "offline",
RunMode::Streaming => "streaming",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Backend {
Cpu,
Cuda,
Hip,
Vulkan,
Metal,
Best,
}
impl Backend {
pub fn as_str(self) -> &'static str {
match self {
Backend::Cpu => "cpu",
Backend::Cuda => "cuda",
Backend::Hip => "hip",
Backend::Vulkan => "vulkan",
Backend::Metal => "metal",
Backend::Best => "best",
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Device {
pub backend: String,
pub index: i32,
pub name: String,
#[serde(rename = "type")]
pub kind: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct LoaderInfo {
pub family: String,
pub capabilities: Capabilities,
pub instructions_policy: String,
pub api_endpoints: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Capabilities {
pub supported_tasks: Vec<SupportedTask>,
pub languages: Vec<String>,
pub supports_speaker_reference: bool,
pub supports_style_condition: bool,
pub supports_timestamps: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SupportedTask {
pub task: String,
pub modes: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ModelMetadata {
pub family: String,
pub variant: String,
pub description: String,
pub config_candidates: Vec<String>,
pub weight_candidates: Vec<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub struct TimeSpan {
pub start_sample: i64,
pub end_sample: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SpeechSegment {
pub span: TimeSpan,
pub confidence: f32,
pub text: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SpeakerTurn {
pub speaker_id: String,
pub span: TimeSpan,
pub confidence: f32,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TextOutput {
pub text: String,
pub language: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct AudioBufferInfo {
pub sample_rate: i32,
pub channels: i32,
pub sample_count: usize,
#[serde(default)]
pub samples: Option<Vec<f32>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct NamedAudioOutput {
pub id: String,
pub audio: AudioBufferInfo,
pub meta: BTreeMap<String, String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TaskResult {
pub speech_segments: Vec<SpeechSegment>,
pub speaker_turns: Vec<SpeakerTurn>,
pub text_output: Option<TextOutput>,
pub audio_output: Option<AudioBufferInfo>,
pub named_audio_outputs: Vec<NamedAudioOutput>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct StreamEvent {
pub voice_activity: Vec<VoiceActivityEvent>,
pub partial_text: Option<TextOutput>,
pub audio_output: Option<AudioBufferInfo>,
pub is_final: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VoiceActivityEvent {
pub kind: String,
pub sample: i64,
pub probability: f32,
pub segment: Option<SpeechSegment>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct StreamingPolicy {
pub input: String,
pub output: String,
pub preferred_audio_chunk_samples: usize,
pub preferred_audio_chunk_seconds: f64,
}