1use std::collections::BTreeMap;
2
3use bytes::Bytes;
4use serde::{Deserialize, Serialize};
5use serde_json::Value;
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
8pub enum Boundary {
9 Word,
10 Sentence,
11}
12
13impl Boundary {
14 pub(crate) fn metadata_flags(self) -> (&'static str, &'static str) {
15 match self {
16 Boundary::Word => ("true", "false"),
17 Boundary::Sentence => ("false", "true"),
18 }
19 }
20}
21
22#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
23pub struct VoiceTag {
24 #[serde(rename = "ContentCategories", default)]
25 pub content_categories: Vec<String>,
26 #[serde(rename = "VoicePersonalities", default)]
27 pub voice_personalities: Vec<String>,
28}
29
30impl Default for VoiceTag {
31 fn default() -> Self {
32 Self {
33 content_categories: Vec::new(),
34 voice_personalities: Vec::new(),
35 }
36 }
37}
38
39#[derive(Debug, Clone, Serialize, Deserialize)]
40pub struct Voice {
41 #[serde(rename = "Name")]
42 pub name: String,
43 #[serde(rename = "ShortName")]
44 pub short_name: String,
45 #[serde(rename = "Gender")]
46 pub gender: String,
47 #[serde(rename = "Locale")]
48 pub locale: String,
49 #[serde(rename = "SuggestedCodec", default)]
50 pub suggested_codec: Option<String>,
51 #[serde(rename = "FriendlyName", default)]
52 pub friendly_name: Option<String>,
53 #[serde(rename = "Status", default)]
54 pub status: Option<String>,
55 #[serde(rename = "VoiceTag", default)]
56 pub voice_tag: VoiceTag,
57 #[serde(flatten)]
58 pub extra: BTreeMap<String, Value>,
59}
60
61#[derive(Debug, Clone, PartialEq, Eq)]
62pub struct BoundaryEvent {
63 pub kind: Boundary,
64 pub offset_ticks: u64,
65 pub duration_ticks: u64,
66 pub text: String,
67}
68
69#[derive(Debug, Clone, PartialEq, Eq)]
70pub enum SynthesisEvent {
71 Audio(Bytes),
72 Boundary(BoundaryEvent),
73}
74
75#[derive(Debug, Clone, PartialEq, Eq)]
76pub struct SynthesisResult {
77 pub audio: Vec<u8>,
78 pub boundaries: Vec<BoundaryEvent>,
79}