1use crate::engine::TtsEngine;
4use crate::types::EngineDescriptor;
5
6#[cfg(feature = "cloud")]
8use crate::cloud_engine;
9#[cfg(feature = "sherpaonnx")]
10use crate::sherpaonnx_engine::SherpaOnnxEngine;
11#[cfg(feature = "system")]
12use crate::system_engine::SystemEngine;
13
14#[must_use]
19#[allow(unused_variables)]
20pub fn create_engine(engine_id: &str, credentials_json: &str) -> Option<Box<dyn TtsEngine>> {
21 match engine_id {
22 #[cfg(feature = "system")]
23 "system" => Some(Box::new(SystemEngine::new())),
24
25 #[cfg(feature = "sherpaonnx")]
26 "sherpaonnx" => Some(Box::new(SherpaOnnxEngine::new(credentials_json))),
27
28 #[cfg(feature = "cloud")]
29 id => cloud_engine::create_cloud_engine(id, credentials_json),
30
31 #[cfg(not(feature = "cloud"))]
32 _ => None,
33 }
34}
35
36#[must_use]
38pub fn engine_count() -> usize {
39 engine_list().len()
40}
41
42#[must_use]
44#[allow(clippy::vec_init_then_push)]
45pub fn engine_list() -> Vec<EngineDescriptor> {
46 let mut engines = Vec::new();
47
48 #[cfg(feature = "system")]
49 engines.push(EngineDescriptor {
50 id: "system".into(),
51 name: "System".into(),
52 needs_credentials: false,
53 credential_keys_json: "[]".into(),
54 });
55
56 #[cfg(feature = "sherpaonnx")]
57 engines.push(EngineDescriptor {
58 id: "sherpaonnx".into(),
59 name: "Sherpa-ONNX".into(),
60 needs_credentials: false,
61 credential_keys_json: "[]".into(),
62 });
63
64 #[cfg(feature = "cloud")]
65 {
66 let cloud = [
67 ("openai", "OpenAI", true, r#"["apiKey"]"#),
68 ("elevenlabs", "ElevenLabs", true, r#"["apiKey"]"#),
69 ("azure", "Azure", true, r#"["subscriptionKey","region"]"#),
70 ("google", "Google Cloud", true, r#"["apiKey"]"#),
71 (
72 "polly",
73 "Amazon Polly",
74 true,
75 r#"["accessKeyId","secretAccessKey","region"]"#,
76 ),
77 ("cartesia", "Cartesia", true, r#"["apiKey"]"#),
78 ("deepgram", "Deepgram", true, r#"["apiKey"]"#),
79 ("playht", "PlayHT", true, r#"["apiKey","userId"]"#),
80 ("fishaudio", "Fish Audio", true, r#"["apiKey"]"#),
81 ("hume", "Hume AI", true, r#"["apiKey"]"#),
82 ("mistral", "Mistral", true, r#"["apiKey"]"#),
83 ("murf", "Murf", true, r#"["apiKey"]"#),
84 ("resemble", "Resemble AI", true, r#"["apiKey"]"#),
85 ("unrealspeech", "Unreal Speech", true, r#"["apiKey"]"#),
86 ("upliftai", "UpliftAI", true, r#"["apiKey"]"#),
87 (
88 "watson",
89 "IBM Watson",
90 true,
91 r#"["apiKey","region","instanceId"]"#,
92 ),
93 ("witai", "Wit.ai", true, r#"["token"]"#),
94 ("xai", "xAI", true, r#"["apiKey"]"#),
95 ("modelslab", "ModelsLab", true, r#"["apiKey"]"#),
96 ];
97 for (id, name, creds, keys) in &cloud {
98 engines.push(EngineDescriptor {
99 id: (*id).into(),
100 name: (*name).into(),
101 needs_credentials: *creds,
102 credential_keys_json: (*keys).into(),
103 });
104 }
105 }
106
107 engines
108}