// SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. // SPDX-License-Identifier: Apache-2.0 // // Based on https://github.com/64bit/async-openai/ by Himanshu Neema // Original Copyright (c) 2022 Himanshu Neema // Licensed under MIT License (see ATTRIBUTIONS-Rust.md) // // Modifications Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. // Licensed under Apache 2.0 use bytes::Bytes; use crate::{ config::Config, error::OpenAIError, types::{ CreateSpeechRequest, CreateSpeechResponse, CreateTranscriptionRequest, CreateTranscriptionResponseJson, CreateTranscriptionResponseVerboseJson, CreateTranslationRequest, CreateTranslationResponseJson, CreateTranslationResponseVerboseJson, }, Client, }; /// Turn audio into text or text into audio. /// Related guide: [Speech to text](https://platform.openai.com/docs/guides/speech-to-text) pub struct Audio<'c, C: Config> { client: &'c Client, } impl<'c, C: Config> Audio<'c, C> { pub fn new(client: &'c Client) -> Self { Self { client } } /// Transcribes audio into the input language. #[crate::byot( T0 = Clone, R = serde::de::DeserializeOwned, where_clause = "reqwest::multipart::Form: crate::traits::AsyncTryFrom", )] pub async fn transcribe( &self, request: CreateTranscriptionRequest, ) -> Result { self.client .post_form("/audio/transcriptions", request) .await } /// Transcribes audio into the input language. #[crate::byot( T0 = Clone, R = serde::de::DeserializeOwned, where_clause = "reqwest::multipart::Form: crate::traits::AsyncTryFrom", )] pub async fn transcribe_verbose_json( &self, request: CreateTranscriptionRequest, ) -> Result { self.client .post_form("/audio/transcriptions", request) .await } /// Transcribes audio into the input language. pub async fn transcribe_raw( &self, request: CreateTranscriptionRequest, ) -> Result { self.client .post_form_raw("/audio/transcriptions", request) .await } /// Translates audio into English. #[crate::byot( T0 = Clone, R = serde::de::DeserializeOwned, where_clause = "reqwest::multipart::Form: crate::traits::AsyncTryFrom", )] pub async fn translate( &self, request: CreateTranslationRequest, ) -> Result { self.client.post_form("/audio/translations", request).await } /// Translates audio into English. #[crate::byot( T0 = Clone, R = serde::de::DeserializeOwned, where_clause = "reqwest::multipart::Form: crate::traits::AsyncTryFrom", )] pub async fn translate_verbose_json( &self, request: CreateTranslationRequest, ) -> Result { self.client.post_form("/audio/translations", request).await } /// Transcribes audio into the input language. pub async fn translate_raw( &self, request: CreateTranslationRequest, ) -> Result { self.client .post_form_raw("/audio/translations", request) .await } /// Generates audio from the input text. pub async fn speech( &self, request: CreateSpeechRequest, ) -> Result { let bytes = self.client.post_raw("/audio/speech", request).await?; Ok(CreateSpeechResponse { bytes }) } }