use bytes::Bytes;
use futures_util::Stream;
use crate::client::Skailar;
use crate::error::Error;
use crate::types::audio::{SpeechRequest, TranscriptionRequest, TranscriptionResponse};
#[derive(Debug, Clone, Copy)]
pub struct Audio<'a> {
client: &'a Skailar,
}
impl<'a> Audio<'a> {
pub(crate) fn new(client: &'a Skailar) -> Self {
Audio { client }
}
pub fn transcriptions(&self) -> Transcriptions<'a> {
Transcriptions {
client: self.client,
}
}
pub fn speech(&self) -> Speech<'a> {
Speech {
client: self.client,
}
}
}
#[derive(Debug, Clone, Copy)]
pub struct Transcriptions<'a> {
client: &'a Skailar,
}
impl Transcriptions<'_> {
pub async fn create(
&self,
request: TranscriptionRequest,
) -> Result<TranscriptionResponse, Error> {
self.client
.post_json(
"v1/audio/transcriptions",
&request,
crate::client::Idempotency::SideEffect,
)
.await
}
}
#[derive(Debug, Clone, Copy)]
pub struct Speech<'a> {
client: &'a Skailar,
}
impl Speech<'_> {
pub async fn create(
&self,
request: SpeechRequest,
) -> Result<impl Stream<Item = Result<Bytes, Error>> + use<>, Error> {
self.client
.post_binary("v1/audio/speech", &request, "audio/mpeg")
.await
}
pub async fn create_bytes(&self, request: SpeechRequest) -> Result<Bytes, Error> {
use futures_util::StreamExt;
let mut stream = Box::pin(self.create(request).await?);
let mut buf = Vec::new();
while let Some(chunk) = stream.next().await {
buf.extend_from_slice(&chunk?);
}
Ok(Bytes::from(buf))
}
}