Google Gemini 3.5 Live Translate — real-time speech-to-speech translation over WebSocket (AI Studio).
30초 만에 gemini-3.5-live-translate 사용하기
OpenAI Realtime 호환입니다. WebSocket으로 연결해 오디오를 스트리밍으로 주고받습니다. WS /v1/realtime
import asyncio, base64, json, websockets
URL = "wss://synthorai.io/v1/realtime?model=gemini-3.5-live-translate"
# Send ONLY the Authorization header - the beta protocol is retired.
HEADERS = {"Authorization": "Bearer sk-syn-..."}
async def main():
async with websockets.connect(URL, additional_headers=HEADERS) as ws:
# 1) configure the speech-to-speech session
await ws.send(json.dumps({
"type": "session.update",
"session": {
"type": "realtime",
"output_modalities": ["audio"],
"audio": {"output": {"voice": "alloy"}},
},
}))
# 2) send input audio (base64 PCM16), then request a spoken reply
await ws.send(json.dumps({"type": "input_audio_buffer.append", "audio": pcm16_b64}))
await ws.send(json.dumps({"type": "input_audio_buffer.commit"}))
await ws.send(json.dumps({"type": "response.create"}))
# 3) stream the model's audio (and text) back
async for raw in ws:
ev = json.loads(raw)
if ev["type"] == "response.audio.delta":
play(base64.b64decode(ev["delta"])) # audio out
elif ev["type"] == "response.done":
break
asyncio.run(main())import WebSocket from "ws";
const ws = new WebSocket("wss://synthorai.io/v1/realtime?model=gemini-3.5-live-translate", {
// Send ONLY the Authorization header — the beta protocol is retired.
headers: { Authorization: "Bearer sk-syn-..." },
});
ws.on("open", () => {
// configure the speech-to-speech session
ws.send(JSON.stringify({ type: "session.update", session: {
type: "realtime", output_modalities: ["audio"], audio: { output: { voice: "alloy" } },
} }));
// send input audio (base64 PCM16), then request a spoken reply
ws.send(JSON.stringify({ type: "input_audio_buffer.append", audio: pcm16Base64 }));
ws.send(JSON.stringify({ type: "input_audio_buffer.commit" }));
ws.send(JSON.stringify({ type: "response.create" }));
});
ws.on("message", (raw) => {
const ev = JSON.parse(raw.toString());
if (ev.type === "response.audio.delta") playAudio(Buffer.from(ev.delta, "base64")); // audio out
else if (ev.type === "response.done") ws.close();
});# Realtime is a WebSocket protocol - use a WS client such as websocat.
# Each line below is one OpenAI Realtime event (JSON) sent to the session.
websocat -H 'Authorization: Bearer sk-syn-...' \
'wss://synthorai.io/v1/realtime?model=gemini-3.5-live-translate' <<'EOF'
{"type":"session.update","session":{"type":"realtime","output_modalities":["audio"],"audio":{"output":{"voice":"alloy"}}}}
{"type":"input_audio_buffer.append","audio":"<base64-pcm16>"}
{"type":"input_audio_buffer.commit"}
{"type":"response.create"}
EOF
# Responses stream back as response.audio.delta (base64 audio out) … response.donepackage main
import (
"net/http"
"github.com/gorilla/websocket"
)
func main() {
h := http.Header{}
h.Set("Authorization", "Bearer sk-syn-...")
// Send ONLY the Authorization header — the beta protocol is retired.
c, _, err := websocket.DefaultDialer.Dial("wss://synthorai.io/v1/realtime?model=gemini-3.5-live-translate", h)
if err != nil {
panic(err)
}
defer c.Close()
// configure the speech-to-speech session, send audio, request a spoken reply
c.WriteJSON(map[string]any{"type": "session.update", "session": map[string]any{
"type": "realtime", "output_modalities": []string{"audio"},
"audio": map[string]any{"output": map[string]any{"voice": "alloy"}}}})
c.WriteJSON(map[string]any{"type": "input_audio_buffer.append", "audio": pcm16B64})
c.WriteJSON(map[string]any{"type": "input_audio_buffer.commit"})
c.WriteJSON(map[string]any{"type": "response.create"})
for {
var ev struct {
Type string `json:"type"`
Delta string `json:"delta"`
}
if err := c.ReadJSON(&ev); err != nil {
return
}
if ev.Type == "response.audio.delta" {
playAudio(ev.Delta) // base64 audio out
} else if ev.Type == "response.done" {
return
}
}
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.WebSocket;
import java.util.concurrent.CompletionStage;
// JDK built-in WebSocket — no extra dependency needed.
WebSocket ws = HttpClient.newHttpClient().newWebSocketBuilder()
.header("Authorization", "Bearer sk-syn-...")
// Send ONLY the Authorization header — the beta protocol is retired.
.buildAsync(URI.create("wss://synthorai.io/v1/realtime?model=gemini-3.5-live-translate"), new WebSocket.Listener() {
public CompletionStage<?> onText(WebSocket w, CharSequence data, boolean last) {
// handle response.audio.delta (base64 audio out) / response.done here
w.request(1);
return null;
}
}).join();
// configure the session, send input audio, then request a spoken reply
ws.sendText("{\"type\":\"session.update\",\"session\":{\"type\":\"realtime\",\"output_modalities\":[\"audio\"],\"audio\":{\"output\":{\"voice\":\"alloy\"}}}}", true);
ws.sendText("{\"type\":\"input_audio_buffer.append\",\"audio\":\"<base64-pcm16>\"}", true);
ws.sendText("{\"type\":\"input_audio_buffer.commit\"}", true);
ws.sendText("{\"type\":\"response.create\"}", true);gemini-3.5-live-translate 소개
- Audio-only billing per official list.
- Audio $3.50/M in · $21/M out.
- Billed per response at official list price.
자주 묻는 질문
gemini-3.5-live-translate API는 무료로 사용해 볼 수 있나요?
gemini-3.5-live-translate는 현재 초대제 베타 단계라 누구나 바로 쓸 수는 없고, 신청 후 승인을 받아야 합니다. Synthorai 콘솔에서 신청할 수 있으며, 승인되면 구독 없이 일반 종량제 요금이 적용됩니다.
gemini-3.5-live-translate API는 어떻게 호출하나요?
gemini-3.5-live-translate는 음성 대 음성(speech-to-speech) 모델입니다. OpenAI Realtime SDK(또는 WebSocket 직접 연결)로 wss://synthorai.io/v1/realtime?model=gemini-3.5-live-translate에 접속해 오디오를 스트리밍으로 주고받습니다. POST /v1/audio/transcriptions처럼 파일을 올리는 방식이 아닙니다. sk-syn 키로 인증하며, Authorization 헤더만 보내면 됩니다(beta 프로토콜은 지원이 끝났습니다).
gemini-3.5-live-translate는 어떻게 이용하나요?
gemini-3.5-live-translate는 초대제 베타 모델이므로 Synthorai 콘솔에서 액세스를 신청해야 합니다. 승인되면 다른 모델과 똑같이 쓸 수 있습니다. OpenAI SDK에서 base_url="https://synthorai.io/v1", model="gemini-3.5-live-translate"만 지정하면 됩니다.
관련 모델
비교
이 페이지의 모든 값은 공급자 공식 문서(위 링크)에서 그대로 옮겨 적었으며, 확인한 날짜를 함께 표기합니다. 가격은 카탈로그 전체와 비교해 보여 주지만, 공급자마다 정의가 다른 사양 값은 차이만 밝히고 차트로 비교하지 않습니다. 저희가 직접 측정한 수치는 없고, 점수도 매기지 않습니다.