defmodule OpenAI.Audio do @moduledoc """ Learn how to turn audio into text. Related guide: [Speech to text](https://platform.openai.com/docs/guides/speech-to-text) https://platform.openai.com/docs/api-reference/audio """ alias OpenAI.Client @type create_transcription_params :: %{ required(:file) => iodata(), required(:filename) => String.t(), required(:model) => String.t(), optional(:prompt) => String.t(), optional(:response_format) => String.t(), optional(:temperature) => float(), optional(:language) => String.t() } @doc """ Transcribes audio into the input language. """ @spec create_transcription(Client.t(), create_transcription_params(), Keyword.t()) :: Client.result() def create_transcription(client, params, opts \\ []) do file = Map.get(params, :file) filename = Map.get(params, :filename) mp = Tesla.Multipart.new() |> Tesla.Multipart.add_file_content(file, filename) |> apply_params(params) IO.puts "MP: #{inspect(mp)}" opts = Keyword.put(opts, :headers, [{"content-type", "multipart/form-data"}]) client |> Client.post("/v1/audio/transcriptions", mp, opts) |> Client.handle_response(opts) end defp apply_params(multipart, params) do params |> Map.delete(:file) |> Map.delete(:filename) |> Map.to_list() |> Enum.reduce(multipart, fn {key, value}, mp -> Tesla.Multipart.add_field(mp, key, value) end) end @type create_translation_params :: %{ required(:file) => String.t(), required(:model) => String.t(), optional(:prompt) => String.t(), optional(:response_format) => String.t(), optional(:temperature) => float() } @doc """ Translates audio into English. """ @spec create_translation(Client.t(), create_translation_params(), Keyword.t()) :: Client.result() def create_translation(client, params, opts \\ []) do client |> Client.post("/v1/audio/translations", params, opts) |> Client.handle_response(opts) end end