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