Skip to main content

rust_tts_wrapper/
factory.rs

1//! Engine factory: create engines by ID and list all registered engines.
2
3use crate::engine::TtsEngine;
4use crate::types::EngineDescriptor;
5
6// The unused-import warning is a false positive — TtsEngine is a trait used as a dyn bound.
7#[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/// Create an engine by its string identifier.
15///
16/// `credentials_json` is a JSON object with engine-specific credentials
17/// (e.g. `{"apiKey": "..."}`). Pass `""` for engines that don't need credentials.
18#[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/// Return the number of registered engines.
37#[must_use]
38pub fn engine_count() -> usize {
39    engine_list().len()
40}
41
42/// Return a list of all registered engine descriptors.
43#[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}