use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct WordTiming {
pub word: String,
pub start: f32,
pub end: f32,
#[serde(skip_serializing_if = "Option::is_none")]
pub prob: Option<f32>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TranscriptSegment {
pub id: u32,
pub start: f32,
pub end: f32,
pub text: String,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub words: Vec<WordTiming>,
#[serde(skip_serializing_if = "Option::is_none")]
pub speaker: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct WhisperTranscript {
#[serde(skip_serializing_if = "Option::is_none")]
pub language: Option<String>,
pub duration: f32,
pub segments: Vec<TranscriptSegment>,
}
impl WhisperTranscript {
pub fn plain_text(&self) -> String {
self.segments
.iter()
.map(|s| s.text.trim())
.filter(|t| !t.is_empty())
.collect::<Vec<_>>()
.join(" ")
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum WordAlignMode {
#[default]
Off,
Dtw,
Wav2Vec2,
}
impl WordAlignMode {
pub fn parse(s: &str) -> Option<Self> {
match s.to_ascii_lowercase().as_str() {
"off" | "none" => Some(Self::Off),
"dtw" => Some(Self::Dtw),
"wav2vec2" | "w2v" => Some(Self::Wav2Vec2),
_ => None,
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SpeakerTurn {
pub speaker_id: usize,
pub start: f32,
pub end: f32,
}