Skip to main content

lib/agent_sea/voice.ex

defmodule AgentSea.Voice do
  @moduledoc """
  Voice facade over pluggable TTS/STT adapters.

  ## Example

      {:ok, %{audio: mp3}} =
        AgentSea.Voice.speak("Hello!", tts: {AgentSea.Voice.OpenAI, voice: "nova"})

      {:ok, %{text: text}} =
        AgentSea.Voice.listen(mp3, stt: {AgentSea.Voice.OpenAI, []})
  """

  @doc "Synthesize speech. `:tts` is `{module, opts}` (a `AgentSea.Voice.TTS`)."
  @spec speak(String.t(), keyword()) :: {:ok, AgentSea.Voice.TTS.result()} | {:error, term()}
  def speak(text, opts) do
    {module, adapter_opts} = Keyword.fetch!(opts, :tts)
    module.synthesize(text, adapter_opts)
  end

  @doc "Transcribe audio. `:stt` is `{module, opts}` (a `AgentSea.Voice.STT`)."
  @spec listen(binary(), keyword()) :: {:ok, AgentSea.Voice.STT.result()} | {:error, term()}
  def listen(audio, opts) do
    {module, adapter_opts} = Keyword.fetch!(opts, :stt)
    module.transcribe(audio, adapter_opts)
  end
end