use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use crate::error::Result;
use crate::shared::{Headers, ProviderMetadata, ProviderOptions, Warning};
#[async_trait]
pub trait SpeechModel: Send + Sync + std::fmt::Debug {
fn provider(&self) -> &str;
fn model_id(&self) -> &str;
fn specification_version(&self) -> &'static str {
"v4"
}
async fn do_generate(&self, options: SpeechOptions) -> Result<SpeechResult>;
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct SpeechOptions {
pub text: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub voice: Option<String>,
#[serde(
default,
rename = "outputFormat",
skip_serializing_if = "Option::is_none"
)]
pub output_format: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub instructions: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub speed: Option<f32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub language: Option<String>,
#[serde(
default,
rename = "providerOptions",
skip_serializing_if = "Option::is_none"
)]
pub provider_options: Option<ProviderOptions>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub headers: Option<Headers>,
}
#[derive(Debug, Clone)]
pub struct SpeechResult {
pub audio: Vec<u8>,
pub warnings: Vec<Warning>,
pub request: Option<crate::shared::RequestInfo>,
pub response: SpeechResponseInfo,
pub provider_metadata: Option<ProviderMetadata>,
}
#[derive(Debug, Clone)]
pub struct SpeechResponseInfo {
pub timestamp: String,
pub model_id: String,
pub headers: Option<Headers>,
pub body: Option<crate::shared::FileBytes>,
}