use std::sync::Arc;
use serde::{Deserialize, Serialize};
use crate::error::Error;
use crate::provider::Provider;
use crate::value_objects::Meta;
#[derive(Debug, Clone)]
pub struct AudioInput {
pub data: Vec<u8>,
pub mime_type: String,
pub filename: String,
}
impl AudioInput {
pub fn new(data: Vec<u8>, mime_type: impl Into<String>) -> Self {
Self {
data,
mime_type: mime_type.into(),
filename: "audio".to_string(),
}
}
pub fn with_filename(mut self, filename: impl Into<String>) -> Self {
self.filename = filename.into();
self
}
}
#[derive(Clone)]
pub struct SpeechToTextRequest {
pub model: String,
pub audio: AudioInput,
pub provider_options: serde_json::Value,
}
impl SpeechToTextRequest {
pub fn new(model: impl Into<String>, audio: AudioInput) -> Self {
Self {
model: model.into(),
audio,
provider_options: serde_json::Value::Null,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TranscriptionResponse {
pub text: String,
pub meta: Meta,
}
pub struct PendingSpeechToTextRequest {
provider: Arc<dyn Provider>,
request: SpeechToTextRequest,
}
impl PendingSpeechToTextRequest {
pub fn new(provider: Arc<dyn Provider>, model: impl Into<String>, audio: AudioInput) -> Self {
Self {
provider,
request: SpeechToTextRequest::new(model, audio),
}
}
pub fn to_request(&self) -> SpeechToTextRequest {
self.request.clone()
}
pub async fn generate(self) -> Result<TranscriptionResponse, Error> {
self.provider.speech_to_text(self.request).await
}
}