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