use crate::
{
error::Result,
audio::{ Audio, AudioInput, TranscriptionResult },
environment::HuggingFaceEnvironment,
};
use serde::{ Serialize, Deserialize };
#[ derive( Debug, Serialize ) ]
struct AsrRequest
{
inputs : String,
}
#[ derive( Debug, Deserialize ) ]
#[ serde( untagged ) ]
enum AsrResponse
{
Single( TranscriptionResult ),
Wrapped { text : String },
}
impl< E > Audio< E >
where
E : HuggingFaceEnvironment + crate::environment::EnvironmentInterface + Send + Sync + 'static + Clone,
{
#[ inline ]
pub async fn transcribe(
&self,
audio : AudioInput,
model : impl AsRef< str >
) -> Result< String >
{
let request = AsrRequest
{
inputs : audio.to_base64( ),
};
let endpoint = format!( "/models/{}", model.as_ref( ) );
let url = self.client.environment.endpoint_url( &endpoint )?;
let response : AsrResponse = self.client
.post( url.as_str( ), &request )
.await?;
let text = match response
{
AsrResponse::Single( result ) => result.text,
AsrResponse::Wrapped { text } => text,
};
Ok( text )
}
}