defmodule Noizu.OpenAI.Api.Audio do @moduledoc """ Noizu.OpenAI.Api.Audio is a module that provides functionality for transcribing and translating audio using OpenAI's API. This module offers two main functions: 1. `transcribe/3` - Transcribes the given audio file using a specified prompt and options. 2. `translate/3` - Translates the given audio file using a specified prompt and options. ## Usage {:ok, transcript} = Noizu.OpenAI.Api.Audio.transcribe(audio, prompt, options) {:ok, translation} = Noizu.OpenAI.Api.Audio.translate(audio, prompt, options) """ require Noizu.OpenAI import Noizu.OpenAI #------------------------------- # #------------------------------- @doc """ Transcribes audio using the specified model. ## Parameters - audio: The URL of the audio file to transcribe - prompt: The prompt or instruction for the transcription - options: A map or keyword list of options, such as model, response_format, temperature, language, and stream ## Returns Returns a tuple {:ok, response} on successful transcription, where response is a map containing the transcription result. Returns {:error, term} on failure, where term contains error details. ## Example audio_url = "https://your_audio_url_here" prompt = "Transcribe this audio." {:ok, response} = Noizu.OpenAI.transcribe(audio_url, prompt) """ @type transcribe_response() :: map() @type transcribe_supported_models() :: :"whisper-1" | atom @type transcribe_options() :: %{ optional(:model) => Noizu.OpenAI.model_option(transcribe_supported_models()), optional(:response_format) => Noizu.OpenAI.response_format_option(), optional(:prompt) => String.t(), optional(:temperature) => Noizu.OpenAI.temperature_option(), optional(:language) => Noizu.OpenAI.language_option(), optional(:stream) => Noizu.OpenAI.stream_option(), } | Keyword.t() @spec transcribe(audio :: String.t(), prompt :: String.t(), options :: transcribe_options()) :: {:ok, transcribe_response()} | {:error, term} def transcribe(audio, prompt, options \\ nil) do url = openai_base() <> "audio/transcriptions" body = %{file: audio} |> put_field(:model, options, "whisper-1") |> put_field(:response_format, options) |> put_field(:prompt, options, prompt) |> put_field(:temperature, options) |> put_field(:language, options) api_call(:post, url, body, Noizu.OpenAI.Audio.Transcript, options) end #------------------------------- # #------------------------------- @doc """ Translates audio using the specified model. ## Parameters - audio: The URL of the audio file to translate - prompt: The prompt or instruction for the translation - options: A map or keyword list of options, such as model, response_format, temperature, and stream ## Returns Returns a tuple {:ok, response} on successful translation, where response is a map containing the translation result. Returns {:error, term} on failure, where term contains error details. ## Example audio_url = "https://your_audio_url_here" prompt = "Translate this audio to English." {:ok, response} = Noizu.OpenAI.translate_audio(audio_url, prompt) """ @type translate_audio_response() :: map() @type translate_audio_supported_models() :: :"whisper-1" | atom @type translate_audio_options() :: %{ optional(:model) => Noizu.OpenAI.model_option(translate_audio_supported_models()), optional(:response_format) => Noizu.OpenAI.response_format_option(), optional(:prompt) => String.t(), optional(:temperature) => Noizu.OpenAI.temperature_option(), optional(:stream) => Noizu.OpenAI.stream_option(), } | Keyword.t() @spec translate(audio :: String.t(), prompt :: String.t(), options :: translate_audio_options()) :: {:ok, translate_audio_response()} | {:error, term} def translate(audio, prompt, options \\ nil) do url = openai_base() <> "audio/translations" body = %{file: audio} |> put_field(:model, options, "whisper-1") |> put_field(:response_format, options) |> put_field(:prompt, options, prompt) |> put_field(:temperature, options) api_call(:post, url, body, Noizu.OpenAI.Audio.Transcript, options) end end