Skip to main content
Umay (speech to text) and Ses (text to speech) answer the OpenAI audio APIs, so the OpenAI plugins of LiveKit Agents and Pipecat work with them. Change the address and the key; nothing else is needed. On your own servers, use your server’s address instead (see On-premises). Tested with livekit-agents 1.8.12 and pipecat-ai 1.16.0.

LiveKit Agents

  • STT: with use_realtime=True the plugin opens /v1/realtime?intent=transcription. Umay ends a turn after about 0.8 s of silence; the turn_detection setting the plugin sends is accepted but does not change that. Without use_realtime, LiveKit cuts the audio with its VAD and sends each utterance as a file to /v1/audio/transcriptions; that also works, with more delay.
  • TTS: the plugin sends each sentence as its own request and plays it while it streams. When the caller interrupts, LiveKit closes the request and Ses stops synthesis.
  • Language of the voice: the TTS plugin does not send language; the language comes from the voice. Pick a voice of the language you speak: alp for Turkish, emily for English (see Voices).

Pipecat

  • STT: Pipecat sends input_audio_buffer.commit when its VAD hears the caller stop, and Umay gives the final text of that turn at once. With Silero’s default 0.2 s, a short pause inside a sentence (“Adresiniz Bornova, …”) already ends the turn and the sentence comes back in two pieces; set SileroVADAnalyzer(params=VADParams(stop_secs=0.8)) to keep sentences whole.
  • TTS: Pipecat asks for pcm at 24 kHz, which is what Ses sends.
  • Voice names: Pipecat refuses voice names that are not OpenAI’s. The line that adds alp to VALID_VOICES lets you use any Ses voice or custom voice id. Without it, an OpenAI name works too: Ses answers with the voice of the same gender in the default language (onyx → a Turkish male voice).
  • For file-based recognition instead of live, OpenAISTTService(base_url="https://stt.eu.mihu.ai/v1", ...) sends each utterance to /v1/audio/transcriptions.

Names and places

Both plugins send a prompt (LiveKit: openai.STT(prompt=...), Pipecat: Settings(prompt=...)). Umay turns it into hints for Turkish: a list such as "Bornova, Karşıyaka, Ali Yılmaz" makes those names easier to recognise. See OpenAI-compatible API.