#[cfg(feature = "tts")]
mod cartesia;
#[cfg(feature = "tts")]
mod elevenlabs;
#[cfg(feature = "tts")]
mod gemini;
#[cfg(feature = "tts")]
mod openai;
#[cfg(feature = "qwen3-tts")]
pub mod qwen3_tts_native;
#[cfg(feature = "tts")]
pub use cartesia::CartesiaTts;
#[cfg(feature = "tts")]
pub use elevenlabs::ElevenLabsTts;
#[cfg(feature = "tts")]
pub use gemini::GeminiTts;
#[cfg(feature = "tts")]
pub use gemini::SpeakerConfig;
#[cfg(feature = "tts")]
pub use openai::OpenAiTts;
#[cfg(feature = "qwen3-tts")]
pub use qwen3_tts_native::{Qwen3TtsNativeProvider, Qwen3TtsVariant};
#[derive(Debug, Clone)]
pub struct CloudTtsConfig {
pub api_key: String,
pub base_url: Option<String>,
}
impl CloudTtsConfig {
pub fn new(api_key: impl Into<String>) -> Self {
Self { api_key: api_key.into(), base_url: None }
}
pub fn with_base_url(mut self, url: impl Into<String>) -> Self {
self.base_url = Some(url.into());
self
}
}
#[allow(dead_code)] pub(crate) fn check_response(
provider: &str,
status: reqwest::StatusCode,
) -> Result<(), crate::error::AudioError> {
if status.is_success() {
Ok(())
} else {
Err(crate::error::AudioError::Tts {
provider: provider.to_string(),
message: format!("HTTP {status}"),
})
}
}