[{"data":1,"prerenderedAt":4},["ShallowReactive",2],{"article-doc:docs\u002Frealtime\u002Fquickstart":3},"---\ntitle: Realtime Quickstart\ndescription: Minimal runnable WebSocket examples.\n---\nMinimal runnable examples for real-time streaming transcription.\n\n## Node.js \u002F TypeScript\n\n```typescript\nimport WebSocket from \"ws\";\n\nconst BASE = \"wss:\u002F\u002Faudio.lansonai.com\";\nconst SK = \"sk-...\";\n\nconst ws = new WebSocket(`${BASE}\u002Fv1\u002Faudio\u002Ftranscriptions\u002Fstream`, {\n  headers: { Authorization: `Bearer ${SK}` },\n});\n\nws.on(\"open\", () => {\n  \u002F\u002F Optional: configure session\n  ws.send(JSON.stringify({ type: \"session.update\", language: \"zh\" }));\n\n  \u002F\u002F Send PCM16LE base64 audio frames (100ms recommended)\n  ws.send(JSON.stringify({\n    type: \"input_audio_buffer.append\",\n    audio: \"\u003Cbase64 PCM16LE>\",\n  }));\n\n  \u002F\u002F Flush when a speech segment ends\n  ws.send(JSON.stringify({ type: \"input_audio_buffer.flush\" }));\n});\n\nws.on(\"message\", (data) => {\n  const event = JSON.parse(data.toString());\n  switch (event.type) {\n    case \"session.created\":\n      console.log(\"Session:\", event.session_id, \"Plan:\", event.plan);\n      break;\n    case \"conversation.item.input_audio_transcription.completed\":\n      console.log(`[${event.utterance_index}] ${event.text}`);\n      break;\n    case \"error\":\n      console.error(\"Error:\", event.code, event.message);\n      break;\n  }\n});\n\nws.on(\"close\", (code) => console.log(`Closed: ${code}`));\n```\n\n## Browser JavaScript\n\nBrowser connections require a session token obtained from your backend:\n\n```javascript\n\u002F\u002F 1. Get session token from your backend\nconst { token } = await fetch(\"\u002Fyour-backend\u002Fsession-token\", {\n  method: \"POST\",\n}).then(r => r.json());\n\n\u002F\u002F 2. Open WebSocket\nconst ws = new WebSocket(\n  `wss:\u002F\u002Faudio.lansonai.com\u002Fv1\u002Faudio\u002Ftranscriptions\u002Fstream?access_token=${token}`\n);\n\nws.onopen = () => {\n  \u002F\u002F 3. Capture microphone audio at 16kHz mono\n  const ctx = new AudioContext({ sampleRate: 16000 });\n  navigator.mediaDevices.getUserMedia({ audio: true }).then((stream) => {\n    const source = ctx.createMediaStreamSource(stream);\n    \u002F\u002F Use AudioWorklet to convert to PCM16LE and send frames\n  });\n};\n\nws.onmessage = (event) => {\n  const data = JSON.parse(event.data);\n  if (data.type === \"conversation.item.input_audio_transcription.completed\") {\n    console.log(data.text);\n  }\n};\n```\n\n## Python\n\n```python\nimport json, websocket\n\nws = websocket.create_connection(\n    \"wss:\u002F\u002Faudio.lansonai.com\u002Fv1\u002Faudio\u002Ftranscriptions\u002Fstream\",\n    header=[\"Authorization: Bearer sk-...\"]\n)\n\nprint(json.loads(ws.recv()))  # session.created\n\nws.send(json.dumps({\n    \"type\": \"input_audio_buffer.append\",\n    \"audio\": \"\u003Cbase64 PCM16LE>\"\n}))\nws.send(json.dumps({\"type\": \"input_audio_buffer.flush\"}))\n\nwhile True:\n    event = json.loads(ws.recv())\n    if event[\"type\"] == \"conversation.item.input_audio_transcription.completed\":\n        print(f\"[{event['utterance_index']}] {event['text']}\")\n    elif event[\"type\"] == \"error\":\n        print(f\"Error: {event['code']}: {event['message']}\")\n        break\n```\n\n## Reference script\n\nThe repository's `scripts\u002Frealtime-inspect.ts` is a complete end-to-end validation script:\n\n```bash\nbun run inspect:realtime -- --audio .\u002Fsample.wav\n```\n\nIt handles session-token flow, PCM16LE encoding, 100ms frame simulation, and completed-event verification. Requires `ffmpeg`.\n\n## Next steps\n\n- [Connection Lifecycle](\u002Fdocs\u002Frealtime\u002Fconnection-lifecycle) — timeouts and close codes\n- [Audio Input](\u002Fdocs\u002Frealtime\u002Faudio-input) — format and frame size\n- [Client Messages](\u002Fdocs\u002Fapi-reference\u002Fclient-messages) — all message types\n",1790059118959]