llama_core/metadata/
piper.rs

1//! Define metadata for the piper model.
2
3use super::BaseMetadata;
4use serde::{Deserialize, Serialize};
5
6/// Builder for creating a ggml metadata
7#[derive(Debug)]
8pub struct PiperMetadataBuilder {
9    metadata: PiperMetadata,
10}
11impl PiperMetadataBuilder {
12    pub fn new<S: Into<String>>(model_name: S, model_alias: S) -> Self {
13        let metadata = PiperMetadata {
14            model_name: model_name.into(),
15            model_alias: model_alias.into(),
16            ..Default::default()
17        };
18
19        Self { metadata }
20    }
21
22    pub fn enable_debug(mut self, enable: bool) -> Self {
23        self.metadata.debug_log = enable;
24        self
25    }
26
27    pub fn with_speed(mut self, speed: f64) -> Self {
28        self.metadata.speed = speed;
29        self
30    }
31
32    pub fn with_speaker_id(mut self, speaker_id: u32) -> Self {
33        self.metadata.speaker_id = speaker_id;
34        self
35    }
36
37    pub fn with_noise_scale(mut self, noise_scale: f64) -> Self {
38        self.metadata.noise_scale = noise_scale;
39        self
40    }
41
42    pub fn with_length_scale(mut self, length_scale: f64) -> Self {
43        self.metadata.length_scale = length_scale;
44        self
45    }
46
47    pub fn with_noise_w(mut self, noise_w: f64) -> Self {
48        self.metadata.noise_w = noise_w;
49        self
50    }
51
52    pub fn with_sentence_silence(mut self, sentence_silence: f64) -> Self {
53        self.metadata.sentence_silence = sentence_silence;
54        self
55    }
56
57    pub fn with_phoneme_silence(mut self, phoneme_silence: f64) -> Self {
58        self.metadata.phoneme_silence = Some(phoneme_silence);
59        self
60    }
61
62    pub fn enable_json_input(mut self, flag: bool) -> Self {
63        self.metadata.json_input = Some(flag);
64        self
65    }
66
67    pub fn build(self) -> PiperMetadata {
68        self.metadata
69    }
70}
71
72/// Metadata for chat and embeddings models
73#[derive(Debug, Clone, Deserialize, Serialize)]
74pub struct PiperMetadata {
75    // this field not defined for the beckend plugin
76    #[serde(skip_serializing)]
77    pub model_name: String,
78    // this field not defined for the beckend plugin
79    #[serde(skip_serializing)]
80    pub model_alias: String,
81
82    // * Plugin parameters (used by this plugin):
83    #[serde(rename = "enable-debug-log")]
84    pub debug_log: bool,
85
86    /// The speed of the generated audio. Select a value from `0.25` to `4.0`. Defaults to `1.0`.
87    pub speed: f64,
88    /// Id of speaker. Defaults to `0`.
89    pub speaker_id: u32,
90    /// Amount of noise to add during audio generation. Defaults to `0.667`.
91    pub noise_scale: f64,
92    /// Speed of speaking (1 = normal, < 1 is faster, > 1 is slower). Defaults to `1.0`.
93    length_scale: f64,
94    /// Variation in phoneme lengths. Defaults to `0.8`.
95    pub noise_w: f64,
96    /// Seconds of silence after each sentence. Defaults to `0.2`.
97    pub sentence_silence: f64,
98    /// Seconds of extra silence to insert after a single phoneme.
99    #[serde(skip_serializing_if = "Option::is_none")]
100    phoneme_silence: Option<f64>,
101    /// stdin input is lines of JSON instead of plain text.
102    /// The input format should be:
103    /// ```json
104    /// {
105    ///    "text": "some text",     (required)
106    ///    "speaker_id": 0,         (optional)
107    ///    "speaker": "some name",  (optional)
108    /// }
109    #[serde(skip_serializing_if = "Option::is_none")]
110    pub json_input: Option<bool>,
111}
112impl Default for PiperMetadata {
113    fn default() -> Self {
114        Self {
115            model_name: String::new(),
116            model_alias: String::new(),
117            debug_log: false,
118            speed: 1.0,
119            speaker_id: 0,
120            noise_scale: 0.667,
121            length_scale: 1.0,
122            noise_w: 0.8,
123            sentence_silence: 0.2,
124            phoneme_silence: None,
125            json_input: None,
126        }
127    }
128}
129impl BaseMetadata for PiperMetadata {
130    fn model_name(&self) -> &str {
131        &self.model_name
132    }
133
134    fn model_alias(&self) -> &str {
135        &self.model_alias
136    }
137}