[{"data":1,"prerenderedAt":1480},["ShallowReactive",2],{"navigation":3,"\u002Fguides":220,"\u002Fguides-surround":1475},[4,28,64,92,124,152,192],{"title":5,"path":6,"stem":7,"children":8,"icon":27},"Start","\u002Fstart","1.start\u002F1.index",[9,11,15,19,23],{"title":10,"path":6,"stem":7},"Overview",{"title":12,"path":13,"stem":14},"Quickstart","\u002Fstart\u002Fquickstart","1.start\u002F2.quickstart",{"title":16,"path":17,"stem":18},"Authentication","\u002Fstart\u002Fauthentication","1.start\u002F3.authentication",{"title":20,"path":21,"stem":22},"SDKs","\u002Fstart\u002Fsdks","1.start\u002F4.sdks",{"title":24,"path":25,"stem":26},"Choose an API","\u002Fstart\u002Fchoose-an-api","1.start\u002F5.choose-an-api","i-lucide-rocket",{"title":29,"path":30,"stem":31,"children":32,"icon":63},"Realtime","\u002Frealtime","2.realtime\u002F1.index",[33,35,39,43,47,51,55,59],{"title":34,"path":30,"stem":31},"Realtime Overview",{"title":36,"path":37,"stem":38},"Realtime Quickstart","\u002Frealtime\u002Fquickstart","2.realtime\u002F2.quickstart",{"title":40,"path":41,"stem":42},"Connection Lifecycle","\u002Frealtime\u002Fconnection-lifecycle","2.realtime\u002F3.connection-lifecycle",{"title":44,"path":45,"stem":46},"Audio Input","\u002Frealtime\u002Faudio-input","2.realtime\u002F4.audio-input",{"title":48,"path":49,"stem":50},"Transcript Lifecycle","\u002Frealtime\u002Ftranscript-lifecycle","2.realtime\u002F5.transcript-lifecycle",{"title":52,"path":53,"stem":54},"Realtime Translation","\u002Frealtime\u002Frealtime-translation","2.realtime\u002F6.realtime-translation",{"title":56,"path":57,"stem":58},"Session Configuration","\u002Frealtime\u002Fsession-configuration","2.realtime\u002F7.session-configuration",{"title":60,"path":61,"stem":62},"Handling Interruptions & Silence","\u002Frealtime\u002Finterruptions-silence","2.realtime\u002F8.interruptions-silence","i-lucide-radio",{"title":65,"path":66,"stem":67,"children":68,"icon":91},"Recorded","\u002Frecorded","3.recorded\u002F1.index",[69,71,75,79,83,87],{"title":70,"path":66,"stem":67},"Recorded Overview",{"title":72,"path":73,"stem":74},"Transcribe Audio","\u002Frecorded\u002Ftranscribe-audio","3.recorded\u002F2.transcribe-audio",{"title":76,"path":77,"stem":78},"Timestamps & Speakers","\u002Frecorded\u002Ftimestamps-speakers","3.recorded\u002F3.timestamps-speakers",{"title":80,"path":81,"stem":82},"Subtitles","\u002Frecorded\u002Fsubtitles","3.recorded\u002F4.subtitles",{"title":84,"path":85,"stem":86},"Recorded Translation","\u002Frecorded\u002Ftranslation","3.recorded\u002F5.translation",{"title":88,"path":89,"stem":90},"Structured Results","\u002Frecorded\u002Fstructured-results","3.recorded\u002F6.structured-results","i-lucide-file-audio",{"title":93,"path":94,"stem":95,"children":96,"icon":123},"Concepts","\u002Fconcepts","4.concepts\u002F1.index",[97,99,103,107,111,115,119],{"title":98,"path":94,"stem":95},"Voice Context Layer",{"title":100,"path":101,"stem":102},"Stable vs. Partial Text","\u002Fconcepts\u002Fstable-vs-partial-text","4.concepts\u002F2.stable-vs-partial-text",{"title":104,"path":105,"stem":106},"StableStream","\u002Fconcepts\u002Fstablestream","4.concepts\u002F3.stablestream",{"title":108,"path":109,"stem":110},"Context-Aware Processing","\u002Fconcepts\u002Fcontext-aware-processing","4.concepts\u002F4.context-aware-processing",{"title":112,"path":113,"stem":114},"Understanding Latency","\u002Fconcepts\u002Flatency","4.concepts\u002F5.latency",{"title":116,"path":117,"stem":118},"Live Translation","\u002Fconcepts\u002Flive-translation","4.concepts\u002F6.live-translation",{"title":120,"path":121,"stem":122},"Trinity Engine","\u002Fconcepts\u002Ftrinity-engine","4.concepts\u002F7.trinity-engine","i-lucide-brain",{"title":125,"path":126,"stem":127,"children":128,"icon":151},"Guides","\u002Fguides","5.guides\u002F1.index",[129,131,135,139,143,147],{"title":130,"path":126,"stem":127},"Browser Live Captions",{"title":132,"path":133,"stem":134},"Server-side Streaming","\u002Fguides\u002Fserver-side-streaming","5.guides\u002F2.server-side-streaming",{"title":136,"path":137,"stem":138},"Build a Stable Caption UI","\u002Fguides\u002Fstable-caption-ui","5.guides\u002F3.stable-caption-ui",{"title":140,"path":141,"stem":142},"Build Live Translation","\u002Fguides\u002Flive-translation","5.guides\u002F4.live-translation",{"title":144,"path":145,"stem":146},"Save a Transcript","\u002Fguides\u002Fsave-transcript","5.guides\u002F5.save-transcript",{"title":148,"path":149,"stem":150},"Reconnect a Live Session","\u002Fguides\u002Freconnection","5.guides\u002F6.reconnection","i-lucide-book-open",{"title":153,"path":154,"stem":155,"children":156,"icon":191},"Reference","\u002Fapi-reference","6.api-reference\u002F1.index",[157,159,163,167,171,175,179,183,187],{"title":158,"path":154,"stem":155},"API Reference Overview",{"title":160,"path":161,"stem":162},"Realtime API","\u002Fapi-reference\u002Frealtime-api","6.api-reference\u002F2.realtime-api",{"title":164,"path":165,"stem":166},"Client Messages","\u002Fapi-reference\u002Fclient-messages","6.api-reference\u002F3.client-messages",{"title":168,"path":169,"stem":170},"Server Events","\u002Fapi-reference\u002Fserver-events","6.api-reference\u002F4.server-events",{"title":172,"path":173,"stem":174},"Transcription API","\u002Fapi-reference\u002Ftranscription","6.api-reference\u002F5.transcription",{"title":176,"path":177,"stem":178},"Languages & Models","\u002Fapi-reference\u002Flanguages","6.api-reference\u002F6.languages",{"title":180,"path":181,"stem":182},"Errors","\u002Fapi-reference\u002Ferrors","6.api-reference\u002F7.errors",{"title":184,"path":185,"stem":186},"Rate Limits","\u002Fapi-reference\u002Frate-limits","6.api-reference\u002F8.rate-limits",{"title":188,"path":189,"stem":190},"Admin API","\u002Fapi-reference\u002Fadmin","6.api-reference\u002F9.admin","i-lucide-code",{"title":193,"path":194,"stem":195,"children":196,"icon":219},"Production","\u002Fproduction","7.production\u002F1.index",[197,199,203,207,211,215],{"title":198,"path":194,"stem":195},"Production Checklist",{"title":200,"path":201,"stem":202},"Reconnection & Retries","\u002Fproduction\u002Freconnection-retries","7.production\u002F2.reconnection-retries",{"title":204,"path":205,"stem":206},"Latency Best Practices","\u002Fproduction\u002Flatency-best-practices","7.production\u002F3.latency-best-practices",{"title":208,"path":209,"stem":210},"Security & Privacy","\u002Fproduction\u002Fsecurity-privacy","7.production\u002F4.security-privacy",{"title":212,"path":213,"stem":214},"Data Retention","\u002Fproduction\u002Fdata-retention","7.production\u002F5.data-retention",{"title":216,"path":217,"stem":218},"Changelog","\u002Fproduction\u002Fchangelog","7.production\u002F6.changelog","i-lucide-server",{"id":221,"title":130,"body":222,"description":1469,"extension":1470,"links":1471,"meta":1472,"navigation":715,"path":126,"seo":1473,"status":1471,"stem":127,"__hash__":1474},"docs\u002F5.guides\u002F1.index.md",{"type":223,"value":224,"toc":1460},"minimark",[225,229,233,238,249,253,256,472,484,488,603,607,876,881,1207,1211,1399,1403,1434,1438,1456],[226,227,130],"h1",{"id":228},"browser-live-captions",[230,231,232],"p",{},"Build a browser-based live caption interface using the LansonAI realtime API.",[234,235,237],"h2",{"id":236},"architecture","Architecture",[239,240,245],"pre",{"className":241,"code":243,"language":244},[242],"language-text","Browser                        Your backend                  LansonAI\n  │                                │                            │\n  ├── request session token ─────→ POST session-token ───────→ rt_... token\n  │←── rt_... token ──────────────│                            │\n  │                                │                            │\n  ├── open WebSocket ─────────────────────────────────────────→ session.created\n  │   ?access_token=rt_...                                       │\n  │                                │                            │\n  ├── capture mic (16kHz mono) ───│                            │\n  ├── send PCM16 frames ──────────────────────────────────────→ VAD + STT\n   │←── conversation.item.input_audio_transcription.completed ───────────────────────────│\n  │                                │                            │\n  └── display captions              │                            │\n","text",[246,247,243],"code",{"__ignoreMap":248},"",[234,250,252],{"id":251},"step-1-get-a-session-token","Step 1: Get a session token",[230,254,255],{},"Your backend exchanges the long-lived API key for a 60-second session token:",[239,257,261],{"className":258,"code":259,"language":260,"meta":248,"style":248},"language-javascript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F backend route\napp.post('\u002Fsession-token', async (req, res) => {\n  const resp = await fetch('https:\u002F\u002Faudio.lansonai.com\u002Fv1\u002Faudio\u002Ftranscriptions\u002Fsession-token', {\n    method: 'POST',\n    headers: { Authorization: `Bearer ${process.env.LANSON_AUDIO_API_KEY}` },\n  });\n  res.json(await resp.json());\n});\n","javascript",[246,262,263,272,327,360,380,424,435,462],{"__ignoreMap":248},[264,265,268],"span",{"class":266,"line":267},"line",1,[264,269,271],{"class":270},"sHwdD","\u002F\u002F backend route\n",[264,273,275,279,283,287,290,293,297,299,302,306,309,313,315,318,321,324],{"class":266,"line":274},2,[264,276,278],{"class":277},"sTEyZ","app",[264,280,282],{"class":281},"sMK4o",".",[264,284,286],{"class":285},"s2Zo4","post",[264,288,289],{"class":277},"(",[264,291,292],{"class":281},"'",[264,294,296],{"class":295},"sfazB","\u002Fsession-token",[264,298,292],{"class":281},[264,300,301],{"class":281},",",[264,303,305],{"class":304},"spNyl"," async",[264,307,308],{"class":281}," (",[264,310,312],{"class":311},"sHdIc","req",[264,314,301],{"class":281},[264,316,317],{"class":311}," res",[264,319,320],{"class":281},")",[264,322,323],{"class":304}," =>",[264,325,326],{"class":281}," {\n",[264,328,330,333,336,339,343,346,349,351,354,356,358],{"class":266,"line":329},3,[264,331,332],{"class":304},"  const",[264,334,335],{"class":277}," resp",[264,337,338],{"class":281}," =",[264,340,342],{"class":341},"s7zQu"," await",[264,344,345],{"class":285}," fetch",[264,347,289],{"class":348},"swJcz",[264,350,292],{"class":281},[264,352,353],{"class":295},"https:\u002F\u002Faudio.lansonai.com\u002Fv1\u002Faudio\u002Ftranscriptions\u002Fsession-token",[264,355,292],{"class":281},[264,357,301],{"class":281},[264,359,326],{"class":281},[264,361,363,366,369,372,375,377],{"class":266,"line":362},4,[264,364,365],{"class":348},"    method",[264,367,368],{"class":281},":",[264,370,371],{"class":281}," '",[264,373,374],{"class":295},"POST",[264,376,292],{"class":281},[264,378,379],{"class":281},",\n",[264,381,383,386,388,391,394,396,399,402,405,408,410,413,415,418,421],{"class":266,"line":382},5,[264,384,385],{"class":348},"    headers",[264,387,368],{"class":281},[264,389,390],{"class":281}," {",[264,392,393],{"class":348}," Authorization",[264,395,368],{"class":281},[264,397,398],{"class":281}," `",[264,400,401],{"class":295},"Bearer ",[264,403,404],{"class":281},"${",[264,406,407],{"class":277},"process",[264,409,282],{"class":281},[264,411,412],{"class":277},"env",[264,414,282],{"class":281},[264,416,417],{"class":277},"LANSON_AUDIO_API_KEY",[264,419,420],{"class":281},"}`",[264,422,423],{"class":281}," },\n",[264,425,427,430,432],{"class":266,"line":426},6,[264,428,429],{"class":281},"  }",[264,431,320],{"class":348},[264,433,434],{"class":281},";\n",[264,436,438,441,443,446,448,451,453,455,457,460],{"class":266,"line":437},7,[264,439,440],{"class":277},"  res",[264,442,282],{"class":281},[264,444,445],{"class":285},"json",[264,447,289],{"class":348},[264,449,450],{"class":341},"await",[264,452,335],{"class":277},[264,454,282],{"class":281},[264,456,445],{"class":285},[264,458,459],{"class":348},"())",[264,461,434],{"class":281},[264,463,465,468,470],{"class":266,"line":464},8,[264,466,467],{"class":281},"}",[264,469,320],{"class":277},[264,471,434],{"class":281},[473,474,477],"callout",{"color":475,"icon":476},"amber","i-lucide-triangle-alert",[230,478,479,480,483],{},"Never expose ",[246,481,482],{},"sk-..."," in frontend code. Always proxy through your backend.",[234,485,487],{"id":486},"step-2-open-websocket","Step 2: Open WebSocket",[239,489,491],{"className":258,"code":490,"language":260,"meta":248,"style":248},"const { token } = await fetch('\u002Fsession-token', { method: 'POST' }).then(r => r.json());\nconst ws = new WebSocket(\n  `wss:\u002F\u002Faudio.lansonai.com\u002Fv1\u002Faudio\u002Ftranscriptions\u002Fstream?access_token=${token}`\n);\n",[246,492,493,562,581,597],{"__ignoreMap":248},[264,494,495,498,500,503,505,507,509,511,513,515,517,519,521,523,526,528,530,532,534,537,539,541,544,546,549,551,554,556,558,560],{"class":266,"line":267},[264,496,497],{"class":304},"const",[264,499,390],{"class":281},[264,501,502],{"class":277}," token ",[264,504,467],{"class":281},[264,506,338],{"class":281},[264,508,342],{"class":341},[264,510,345],{"class":285},[264,512,289],{"class":277},[264,514,292],{"class":281},[264,516,296],{"class":295},[264,518,292],{"class":281},[264,520,301],{"class":281},[264,522,390],{"class":281},[264,524,525],{"class":348}," method",[264,527,368],{"class":281},[264,529,371],{"class":281},[264,531,374],{"class":295},[264,533,292],{"class":281},[264,535,536],{"class":281}," }",[264,538,320],{"class":277},[264,540,282],{"class":281},[264,542,543],{"class":285},"then",[264,545,289],{"class":277},[264,547,548],{"class":311},"r",[264,550,323],{"class":304},[264,552,553],{"class":277}," r",[264,555,282],{"class":281},[264,557,445],{"class":285},[264,559,459],{"class":277},[264,561,434],{"class":281},[264,563,564,566,569,572,575,578],{"class":266,"line":274},[264,565,497],{"class":304},[264,567,568],{"class":277}," ws ",[264,570,571],{"class":281},"=",[264,573,574],{"class":281}," new",[264,576,577],{"class":285}," WebSocket",[264,579,580],{"class":277},"(\n",[264,582,583,586,589,591,594],{"class":266,"line":329},[264,584,585],{"class":281},"  `",[264,587,588],{"class":295},"wss:\u002F\u002Faudio.lansonai.com\u002Fv1\u002Faudio\u002Ftranscriptions\u002Fstream?access_token=",[264,590,404],{"class":281},[264,592,593],{"class":277},"token",[264,595,596],{"class":281},"}`\n",[264,598,599,601],{"class":266,"line":362},[264,600,320],{"class":277},[264,602,434],{"class":281},[234,604,606],{"id":605},"step-3-capture-and-send-audio","Step 3: Capture and send audio",[239,608,610],{"className":258,"code":609,"language":260,"meta":248,"style":248},"const audioContext = new AudioContext({ sampleRate: 16000 });\nconst stream = await navigator.mediaDevices.getUserMedia({ audio: true });\nconst source = audioContext.createMediaStreamSource(stream);\n\n\u002F\u002F Use AudioWorklet to get PCM16LE frames\nawait audioContext.audioWorklet.addModule('pcm-processor.js');\nconst node = new AudioWorkletNode(audioContext, 'pcm-processor');\nsource.connect(node);\n\n\u002F\u002F pcm-processor.js posts PCM16LE buffers to main thread\nnode.port.onmessage = (e) => {\n  \u002F\u002F Send as binary frame\n  ws.send(e.data); \u002F\u002F ArrayBuffer of PCM16LE data\n};\n",[246,611,612,646,689,711,717,722,751,781,796,801,807,836,842,870],{"__ignoreMap":248},[264,613,614,616,619,621,623,626,628,631,634,636,640,642,644],{"class":266,"line":267},[264,615,497],{"class":304},[264,617,618],{"class":277}," audioContext ",[264,620,571],{"class":281},[264,622,574],{"class":281},[264,624,625],{"class":285}," AudioContext",[264,627,289],{"class":277},[264,629,630],{"class":281},"{",[264,632,633],{"class":348}," sampleRate",[264,635,368],{"class":281},[264,637,639],{"class":638},"sbssI"," 16000",[264,641,536],{"class":281},[264,643,320],{"class":277},[264,645,434],{"class":281},[264,647,648,650,653,655,657,660,662,665,667,670,672,674,677,679,683,685,687],{"class":266,"line":274},[264,649,497],{"class":304},[264,651,652],{"class":277}," stream ",[264,654,571],{"class":281},[264,656,342],{"class":341},[264,658,659],{"class":277}," navigator",[264,661,282],{"class":281},[264,663,664],{"class":277},"mediaDevices",[264,666,282],{"class":281},[264,668,669],{"class":285},"getUserMedia",[264,671,289],{"class":277},[264,673,630],{"class":281},[264,675,676],{"class":348}," audio",[264,678,368],{"class":281},[264,680,682],{"class":681},"sfNiH"," true",[264,684,536],{"class":281},[264,686,320],{"class":277},[264,688,434],{"class":281},[264,690,691,693,696,698,701,703,706,709],{"class":266,"line":329},[264,692,497],{"class":304},[264,694,695],{"class":277}," source ",[264,697,571],{"class":281},[264,699,700],{"class":277}," audioContext",[264,702,282],{"class":281},[264,704,705],{"class":285},"createMediaStreamSource",[264,707,708],{"class":277},"(stream)",[264,710,434],{"class":281},[264,712,713],{"class":266,"line":362},[264,714,716],{"emptyLinePlaceholder":715},true,"\n",[264,718,719],{"class":266,"line":382},[264,720,721],{"class":270},"\u002F\u002F Use AudioWorklet to get PCM16LE frames\n",[264,723,724,726,728,730,733,735,738,740,742,745,747,749],{"class":266,"line":426},[264,725,450],{"class":341},[264,727,700],{"class":277},[264,729,282],{"class":281},[264,731,732],{"class":277},"audioWorklet",[264,734,282],{"class":281},[264,736,737],{"class":285},"addModule",[264,739,289],{"class":277},[264,741,292],{"class":281},[264,743,744],{"class":295},"pcm-processor.js",[264,746,292],{"class":281},[264,748,320],{"class":277},[264,750,434],{"class":281},[264,752,753,755,758,760,762,765,768,770,772,775,777,779],{"class":266,"line":437},[264,754,497],{"class":304},[264,756,757],{"class":277}," node ",[264,759,571],{"class":281},[264,761,574],{"class":281},[264,763,764],{"class":285}," AudioWorkletNode",[264,766,767],{"class":277},"(audioContext",[264,769,301],{"class":281},[264,771,371],{"class":281},[264,773,774],{"class":295},"pcm-processor",[264,776,292],{"class":281},[264,778,320],{"class":277},[264,780,434],{"class":281},[264,782,783,786,788,791,794],{"class":266,"line":464},[264,784,785],{"class":277},"source",[264,787,282],{"class":281},[264,789,790],{"class":285},"connect",[264,792,793],{"class":277},"(node)",[264,795,434],{"class":281},[264,797,799],{"class":266,"line":798},9,[264,800,716],{"emptyLinePlaceholder":715},[264,802,804],{"class":266,"line":803},10,[264,805,806],{"class":270},"\u002F\u002F pcm-processor.js posts PCM16LE buffers to main thread\n",[264,808,810,813,815,818,820,823,825,827,830,832,834],{"class":266,"line":809},11,[264,811,812],{"class":277},"node",[264,814,282],{"class":281},[264,816,817],{"class":277},"port",[264,819,282],{"class":281},[264,821,822],{"class":285},"onmessage",[264,824,338],{"class":281},[264,826,308],{"class":281},[264,828,829],{"class":311},"e",[264,831,320],{"class":281},[264,833,323],{"class":304},[264,835,326],{"class":281},[264,837,839],{"class":266,"line":838},12,[264,840,841],{"class":270},"  \u002F\u002F Send as binary frame\n",[264,843,845,848,850,853,855,857,859,862,864,867],{"class":266,"line":844},13,[264,846,847],{"class":277},"  ws",[264,849,282],{"class":281},[264,851,852],{"class":285},"send",[264,854,289],{"class":348},[264,856,829],{"class":277},[264,858,282],{"class":281},[264,860,861],{"class":277},"data",[264,863,320],{"class":348},[264,865,866],{"class":281},";",[264,868,869],{"class":270}," \u002F\u002F ArrayBuffer of PCM16LE data\n",[264,871,873],{"class":266,"line":872},14,[264,874,875],{"class":281},"};\n",[230,877,878,879,368],{},"Minimal ",[246,880,744],{},[239,882,884],{"className":258,"code":883,"language":260,"meta":248,"style":248},"class PcmProcessor extends AudioWorkletProcessor {\n  process(inputs) {\n    const input = inputs[0][0]; \u002F\u002F mono, 16kHz\n    if (input) {\n      const pcm16 = new Int16Array(input.length);\n      for (let i = 0; i \u003C input.length; i++) {\n        const s = Math.max(-1, Math.min(1, input[i]));\n        pcm16[i] = s \u003C 0 ? s * 0x8000 : s * 0x7fff;\n      }\n      this.port.postMessage(pcm16.buffer);\n    }\n    return true;\n  }\n}\nregisterProcessor('pcm-processor', PcmProcessor);\n",[246,885,886,903,917,949,965,993,1035,1088,1131,1136,1162,1167,1176,1181,1186],{"__ignoreMap":248},[264,887,888,891,895,898,901],{"class":266,"line":267},[264,889,890],{"class":304},"class",[264,892,894],{"class":893},"sBMFI"," PcmProcessor",[264,896,897],{"class":304}," extends",[264,899,900],{"class":893}," AudioWorkletProcessor",[264,902,326],{"class":281},[264,904,905,908,910,913,915],{"class":266,"line":274},[264,906,907],{"class":348},"  process",[264,909,289],{"class":281},[264,911,912],{"class":311},"inputs",[264,914,320],{"class":281},[264,916,326],{"class":281},[264,918,919,922,925,927,930,933,936,939,941,944,946],{"class":266,"line":329},[264,920,921],{"class":304},"    const",[264,923,924],{"class":277}," input",[264,926,338],{"class":281},[264,928,929],{"class":277}," inputs",[264,931,932],{"class":348},"[",[264,934,935],{"class":638},"0",[264,937,938],{"class":348},"][",[264,940,935],{"class":638},[264,942,943],{"class":348},"]",[264,945,866],{"class":281},[264,947,948],{"class":270}," \u002F\u002F mono, 16kHz\n",[264,950,951,954,956,959,962],{"class":266,"line":362},[264,952,953],{"class":341},"    if",[264,955,308],{"class":348},[264,957,958],{"class":277},"input",[264,960,961],{"class":348},") ",[264,963,964],{"class":281},"{\n",[264,966,967,970,973,975,977,980,982,984,986,989,991],{"class":266,"line":382},[264,968,969],{"class":304},"      const",[264,971,972],{"class":277}," pcm16",[264,974,338],{"class":281},[264,976,574],{"class":281},[264,978,979],{"class":285}," Int16Array",[264,981,289],{"class":348},[264,983,958],{"class":277},[264,985,282],{"class":281},[264,987,988],{"class":277},"length",[264,990,320],{"class":348},[264,992,434],{"class":281},[264,994,995,998,1000,1003,1006,1008,1011,1013,1015,1018,1020,1022,1024,1026,1028,1031,1033],{"class":266,"line":426},[264,996,997],{"class":341},"      for",[264,999,308],{"class":348},[264,1001,1002],{"class":304},"let",[264,1004,1005],{"class":277}," i",[264,1007,338],{"class":281},[264,1009,1010],{"class":638}," 0",[264,1012,866],{"class":281},[264,1014,1005],{"class":277},[264,1016,1017],{"class":281}," \u003C",[264,1019,924],{"class":277},[264,1021,282],{"class":281},[264,1023,988],{"class":277},[264,1025,866],{"class":281},[264,1027,1005],{"class":277},[264,1029,1030],{"class":281},"++",[264,1032,961],{"class":348},[264,1034,964],{"class":281},[264,1036,1037,1040,1043,1045,1048,1050,1053,1055,1058,1061,1063,1065,1067,1070,1072,1074,1076,1078,1080,1083,1086],{"class":266,"line":437},[264,1038,1039],{"class":304},"        const",[264,1041,1042],{"class":277}," s",[264,1044,338],{"class":281},[264,1046,1047],{"class":277}," Math",[264,1049,282],{"class":281},[264,1051,1052],{"class":285},"max",[264,1054,289],{"class":348},[264,1056,1057],{"class":281},"-",[264,1059,1060],{"class":638},"1",[264,1062,301],{"class":281},[264,1064,1047],{"class":277},[264,1066,282],{"class":281},[264,1068,1069],{"class":285},"min",[264,1071,289],{"class":348},[264,1073,1060],{"class":638},[264,1075,301],{"class":281},[264,1077,924],{"class":277},[264,1079,932],{"class":348},[264,1081,1082],{"class":277},"i",[264,1084,1085],{"class":348},"]))",[264,1087,434],{"class":281},[264,1089,1090,1093,1095,1097,1100,1102,1104,1106,1108,1111,1113,1116,1119,1122,1124,1126,1129],{"class":266,"line":464},[264,1091,1092],{"class":277},"        pcm16",[264,1094,932],{"class":348},[264,1096,1082],{"class":277},[264,1098,1099],{"class":348},"] ",[264,1101,571],{"class":281},[264,1103,1042],{"class":277},[264,1105,1017],{"class":281},[264,1107,1010],{"class":638},[264,1109,1110],{"class":281}," ?",[264,1112,1042],{"class":277},[264,1114,1115],{"class":281}," *",[264,1117,1118],{"class":638}," 0x8000",[264,1120,1121],{"class":281}," :",[264,1123,1042],{"class":277},[264,1125,1115],{"class":281},[264,1127,1128],{"class":638}," 0x7fff",[264,1130,434],{"class":281},[264,1132,1133],{"class":266,"line":798},[264,1134,1135],{"class":281},"      }\n",[264,1137,1138,1141,1143,1145,1148,1150,1153,1155,1158,1160],{"class":266,"line":803},[264,1139,1140],{"class":281},"      this.",[264,1142,817],{"class":277},[264,1144,282],{"class":281},[264,1146,1147],{"class":285},"postMessage",[264,1149,289],{"class":348},[264,1151,1152],{"class":277},"pcm16",[264,1154,282],{"class":281},[264,1156,1157],{"class":277},"buffer",[264,1159,320],{"class":348},[264,1161,434],{"class":281},[264,1163,1164],{"class":266,"line":809},[264,1165,1166],{"class":281},"    }\n",[264,1168,1169,1172,1174],{"class":266,"line":838},[264,1170,1171],{"class":341},"    return",[264,1173,682],{"class":681},[264,1175,434],{"class":281},[264,1177,1178],{"class":266,"line":844},[264,1179,1180],{"class":281},"  }\n",[264,1182,1183],{"class":266,"line":872},[264,1184,1185],{"class":281},"}\n",[264,1187,1189,1192,1194,1196,1198,1200,1202,1205],{"class":266,"line":1188},15,[264,1190,1191],{"class":285},"registerProcessor",[264,1193,289],{"class":277},[264,1195,292],{"class":281},[264,1197,774],{"class":295},[264,1199,292],{"class":281},[264,1201,301],{"class":281},[264,1203,1204],{"class":277}," PcmProcessor)",[264,1206,434],{"class":281},[234,1208,1210],{"id":1209},"step-4-display-captions","Step 4: Display captions",[239,1212,1214],{"className":258,"code":1213,"language":260,"meta":248,"style":248},"ws.onmessage = (event) => {\n  const data = JSON.parse(event.data);\n  if (data.type === 'conversation.item.input_audio_transcription.completed') {\n    const div = document.getElementById('captions');\n    const p = document.createElement('p');\n    p.textContent = data.text;\n    div.appendChild(p);\n  }\n};\n",[246,1215,1216,1238,1267,1295,1325,1353,1373,1391,1395],{"__ignoreMap":248},[264,1217,1218,1221,1223,1225,1227,1229,1232,1234,1236],{"class":266,"line":267},[264,1219,1220],{"class":277},"ws",[264,1222,282],{"class":281},[264,1224,822],{"class":285},[264,1226,338],{"class":281},[264,1228,308],{"class":281},[264,1230,1231],{"class":311},"event",[264,1233,320],{"class":281},[264,1235,323],{"class":304},[264,1237,326],{"class":281},[264,1239,1240,1242,1245,1247,1250,1252,1255,1257,1259,1261,1263,1265],{"class":266,"line":274},[264,1241,332],{"class":304},[264,1243,1244],{"class":277}," data",[264,1246,338],{"class":281},[264,1248,1249],{"class":277}," JSON",[264,1251,282],{"class":281},[264,1253,1254],{"class":285},"parse",[264,1256,289],{"class":348},[264,1258,1231],{"class":277},[264,1260,282],{"class":281},[264,1262,861],{"class":277},[264,1264,320],{"class":348},[264,1266,434],{"class":281},[264,1268,1269,1272,1274,1276,1278,1281,1284,1286,1289,1291,1293],{"class":266,"line":329},[264,1270,1271],{"class":341},"  if",[264,1273,308],{"class":348},[264,1275,861],{"class":277},[264,1277,282],{"class":281},[264,1279,1280],{"class":277},"type",[264,1282,1283],{"class":281}," ===",[264,1285,371],{"class":281},[264,1287,1288],{"class":295},"conversation.item.input_audio_transcription.completed",[264,1290,292],{"class":281},[264,1292,961],{"class":348},[264,1294,964],{"class":281},[264,1296,1297,1299,1302,1304,1307,1309,1312,1314,1316,1319,1321,1323],{"class":266,"line":362},[264,1298,921],{"class":304},[264,1300,1301],{"class":277}," div",[264,1303,338],{"class":281},[264,1305,1306],{"class":277}," document",[264,1308,282],{"class":281},[264,1310,1311],{"class":285},"getElementById",[264,1313,289],{"class":348},[264,1315,292],{"class":281},[264,1317,1318],{"class":295},"captions",[264,1320,292],{"class":281},[264,1322,320],{"class":348},[264,1324,434],{"class":281},[264,1326,1327,1329,1332,1334,1336,1338,1341,1343,1345,1347,1349,1351],{"class":266,"line":382},[264,1328,921],{"class":304},[264,1330,1331],{"class":277}," p",[264,1333,338],{"class":281},[264,1335,1306],{"class":277},[264,1337,282],{"class":281},[264,1339,1340],{"class":285},"createElement",[264,1342,289],{"class":348},[264,1344,292],{"class":281},[264,1346,230],{"class":295},[264,1348,292],{"class":281},[264,1350,320],{"class":348},[264,1352,434],{"class":281},[264,1354,1355,1358,1360,1363,1365,1367,1369,1371],{"class":266,"line":426},[264,1356,1357],{"class":277},"    p",[264,1359,282],{"class":281},[264,1361,1362],{"class":277},"textContent",[264,1364,338],{"class":281},[264,1366,1244],{"class":277},[264,1368,282],{"class":281},[264,1370,244],{"class":277},[264,1372,434],{"class":281},[264,1374,1375,1378,1380,1383,1385,1387,1389],{"class":266,"line":437},[264,1376,1377],{"class":277},"    div",[264,1379,282],{"class":281},[264,1381,1382],{"class":285},"appendChild",[264,1384,289],{"class":348},[264,1386,230],{"class":277},[264,1388,320],{"class":348},[264,1390,434],{"class":281},[264,1392,1393],{"class":266,"line":464},[264,1394,1180],{"class":281},[264,1396,1397],{"class":266,"line":798},[264,1398,875],{"class":281},[234,1400,1402],{"id":1401},"browser-security","Browser security",[1404,1405,1406,1417,1424,1427],"ul",{},[1407,1408,1409,1413,1414,1416],"li",{},[1410,1411,1412],"strong",{},"Never"," put ",[246,1415,482],{}," in frontend code",[1407,1418,1419,1420,1423],{},"Always obtain ",[246,1421,1422],{},"rt_..."," tokens from your backend",[1407,1425,1426],{},"Tokens expire in 60 seconds — get a fresh one for each connection",[1407,1428,1429,1430,1433],{},"WebSocket ",[246,1431,1432],{},"?access_token"," keeps the long-lived key off the client",[234,1435,1437],{"id":1436},"related","Related",[1404,1439,1440,1446,1451],{},[1407,1441,1442,1445],{},[1443,1444,136],"a",{"href":137}," — advanced UI patterns",[1407,1447,1448,1450],{},[1443,1449,16],{"href":17}," — session token details",[1407,1452,1453,1455],{},[1443,1454,36],{"href":37}," — more examples",[1457,1458,1459],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":248,"searchDepth":267,"depth":274,"links":1461},[1462,1463,1464,1465,1466,1467,1468],{"id":236,"depth":274,"text":237},{"id":251,"depth":274,"text":252},{"id":486,"depth":274,"text":487},{"id":605,"depth":274,"text":606},{"id":1209,"depth":274,"text":1210},{"id":1401,"depth":274,"text":1402},{"id":1436,"depth":274,"text":1437},"Browser microphone → Lanson → caption UI.","md",null,{},{"title":130,"description":1469},"cPgPbb_e66Y5kr86LGwP_WGwmuHI0mM7yn9b35th8G8",[1476,1478],{"title":120,"path":121,"stem":122,"description":1477,"children":-1},"The shared processing foundation behind LansonAI's real-time voice capabilities.",{"title":132,"path":133,"stem":134,"description":1479,"children":-1},"Backend pushes an audio stream to LansonAI.",1787340796396]