Voz em tempo real
Crie agentes de voz bidirecionais com gpt-realtime — o modelo ouve a fala e responde com voz em tempo real (como uma ligação telefônica), por meio de uma conexão WebSocket com /v1/realtime. Seu SDK OpenAI Realtime existente funciona sem alterações; basta apontá-lo para o nosso endpoint e usar sua chave Synthorai.
Voz para voz, não transcrição
Esta página cobre voz para voz: voz na entrada, voz na saída. Conecte-se com ?model=gpt-realtime.
Se você só precisa converter áudio em texto (sem resposta falada), use Fala para texto em vez disso — é uma capacidade diferente.
Endpoint e autenticação
Abra um WebSocket para /v1/realtime com o seu modelo na string de consulta. A autenticação é executada antes do upgrade, então uma chave rejeitada nunca abre um socket.
# WebSocket, server-side (Node / Python / Go — anything that can set headers)
GET wss://synthorai.io/v1/realtime?model=gpt-realtime
Authorization: Bearer $YOUR_KEY
# Send only the Authorization header. Do NOT send OpenAI-Beta: realtime=v1
# (the beta protocol is retired; it makes the upstream reject the session). - Sua chave
sk-synnunca sai do nosso gateway — a credencial do upstream é trocada do nosso lado. - Feito para clientes do lado do servidor (Node, Python, Go — qualquer coisa que possa definir um cabeçalho
Authorization). Tokens efêmeros de navegador não são suportados. - Apenas WebSocket. SIP (telefonia) e WebRTC conectam o cliente diretamente ao upstream e não são intermediados — em vez disso, faça a ponte do áudio de telefonia para um WebSocket.
Configure a sessão
Depois que a conexão abre, você recebe session.created. Envie um session.update para definir a voz, as modalidades, o formato de áudio e a detecção de turno. Use o formato GA (session.type: "realtime", áudio sob audio.input / audio.output) — o antigo formato plano em beta foi descontinuado.
{
"type": "session.update",
"session": {
"type": "realtime",
"output_modalities": ["audio"],
"instructions": "You are a concise customer-support agent.",
"audio": {
"input": { "format": { "type": "audio/pcm", "rate": 24000 },
"turn_detection": { "type": "server_vad" } },
"output": { "format": { "type": "audio/pcm", "rate": 24000 } }
}
}
} Um turno de conversa mínimo:
- Transmita o áudio do microfone com
input_audio_buffer.append(PCM em base64). - Confirme o turno com
input_audio_buffer.commite depoisresponse.create. - Receba os deltas de áudio (
response.output_audio.delta) e a transcrição de texto, depoisresponse.donecom o uso. - Com o server VAD ativado, o modelo detecta os turnos para você; os mesmos eventos fluem sem commits manuais.
Ferramentas, chamada de funções e conhecimento
Declare funções em session.update. O modelo as chama no meio da conversa — é assim que você conecta a consulta de pedidos, a emissão de tickets ou qualquer sistema de negócio. Retorne o resultado e o modelo continua falando com base nele:
// 1. Declare tools in session.update: "tools": [{ "type": "function", ... }]
// 2. The model emits a function_call in response.done.
// 3. Return the result, then ask the model to continue:
{ "type": "conversation.item.create",
"item": { "type": "function_call_output",
"call_id": "call_abc",
"output": "{\"status\":\"shipped\"}" } }
{ "type": "response.create" } Servidores MCP remotos também são suportados ("type": "mcp") — o upstream se conecta diretamente ao servidor MCP. Para uma base de conhecimento, injete fatos por meio de instructions, uma ferramenta de função apoiada pelo seu RAG, ou MCP; o conhecimento embutido no modelo não é uma fonte confiável para fatos de negócio.
Cobrança
Cobrado por uso de cada response.done pelo preço de tabela oficial (sem sobretaxa) — áudio e texto, entrada e saída, com uma tarifa de entrada em cache. Cada sessão grava uma linha de registro no final.
| Tipo | Entrada / 1M tokens | Saída / 1M tokens |
|---|---|---|
| Áudio | $32 / 1M | $64 / 1M |
| Texto | $4 / 1M | $16 / 1M |
| Entrada em cache | $0.40 / 1M | — |
Os preços exibidos são para gpt-realtime / gpt-realtime-2.1; gpt-realtime-2.1-mini é cerca de um terço. A entrada de áudio é de ~10 tokens/second e a saída de ~20 tokens/second. Manter o histórico da conversa como somente-anexação permite que a tarifa em cache ($0.40/1M) absorva a maior parte de uma chamada longa.
Duração da sessão e troca a quente
Uma única sessão Realtime dura no máximo 60 minutes — este é um limite da plataforma OpenAI, não nosso. O upstream fecha a conexão ao atingir o limite.
- Para chamadas que possam se estender, faça a troca a quente bem antes do limite (por ex. aos 50 minutes): abra uma sessão nova e reproduza a conversa como texto com
conversation.item.create(o usuário comoinput_text, o assistente comooutput_text— o áudio do assistente não pode ser reproduzido). - Não há retomada de sessão: se o WebSocket cair, o estado do upstream é perdido. A reconexão usa o mesmo caminho de reprodução de texto, então construa a reconexão desde o primeiro dia.
- O contexto é de 128K para
gpt-realtime-2.1/-mini(≈3.5 hours de áudio de entrada); o antigogpt-realtimeé de 32K — não o use para chamadas longas.
Acesso
gpt-realtime está em beta por convite. Ele aparece no catálogo e nos preços, mas usá-lo exige que seu workspace tenha acesso concedido — entre em contato para habilitá-lo.