use crate::{
Client,
error::DashScopeError,
operation::audio::{tts::output::TextToSpeechOutputStream},
};
#[cfg(feature = "websocket")]
use crate::operation::audio::asr::customization::Customization;
use crate::{error::Result, operation::audio::tts::output::TextToSpeechOutput};
pub use tts::param::{
Input as TextToSpeechInput, InputBuilder as TextToSpeechInputBuilder, TextToSpeechParam,
TextToSpeechParamBuilder,
};
#[cfg(feature = "websocket")]
pub mod asr;
pub mod tts;
#[cfg(feature = "websocket")]
pub mod ws;
const AUDIO_PATH: &str = "/services/aigc/multimodal-generation/generation";
pub struct Audio<'a> {
client: &'a Client,
}
impl<'a> Audio<'a> {
pub fn new(client: &'a Client) -> Self {
Self { client }
}
pub async fn tts(&self, request: TextToSpeechParam) -> Result<TextToSpeechOutput> {
if request.stream == Some(true) {
return Err(DashScopeError::InvalidArgument(
"When stream is true, use Audio::call_stream".into(),
));
}
self.client.post(AUDIO_PATH, request).await
}
pub async fn tts_stream(&self, request: TextToSpeechParam) -> Result<TextToSpeechOutputStream> {
if request.stream == Some(false) {
return Err(DashScopeError::InvalidArgument(
"When stream is false, use Audio::call".into(),
));
}
self.client.post_stream(AUDIO_PATH, request).await
}
#[cfg(feature = "websocket")]
pub async fn asr_ws(&self) -> Result<ws::WebsocketInference> {
use crate::operation::ws_client::WsClient;
let ws = WsClient::into_ws_client(self.client.clone()).await?;
Ok(ws::WebsocketInference::new(ws))
}
#[cfg(feature = "websocket")]
pub async fn tts_ws(&self) -> Result<ws::WebsocketInference> {
use crate::operation::ws_client::WsClient;
let ws = WsClient::into_ws_client(self.client.clone()).await?;
Ok(ws::WebsocketInference::new(ws))
}
#[cfg(feature = "websocket")]
pub async fn asr_customization(&self) -> Result<Customization> {
Ok(Customization::new(self.client.clone()))
}
}