use std::sync::Arc;
use serde::{Deserialize, Serialize};
use crate::error::Error;
use crate::provider::Provider;
use crate::value_objects::Meta;
#[derive(Clone)]
pub struct TextToSpeechRequest {
pub model: String,
pub input: String,
pub voice: Option<String>,
pub provider_options: serde_json::Value,
}
impl TextToSpeechRequest {
pub fn new(model: impl Into<String>, input: impl Into<String>) -> Self {
Self {
model: model.into(),
input: input.into(),
voice: None,
provider_options: serde_json::Value::Null,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AudioOutput {
pub data: Vec<u8>,
pub mime_type: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AudioResponse {
pub audio: AudioOutput,
pub meta: Meta,
}
pub struct PendingTextToSpeechRequest {
provider: Arc<dyn Provider>,
request: TextToSpeechRequest,
}
impl PendingTextToSpeechRequest {
pub fn new(
provider: Arc<dyn Provider>,
model: impl Into<String>,
input: impl Into<String>,
) -> Self {
Self {
provider,
request: TextToSpeechRequest::new(model, input),
}
}
pub fn with_voice(mut self, voice: impl Into<String>) -> Self {
self.request.voice = Some(voice.into());
self
}
pub fn to_request(&self) -> TextToSpeechRequest {
self.request.clone()
}
pub async fn generate(self) -> Result<AudioResponse, Error> {
self.provider.text_to_speech(self.request).await
}
}