UNPKG

assemblyai

Version:

The AssemblyAI JavaScript SDK provides an easy-to-use interface for interacting with the AssemblyAI API, which supports async and real-time transcription, as well as the latest LeMUR models.

2 lines (1 loc) 42.6 kB
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).assemblyai={})}(this,(function(e){"use strict";const t="universal-3-5-pro";class n extends Error{constructor(e="DualChannelCapture requires a browser environment (AudioContext is undefined)."){super(e),this.name="BrowserOnlyError"}}function s(e,t){var n={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&t.indexOf(s)<0&&(n[s]=e[s]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(s=Object.getOwnPropertySymbols(e);i<s.length;i++)t.indexOf(s[i])<0&&Object.prototype.propertyIsEnumerable.call(e,s[i])&&(n[s[i]]=e[s[i]])}return n}function i(e,t,n,s){return new(n||(n=Promise))((function(i,r){function o(e){try{l(s.next(e))}catch(e){r(e)}}function a(e){try{l(s.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,a)}l((s=s.apply(e,t||[])).next())}))}function r(e){var t="function"==typeof Symbol&&Symbol.iterator,n=t&&e[t],s=0;if(n)return n.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&s>=e.length&&(e=void 0),{value:e&&e[s++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function o(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,n=e[Symbol.asyncIterator];return n?n.call(e):(e=r(e),t={},s("next"),s("throw"),s("return"),t[Symbol.asyncIterator]=function(){return this},t);function s(n){t[n]=e[n]&&function(t){return new Promise((function(s,i){(function(e,t,n,s){Promise.resolve(s).then((function(t){e({value:t,done:n})}),t)})(s,i,(t=e[n](t)).done,t.value)}))}}}"function"==typeof SuppressedError&&SuppressedError;const a=function(e){return i(this,void 0,void 0,(function*(){throw new Error("Interacting with the file system is not supported in this environment.")}))},l={cache:"no-store"};let c="";"undefined"!=typeof navigator&&navigator.userAgent&&(c+=navigator.userAgent);const h={sdk:{name:"JavaScript",version:"4.36.4"}};"undefined"!=typeof process&&(process.versions.node&&-1===c.indexOf("Node")&&(h.runtime_env={name:"Node",version:process.versions.node}),process.versions.bun&&-1===c.indexOf("Bun")&&(h.runtime_env={name:"Bun",version:process.versions.bun})),"undefined"!=typeof Deno&&process.versions.bun&&-1===c.indexOf("Deno")&&(h.runtime_env={name:"Deno",version:Deno.version.deno});class d{constructor(e){var t;this.params=e,!1===e.userAgent?this.userAgent=void 0:this.userAgent=(t=e.userAgent||{},c+(!1===t?"":" AssemblyAI/1.0 ("+Object.entries(Object.assign(Object.assign({},h),t)).map((([e,t])=>t?`${e}=${t.name}/${t.version}`:"")).join(" ")+")"))}fetchResponse(e,t){return i(this,void 0,void 0,(function*(){t=Object.assign(Object.assign({},l),t);let n={Authorization:this.params.apiKey};return t.body instanceof FormData||(n["Content-Type"]="application/json"),(null==l?void 0:l.headers)&&(n=Object.assign(Object.assign({},n),l.headers)),(null==t?void 0:t.headers)&&(n=Object.assign(Object.assign({},n),t.headers)),this.userAgent&&(n["User-Agent"]=this.userAgent,"undefined"!=typeof window&&"chrome"in window&&(n["AssemblyAI-Agent"]=this.userAgent)),t.headers=n,e.startsWith("http")||(e=this.params.baseUrl+e),yield fetch(e,t)}))}fetch(e,t){return i(this,void 0,void 0,(function*(){const n=yield this.fetchResponse(e,t);if(n.status>=400){let e;const t=yield n.text();if(t){try{e=JSON.parse(t)}catch(e){}if(null==e?void 0:e.error)throw new Error(e.error);throw new Error(t)}throw new Error(`HTTP Error: ${n.status} ${n.statusText}`)}return n}))}fetchJson(e,t){return i(this,void 0,void 0,(function*(){return(yield this.fetch(e,t)).json()}))}}class u extends Error{constructor(e,t,n,s){super(e),this.status=t,this.errorCode=n,this.retryAfter=s,this.name="SyncTranscriptError"}}function m(e){return e.startsWith("http")||e.startsWith("https")||e.startsWith("data:")?null:e.startsWith("file://")?e.substring(7):e.startsWith("file:")?e.substring(5):e}const p="X-AAI-Model",f=4096,v=2048,y=100,g=4096,w=[".pcm",".raw"];class b extends d{constructor(e){super(e)}transcribe(e){return i(this,arguments,void 0,(function*(e,n={},s={}){var r,l;const{bytes:c,filename:h,contentType:d}=yield function(e,t){return i(this,void 0,void 0,(function*(){var n;let s,r,l="";if("string"==typeof e){if(/^https?:\/\//i.test(e))throw new Error("SyncTranscriber does not accept URLs. Pass a local file path or audio bytes, or use client.transcripts for URL/async transcription.");if(e.startsWith("data:"))s=function(e){const t=e.split(",")[1],n=atob(t),s=new Uint8Array(n.length);for(let e=0;e<n.length;e++)s[e]=n.charCodeAt(e);return s}(e);else{const t=null!==(n=m(e))&&void 0!==n?n:e;s=yield _(yield a()),r=S(t),l=k(r)}}else if(e instanceof Uint8Array)s=e;else if(e instanceof ArrayBuffer)s=new Uint8Array(e);else if(e instanceof Blob){s=new Uint8Array(yield e.arrayBuffer());const t=e.name;t&&(r=S(t),l=k(r))}else if(function(e){return"function"==typeof(null==e?void 0:e.getReader)}(e))s=yield _(e);else{if(!function(e){return"function"==typeof(null==e?void 0:e[Symbol.asyncIterator])}(e))throw new TypeError("unsupported audio input type");{s=yield function(e){return i(this,void 0,void 0,(function*(){var t,n,s,i,r,a,l;const c=[];try{for(t=!0,n=o(e);!(i=(s=yield n.next()).done);t=!0){l=s.value,t=!1;const e=l;c.push(e)}}catch(e){r={error:e}}finally{try{t||i||!(a=n.return)||(yield a.call(n))}finally{if(r)throw r.error}}return T(c)}))}(e);const t=e.path;"string"==typeof t&&(r=S(t),l=k(r))}}const c=void 0!==t.sample_rate||void 0!==t.channels,h=w.includes(l)||c;if(h&&(void 0===t.sample_rate||void 0===t.channels))throw new Error("raw PCM audio requires both sample_rate and channels in the config");return r||(r=h?"audio.pcm":"audio.wav"),{bytes:s,filename:r,contentType:h?"audio/pcm":"audio/wav"}}))}(e,n),b=new FormData;b.append("audio",new Blob([c],{type:d}),h);const A=function(e){if(void 0!==e.prompt&&e.prompt.length>f)throw new Error(`prompt exceeds 4096 characters (got ${e.prompt.length})`);const t={};void 0!==e.prompt&&(t.prompt=e.prompt);const n=function(e){if(!e)return;const t=e.map((e=>e.trim())).filter((e=>e.length>0)),n=t.reduce(((e,t)=>e+t.length),0);if(n>v)throw new Error(`keyterms_prompt exceeds ${v} characters (got ${n})`);return t.length>0?t:void 0}(e.keyterms_prompt);n&&(t.keyterms_prompt=n);const s=function(e){if(void 0===e)return;let t=("string"==typeof e?[e]:e).map((e=>e.trim())).filter((e=>e.length>0)),n=t.reduce(((e,t)=>e+t.length),0);for(;t.length>0&&(t.length>y||n>g);)n-=t[0].length,t=t.slice(1);return t.length>0?t:void 0}(e.conversation_context);s&&(t.conversation_context=s);void 0!==e.language_codes&&(t.language_codes=e.language_codes);void 0!==e.sample_rate&&(t.sample_rate=e.sample_rate);void 0!==e.channels&&(t.channels=e.channels);void 0!==e.timestamps&&(t.timestamps=e.timestamps);return Object.keys(t).length>0?t:void 0}(n);A&&b.append("config",new Blob([JSON.stringify(A)],{type:"application/json"}));const P=yield this.fetchResponse("/v1/transcribe",{method:"POST",body:b,headers:{[p]:null!==(r=n.model)&&void 0!==r?r:t},signal:AbortSignal.timeout(null!==(l=s.timeout)&&void 0!==l?l:6e4)});if(200!==P.status)throw yield function(e){return i(this,void 0,void 0,(function*(){let t,n;const s=yield e.text();try{const e=JSON.parse(s);e&&"object"==typeof e&&!Array.isArray(e)&&("string"==typeof e.error_code&&(t=e.error_code),void 0===t&&"string"==typeof e.title&&(t=e.title.toLowerCase().replace(/ /g,"_")),"string"==typeof e.detail?n=e.detail:"string"==typeof e.message&&(n=e.message))}catch(e){s&&(n=s)}n||(n=`sync transcription failed with status ${e.status}`);const i=e.headers.get("retry-after"),r=i&&/^\d+$/.test(i)?parseInt(i,10):void 0;return new u(n,e.status,t,r)}))}(P);return yield P.json()}))}warm(e){return i(this,void 0,void 0,(function*(){var n;try{return yield this.fetchResponse("/v1/warm",{method:"GET",headers:{[p]:null!==(n=null==e?void 0:e.model)&&void 0!==n?n:t},signal:AbortSignal.timeout(1e4)}),!0}catch(e){return!1}}))}}function S(e){var t;return null!==(t=e.split(/[\\/]/).pop())&&void 0!==t?t:e}function k(e){const t=e.lastIndexOf(".");return t>0?e.slice(t).toLowerCase():""}function _(e){return i(this,void 0,void 0,(function*(){const t=[],n=e.getReader();for(;;){const{done:e,value:s}=yield n.read();if(e)break;t.push(s)}return T(t)}))}function T(e){const t=e.reduce(((e,t)=>e+t.length),0),n=new Uint8Array(t);let s=0;for(const t of e)n.set(t,s),s+=t.length;return n}const A={[4e3]:"Sample rate must be a positive integer",[4001]:"Not Authorized",[4002]:"Insufficient funds",[4003]:"This feature is paid-only and requires you to add a credit card. Please visit https://app.assemblyai.com/ to add a credit card to your account.",[4004]:"Session ID does not exist",[4008]:"Session has expired",[4010]:"Session is closed",[4029]:"Rate limited",[4030]:"Unique session violation",[4031]:"Session Timeout",[4032]:"Audio too short",[4033]:"Audio too long",[4034]:"Audio too small to transcode",[4100]:"Bad JSON",[4101]:"Bad schema",[4102]:"Too many streams",[4103]:"This session has been reconnected. This WebSocket is no longer valid.",[1013]:"Reconnect attempts exhausted",[4104]:"Could not parse word boost parameter"};class P extends Error{}const x=4e3,O=4001,R=4002,E=4003,U=4101,C={[3005]:"Server error",[3006]:"Input validation error",[3007]:"Audio chunk duration violation",[3008]:"Session expired: maximum session duration exceeded",[3009]:"Too many concurrent sessions",[x]:"Sample rate must be a positive integer",[O]:"Not Authorized",[R]:"Insufficient funds",[E]:"This feature is paid-only and requires you to add a credit card. Please visit https://app.assemblyai.com/ to add a credit card to your account.",[4004]:"Session ID does not exist",[4008]:"Session has expired",[4010]:"Session is closed",[4029]:"Rate limited",[4030]:"Unique session violation",[4031]:"Session Timeout",[4032]:"Audio too short",[4033]:"Audio too long",[4034]:"Audio too small to transcode",[U]:"Bad schema",[4102]:"Too many streams",[4103]:"This session has been reconnected. This WebSocket is no longer valid."};class M extends Error{}class I extends d{summary(e,t){return this.fetchJson("/lemur/v3/generate/summary",{method:"POST",body:JSON.stringify(e),signal:t})}questionAnswer(e,t){return this.fetchJson("/lemur/v3/generate/question-answer",{method:"POST",body:JSON.stringify(e),signal:t})}actionItems(e,t){return this.fetchJson("/lemur/v3/generate/action-items",{method:"POST",body:JSON.stringify(e),signal:t})}task(e,t){return this.fetchJson("/lemur/v3/generate/task",{method:"POST",body:JSON.stringify(e),signal:t})}getResponse(e,t){return this.fetchJson(`/lemur/v3/${e}`,{signal:t})}purgeRequestData(e,t){return this.fetchJson(`/lemur/v3/${e}`,{method:"DELETE",signal:t})}}const{WritableStream:W}="undefined"!=typeof window?window:"undefined"!=typeof global?global:globalThis;var B,F;const N=null!==(F=null!==(B=null!==WebSocket&&void 0!==WebSocket?WebSocket:null===global||void 0===global?void 0:global.WebSocket)&&void 0!==B?B:null===window||void 0===window?void 0:window.WebSocket)&&void 0!==F?F:null===self||void 0===self?void 0:self.WebSocket,J=(e,t)=>t?new N(e,t):new N(e),j='{"terminate_session":true}';class D{constructor(e){var t,n;if(this.listeners={},this.realtimeUrl=null!==(t=e.realtimeUrl)&&void 0!==t?t:"wss://api.assemblyai.com/v2/realtime/ws",this.sampleRate=null!==(n=e.sampleRate)&&void 0!==n?n:16e3,this.wordBoost=e.wordBoost,this.encoding=e.encoding,this.endUtteranceSilenceThreshold=e.endUtteranceSilenceThreshold,this.disablePartialTranscripts=e.disablePartialTranscripts,"token"in e&&e.token&&(this.token=e.token),"apiKey"in e&&e.apiKey&&(this.apiKey=e.apiKey),!this.token&&!this.apiKey)throw new Error("API key or temporary token is required.")}connectionUrl(){const e=new URL(this.realtimeUrl);if("wss:"!==e.protocol)throw new Error("Invalid protocol, must be wss");const t=new URLSearchParams;return this.token&&t.set("token",this.token),t.set("sample_rate",this.sampleRate.toString()),this.wordBoost&&this.wordBoost.length>0&&t.set("word_boost",JSON.stringify(this.wordBoost)),this.encoding&&t.set("encoding",this.encoding),t.set("enable_extra_session_information","true"),this.disablePartialTranscripts&&t.set("disable_partial_transcripts",this.disablePartialTranscripts.toString()),e.search=t.toString(),e}on(e,t){this.listeners[e]=t}connect(){return new Promise((e=>{if(this.socket)throw new Error("Already connected");const t=this.connectionUrl();this.token?this.socket=J(t.toString()):(console.warn("API key authentication is not supported for the RealtimeTranscriber in browser environment. Use temporary token authentication instead.\nLearn more at https://github.com/AssemblyAI/assemblyai-node-sdk/blob/main/docs/compat.md#browser-compatibility."),this.socket=J(t.toString(),{headers:{Authorization:this.apiKey}})),this.socket.binaryType="arraybuffer",this.socket.onopen=()=>{void 0!==this.endUtteranceSilenceThreshold&&null!==this.endUtteranceSilenceThreshold&&this.configureEndUtteranceSilenceThreshold(this.endUtteranceSilenceThreshold)},this.socket.onclose=({code:e,reason:t})=>{var n,s;t||e in A&&(t=A[e]),null===(s=(n=this.listeners).close)||void 0===s||s.call(n,e,t)},this.socket.onerror=e=>{var t,n,s,i;e.error?null===(n=(t=this.listeners).error)||void 0===n||n.call(t,e.error):null===(i=(s=this.listeners).error)||void 0===i||i.call(s,new Error(e.message))},this.socket.onmessage=({data:t})=>{var n,s,i,r,o,a,l,c,h,d,u,m,p,f,v;const y=JSON.parse(t.toString());if("error"in y)null===(s=(n=this.listeners).error)||void 0===s||s.call(n,new P(y.error));else switch(y.message_type){case"SessionBegins":{const t={sessionId:y.session_id,expiresAt:new Date(y.expires_at)};e(t),null===(r=(i=this.listeners).open)||void 0===r||r.call(i,t);break}case"PartialTranscript":y.created=new Date(y.created),null===(a=(o=this.listeners).transcript)||void 0===a||a.call(o,y),null===(c=(l=this.listeners)["transcript.partial"])||void 0===c||c.call(l,y);break;case"FinalTranscript":y.created=new Date(y.created),null===(d=(h=this.listeners).transcript)||void 0===d||d.call(h,y),null===(m=(u=this.listeners)["transcript.final"])||void 0===m||m.call(u,y);break;case"SessionInformation":null===(f=(p=this.listeners).session_information)||void 0===f||f.call(p,y);break;case"SessionTerminated":null===(v=this.sessionTerminatedResolve)||void 0===v||v.call(this)}}}))}sendAudio(e){this.send(e)}stream(){return new W({write:e=>{this.sendAudio(e)}})}forceEndUtterance(){this.send('{"force_end_utterance":true}')}configureEndUtteranceSilenceThreshold(e){this.send(`{"end_utterance_silence_threshold":${e}}`)}send(e){if(!this.socket||this.socket.readyState!==this.socket.OPEN)throw new Error("Socket is not open for communication");this.socket.send(e)}close(){return i(this,arguments,void 0,(function*(e=!0){var t;if(this.socket){if(this.socket.readyState===this.socket.OPEN)if(e){const e=new Promise((e=>{this.sessionTerminatedResolve=e}));this.socket.send(j),yield e}else this.socket.send(j);(null===(t=this.socket)||void 0===t?void 0:t.removeAllListeners)&&this.socket.removeAllListeners(),this.socket.close()}this.listeners={},this.socket=void 0}))}}class L extends d{constructor(e){super(e),this.rtFactoryParams=e}createService(e){return this.transcriber(e)}transcriber(e){const t=Object.assign({},e);return t.token||t.apiKey||(t.apiKey=this.rtFactoryParams.apiKey),new D(t)}createTemporaryToken(e){return i(this,void 0,void 0,(function*(){return(yield this.fetchJson("/v2/realtime/token",{method:"POST",body:JSON.stringify(e)})).token}))}}class $ extends d{constructor(e,t){super(e),this.files=t}transcribe(e,t){return i(this,void 0,void 0,(function*(){const n=yield this.submit(e);return yield this.waitUntilReady(n.id,t)}))}submit(e){return i(this,void 0,void 0,(function*(){let t,n;if("audio"in e){const{audio:i}=e,r=s(e,["audio"]);if("string"==typeof i){const e=m(i);t=null!==e?yield this.files.upload(e):i.startsWith("data:")?yield this.files.upload(i):i}else t=yield this.files.upload(i);n=Object.assign(Object.assign({},r),{audio_url:t})}else n=e;return yield this.fetchJson("/v2/transcript",{method:"POST",body:JSON.stringify(n)})}))}create(e,t){return i(this,void 0,void 0,(function*(){var n;const s=m(e.audio_url);if(null!==s){const t=yield this.files.upload(s);e.audio_url=t}const i=yield this.fetchJson("/v2/transcript",{method:"POST",body:JSON.stringify(e)});return null===(n=null==t?void 0:t.poll)||void 0===n||n?yield this.waitUntilReady(i.id,t):i}))}waitUntilReady(e,t){return i(this,void 0,void 0,(function*(){var n,s;const i=null!==(n=null==t?void 0:t.pollingInterval)&&void 0!==n?n:3e3,r=null!==(s=null==t?void 0:t.pollingTimeout)&&void 0!==s?s:-1,o=Date.now();for(;;){const t=yield this.get(e);if("completed"===t.status||"error"===t.status)return t;if(r>0&&Date.now()-o>r)throw new Error("Polling timeout");yield new Promise((e=>setTimeout(e,i)))}}))}get(e){return this.fetchJson(`/v2/transcript/${e}`)}list(e){return i(this,void 0,void 0,(function*(){let t="/v2/transcript";"string"==typeof e?t=e:e&&(t=`${t}?${new URLSearchParams(Object.keys(e).map((t=>{var n;return[t,(null===(n=e[t])||void 0===n?void 0:n.toString())||""]})))}`);const n=yield this.fetchJson(t);for(const e of n.transcripts)e.created=new Date(e.created),e.completed&&(e.completed=new Date(e.completed));return n}))}delete(e){return this.fetchJson(`/v2/transcript/${e}`,{method:"DELETE"})}wordSearch(e,t){const n=new URLSearchParams({words:t.join(",")});return this.fetchJson(`/v2/transcript/${e}/word-search?${n.toString()}`)}sentences(e){return this.fetchJson(`/v2/transcript/${e}/sentences`)}paragraphs(e){return this.fetchJson(`/v2/transcript/${e}/paragraphs`)}subtitles(e){return i(this,arguments,void 0,(function*(e,t="srt",n){let s=`/v2/transcript/${e}/${t}`;if(n){const e=new URLSearchParams;e.set("chars_per_caption",n.toString()),s+=`?${e.toString()}`}const i=yield this.fetch(s);return yield i.text()}))}redactions(e){return this.redactedAudio(e)}redactedAudio(e){return this.fetchJson(`/v2/transcript/${e}/redacted-audio`)}redactedAudioFile(e){return i(this,void 0,void 0,(function*(){const{redacted_audio_url:t,status:n}=yield this.redactedAudio(e);if("redacted_audio_ready"!==n)throw new Error(`Redacted audio status is ${n}`);const s=yield fetch(t);if(!s.ok)throw new Error(`Failed to fetch redacted audio: ${s.statusText}`);return{arrayBuffer:s.arrayBuffer.bind(s),blob:s.blob.bind(s),body:s.body,bodyUsed:s.bodyUsed}}))}}class H extends d{upload(e){return i(this,void 0,void 0,(function*(){let t;t="string"==typeof e?e.startsWith("data:")?function(e){const t=e.split(","),n=t[0].match(/:(.*?);/)[1],s=atob(t[1]);let i=s.length;const r=new Uint8Array(i);for(;i--;)r[i]=s.charCodeAt(i);return new Blob([r],{type:n})}(e):yield a():e;return(yield this.fetchJson("/v2/upload",{method:"POST",body:t,headers:{"Content-Type":"application/octet-stream"},duplex:"half"})).upload_url}))}}class K{constructor(e={}){var t,n,s,i;this.hangoverRemaining=0,this.thresholdRatio=null!==(t=e.thresholdRatio)&&void 0!==t?t:3,this.noiseFloorAlpha=null!==(n=e.noiseFloorAlpha)&&void 0!==n?n:.05,this.hangoverFrames=null!==(s=e.hangoverFrames)&&void 0!==s?s:10,this.initialNoiseFloor=null!==(i=e.initialNoiseFloor)&&void 0!==i?i:1e-4,this.noiseFloor=this.initialNoiseFloor}process(e){let t=0;for(let n=0;n<e.length;n++)t+=e[n]*e[n];const n=e.length>0?Math.sqrt(t/e.length):0;let s=n>this.noiseFloor*this.thresholdRatio;return s?this.hangoverRemaining=this.hangoverFrames:this.hangoverRemaining>0?(this.hangoverRemaining--,s=!0):this.noiseFloor=this.noiseFloor*(1-this.noiseFloorAlpha)+n*this.noiseFloorAlpha,{active:s,energy:n}}reset(){this.noiseFloor=this.initialNoiseFloor,this.hangoverRemaining=0}}class V{constructor(e){this.windowMs=e,this.frames=[],this.head=0}pushFrame(e){this.frames.push(e);const t=e.ts-this.windowMs;for(;this.head<this.frames.length&&this.frames[this.head].ts<t;)this.head++;this.head>1024&&2*this.head>this.frames.length&&(this.frames=this.frames.slice(this.head),this.head=0)}framesInWindow(e,t){const n=[];for(let s=this.head;s<this.frames.length;s++){const i=this.frames[s];if(!(i.ts<e)){if(i.ts>t)break;n.push(i)}}return n}clear(){this.frames=[],this.head=0}}function q(e,t,n){const s=function(e){var t;const n=new Map;for(const s of e)s.active&&n.set(s.channel,(null!==(t=n.get(s.channel))&&void 0!==t?t:0)+s.rms);return n}(t.framesInWindow(e.start,e.end));if(0===s.size)return"unknown";const i=[...s.entries()].sort(((e,t)=>t[1]-e[1]));if(1===i.length)return i[0][0];const[r,o]=i[0],[a,l]=i[1];return o>=n.dominanceRatio*l||o>l?r:l>o?a:"unknown"}function z(e){var t;const n=new Map;for(const s of e){if(!s.channel||"unknown"===s.channel)continue;const e=Math.max(0,s.end-s.start);n.set(s.channel,(null!==(t=n.get(s.channel))&&void 0!==t?t:0)+e)}if(0===n.size)return"unknown";const s=[...n.entries()].sort(((e,t)=>t[1]-e[1]));if(1===s.length)return s[0][0];const[i,r]=s[0],[,o]=s[1];return r===o?"unknown":i}function G(e,t,n){for(const s of e.words)s.channel=q(s,t,n);e.channel=z(e.words)}const X='{"type":"Terminate"}',Q=new Set([x,O,R,E,U]);function Y(e){return 1e3!==e&&!Q.has(e)}class Z{constructor(e){var t,n,s,i,r,o,a,l,c;if(this.listeners={},this.isDualChannel=!1,this.vadFrameSamples=0,this.minChunkSamples=0,this.maxChunkSamples=0,this.params=Object.assign(Object.assign({},e),{websocketBaseUrl:e.websocketBaseUrl||"wss://streaming.assemblyai.com/v3/ws"}),"token"in e&&e.token&&(this.token=e.token),"apiKey"in e&&e.apiKey&&(this.apiKey=e.apiKey),!this.token&&!this.apiKey)throw new Error("API key or temporary token is required.");const h="opus"===e.encoding||"ogg_opus"===e.encoding||"aac"===e.encoding;if(void 0===e.sampleRate&&(!h||e.channels))throw new Error('`sampleRate` is required; it may only be omitted when `encoding` is "opus", "ogg_opus", or "aac" (these streams are self-describing) and dual-channel mode is not used.');if(e.channels){if(2!==e.channels.length)throw new Error("StreamingTranscriber.channels must have exactly 2 entries.");const h=e.channels.map((e=>e.name));if(new Set(h).size!==h.length)throw new Error("StreamingTranscriber.channels names must be unique.");this.isDualChannel=!0,this.channelNames=h;const d=null!==(t=e.channelAttribution)&&void 0!==t?t:{};this.attributionParams={dominanceRatio:null!==(n=d.dominanceRatio)&&void 0!==n?n:4,timelineWindowMs:null!==(s=d.timelineWindowMs)&&void 0!==s?s:3e4,createVad:null!==(i=d.createVad)&&void 0!==i?i:()=>new K,flushIntervalMs:null!==(r=d.flushIntervalMs)&&void 0!==r?r:50,resolveUnknownChannelsMethod:null!==(o=d.resolveUnknownChannelsMethod)&&void 0!==o?o:"window",resolutionWindowWords:null!==(a=d.resolutionWindowWords)&&void 0!==a?a:2,speakerHistoryMinRmsEvidence:null!==(l=d.speakerHistoryMinRmsEvidence)&&void 0!==l?l:.5,speakerHistoryDominanceRatio:null!==(c=d.speakerHistoryDominanceRatio)&&void 0!==c?c:3},"speaker-history"===this.attributionParams.resolveUnknownChannelsMethod&&(this.speakerHistory=new Map);const u=e.sampleRate;this.vadFrameSamples=Math.max(1,Math.round(.02*u)),this.minChunkSamples=Math.max(1,Math.round(.05*u)),this.maxChunkSamples=Math.max(this.minChunkSamples,Math.round(.2*u)),this.channelBuffers=new Map(h.map((e=>[e,[]]))),this.channelSamplesReceived=new Map(h.map((e=>[e,0]))),this.channelVadFloatBuffers=new Map(h.map((e=>[e,new Float32Array(this.vadFrameSamples)]))),this.channelVadBufferIdx=new Map(h.map((e=>[e,0]))),this.channelVads=new Map(h.map((e=>[e,this.attributionParams.createVad(e)]))),this.timeline=new V(this.attributionParams.timelineWindowMs)}}connectionUrl(){var e,t;const n=new URL(null!==(e=this.params.websocketBaseUrl)&&void 0!==e?e:"");if("wss:"!==n.protocol)throw new Error("Invalid protocol, must be wss");const s=new URLSearchParams;this.token&&s.set("token",this.token),void 0!==this.params.sampleRate&&s.set("sample_rate",this.params.sampleRate.toString()),this.params.endOfTurnConfidenceThreshold&&s.set("end_of_turn_confidence_threshold",this.params.endOfTurnConfidenceThreshold.toString()),void 0!==this.params.minEndOfTurnSilenceWhenConfident&&(void 0!==this.params.minTurnSilence?console.warn("[Deprecation Warning] Both `minEndOfTurnSilenceWhenConfident` and `minTurnSilence` are set. Using `minTurnSilence`; `minEndOfTurnSilenceWhenConfident` is deprecated."):console.warn("[Deprecation Warning] `minEndOfTurnSilenceWhenConfident` is deprecated and will be removed in a future release. Please use `minTurnSilence` instead."));const i=null!==(t=this.params.minTurnSilence)&&void 0!==t?t:this.params.minEndOfTurnSilenceWhenConfident;return void 0!==i&&s.set("min_turn_silence",i.toString()),this.params.maxTurnSilence&&s.set("max_turn_silence",this.params.maxTurnSilence.toString()),void 0!==this.params.vadThreshold&&s.set("vad_threshold",this.params.vadThreshold.toString()),this.params.formatTurns&&s.set("format_turns",this.params.formatTurns.toString()),void 0!==this.params.sessionHeartbeat&&s.set("session_heartbeat",this.params.sessionHeartbeat.toString()),this.params.encoding&&s.set("encoding",this.params.encoding.toString()),this.params.keytermsPrompt?s.set("keyterms_prompt",JSON.stringify(this.params.keytermsPrompt)):this.params.keyterms&&(console.warn("[Deprecation Warning] `keyterms` is deprecated and will be removed in a future release. Please use `keytermsPrompt` instead."),s.set("keyterms_prompt",JSON.stringify(this.params.keyterms))),this.params.prompt&&s.set("prompt",this.params.prompt),this.params.agentContext&&s.set("agent_context",this.params.agentContext),this.params.filterProfanity&&s.set("filter_profanity",this.params.filterProfanity.toString()),"u3-pro"===this.params.speechModel&&console.warn("[Deprecation Warning] The speech model `u3-pro` is deprecated and will be removed in a future release. Please use `u3-rt-pro` instead."),void 0!==this.params.speechModel&&s.set("speech_model",this.params.speechModel.toString()),void 0!==this.params.languageCode&&(console.warn("[Deprecation Warning] `languageCode` is deprecated and will be removed in a future release. Please use `languageCodes` instead."),s.set("language_code",this.params.languageCode)),void 0!==this.params.languageCodes&&s.set("language_codes",JSON.stringify(this.params.languageCodes)),void 0!==this.params.languageDetection&&s.set("language_detection",this.params.languageDetection.toString()),this.params.domain&&s.set("domain",this.params.domain),void 0!==this.params.inactivityTimeout&&s.set("inactivity_timeout",this.params.inactivityTimeout.toString()),void 0!==this.params.speakerLabels&&s.set("speaker_labels",this.params.speakerLabels.toString()),void 0!==this.params.maxSpeakers&&s.set("max_speakers",this.params.maxSpeakers.toString()),this.params.voiceFocus&&s.set("voice_focus",this.params.voiceFocus),void 0!==this.params.voiceFocusThreshold&&s.set("voice_focus_threshold",this.params.voiceFocusThreshold.toString()),void 0!==this.params.continuousPartials&&s.set("continuous_partials",this.params.continuousPartials.toString()),void 0!==this.params.interruptionDelay&&s.set("interruption_delay",this.params.interruptionDelay.toString()),void 0!==this.params.turnLeftPadMs&&s.set("turn_left_pad_ms",this.params.turnLeftPadMs.toString()),this.params.customerSupportAudioCapture&&(console.warn("`customerSupportAudioCapture=true` will record session audio. Only enable this when explicitly coordinating with AssemblyAI support."),s.set("_customer_support_audio_capture",this.params.customerSupportAudioCapture.toString())),this.params.webhookUrl&&s.set("webhook_url",this.params.webhookUrl),this.params.webhookAuthHeaderName&&s.set("webhook_auth_header_name",this.params.webhookAuthHeaderName),this.params.webhookAuthHeaderValue&&s.set("webhook_auth_header_value",this.params.webhookAuthHeaderValue),void 0!==this.params.includePartialTurns&&s.set("include_partial_turns",this.params.includePartialTurns.toString()),void 0!==this.params.redactPii&&s.set("redact_pii",this.params.redactPii.toString()),void 0!==this.params.redactPiiPolicies&&s.set("redact_pii_policies",JSON.stringify(this.params.redactPiiPolicies)),void 0!==this.params.redactPiiSub&&s.set("redact_pii_sub",this.params.redactPiiSub),void 0!==this.params.mode&&s.set("mode",this.params.mode),void 0!==this.params.llmGateway&&s.set("llm_gateway",JSON.stringify(this.params.llmGateway)),n.search=s.toString(),n}on(e,t){this.listeners[e]=t}connect(){return i(this,void 0,void 0,(function*(){var e,t;if(this.socket)throw new Error("Already connected");const n=null!==(e=this.params.maxConnectionRetries)&&void 0!==e?e:2,s=null!==(t=this.params.connectionRetryDelay)&&void 0!==t?t:500;let i;for(let e=0;e<=n;e++)try{return yield this.connectOnce()}catch(t){i=t;if(!(!0===t.retryable)||e===n)throw t;console.warn(`Streaming connect attempt ${e+1}/${n+1} failed (${t.message}); retrying`),s>0&&(yield new Promise((e=>setTimeout(e,s))))}throw null!=i?i:new Error("Failed to connect to streaming server")}))}connectOnce(){return new Promise(((e,t)=>{var n;const s=this.connectionUrl(),i=null!==(n=this.params.connectTimeout)&&void 0!==n?n:1e3;let r,o=!1;const a=e=>{o||(o=!0,r&&clearTimeout(r),this.discardPendingSocket(),t(e))};i>0&&(r=setTimeout((()=>{const e=new M(`Streaming connection timed out after ${i}ms`);e.retryable=!0,a(e)}),i)),this.token?this.socket=J(s.toString()):(console.warn("API key authentication is not supported for the StreamingTranscriber in browser environment. Use temporary token authentication instead.\nLearn more at https://github.com/AssemblyAI/assemblyai-node-sdk/blob/main/docs/compat.md#browser-compatibility."),this.socket=J(s.toString(),{headers:{Authorization:this.apiKey}})),this.socket.binaryType="arraybuffer",this.socket.onopen=()=>{},this.socket.onclose=({code:e,reason:t})=>{var n,s;if(t||e in C&&(t=C[e]),!o){const n=new M(t||`Streaming connection closed (code=${e})`);return n.code=e,n.retryable=Y(e),void a(n)}this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=void 0),null===(s=(n=this.listeners).close)||void 0===s||s.call(n,e,t)},this.socket.onerror=e=>{var t,n,s;const i=null!==(t=e.error)&&void 0!==t?t:new Error(e.message);if(!o)return i.retryable=!0,void a(i);null===(s=(n=this.listeners).error)||void 0===s||s.call(n,i)},this.socket.onmessage=({data:t})=>{var n,s,i,l,c,h,d,u,m,p,f,v,y,g,w,b,S;const k=JSON.parse(t.toString());if("error"in k){const e=new M(k.error);if("error_code"in k&&(e.code=k.error_code),!o){const t=e;return t.retryable=void 0===e.code||Y(e.code),void a(t)}null===(s=(n=this.listeners).error)||void 0===s||s.call(n,e)}else{switch(k.type){case"Begin":_=k,o||(o=!0,r&&clearTimeout(r),e(_)),null===(l=(i=this.listeners).open)||void 0===l||l.call(i,k);break;case"Turn":if(this.isDualChannel&&this.timeline&&this.attributionParams)switch(G(k,this.timeline,{dominanceRatio:this.attributionParams.dominanceRatio}),this.attributionParams.resolveUnknownChannelsMethod){case"window":this.resolveUnknownChannelsByWindow(k);break;case"speaker-history":this.resolveUnknownChannelsBySpeakerHistory(k)}null===(h=(c=this.listeners).turn)||void 0===h||h.call(c,k);break;case"SpeechStarted":null===(u=(d=this.listeners).speechStarted)||void 0===u||u.call(d,k);break;case"LLMGatewayResponse":null===(p=(m=this.listeners).llmGatewayResponse)||void 0===p||p.call(m,k);break;case"SpeakerRevision":null===(v=(f=this.listeners).speakerRevision)||void 0===v||v.call(f,k);break;case"Warning":{const e=k;console.warn(`Streaming warning (code=${e.warning_code}): ${e.warning}`),null===(g=(y=this.listeners).warning)||void 0===g||g.call(y,e);break}case"Heartbeat":null===(b=(w=this.listeners).heartbeat)||void 0===b||b.call(w,k);break;case"Termination":null===(S=this.sessionTerminatedResolve)||void 0===S||S.call(this)}var _}}}))}discardPendingSocket(){if(this.socket){try{this.socket.removeAllListeners&&this.socket.removeAllListeners(),this.socket.close()}catch(e){}this.socket=void 0}}stream(){return new W({write:e=>{this.sendAudio(e)}})}sendAudio(e,t){if(this.isDualChannel){if(!(null==t?void 0:t.channel))throw new Error("StreamingTranscriber is in dual-channel mode; sendAudio requires { channel }.");if(!this.channelNames.includes(t.channel))throw new Error(`Unknown channel "${t.channel}"; declared channels: ${this.channelNames.join(", ")}.`);this.ingestChannelAudio(t.channel,e)}else this.send(e)}ingestChannelAudio(e,t){var n,s;const i=function(e){if(e instanceof Int16Array)return e;if(ArrayBuffer.isView(e)){const t=e;return new Int16Array(t.buffer,t.byteOffset,Math.floor(t.byteLength/2))}return new Int16Array(e)}(t),r=this.channelBuffers.get(e),o=this.channelVadFloatBuffers.get(e);let a=this.channelVadBufferIdx.get(e),l=this.channelSamplesReceived.get(e);const c=this.channelVads.get(e),h=this.params.sampleRate,d=this.vadFrameSamples;for(let t=0;t<i.length;t++){const u=i[t];if(r.push(u),o[a++]=u/32768,l++,a===d){const t=c.process(o),i={ts:l/h*1e3,channel:e,active:t.active,rms:t.energy};this.timeline.pushFrame(i),null===(s=(n=this.listeners).vad)||void 0===s||s.call(n,i),a=0}}this.channelVadBufferIdx.set(e,a),this.channelSamplesReceived.set(e,l),this.flushTimer||this.startFlushTimer()}startFlushTimer(){this.flushTimer=setInterval((()=>this.flushMix()),this.attributionParams.flushIntervalMs)}flushMix(e=!1){var t,n;if(!this.channelNames||!this.channelBuffers)return;const s=this.channelNames.map((e=>this.channelBuffers.get(e))),i=s.length;for(;;){let r=1/0;for(const e of s)e.length<r&&(r=e.length);if(!Number.isFinite(r)||0===r)return;if(!e&&r<this.minChunkSamples)return;r>this.maxChunkSamples&&(r=this.maxChunkSamples);const o=new Int16Array(r);for(let e=0;e<r;e++){let t=0;for(let n=0;n<i;n++)t+=s[n][e];const n=Math.round(t/i);o[e]=n<-32768?-32768:n>32767?32767:n}for(const e of s)e.splice(0,r);try{this.send(o.buffer)}catch(e){return void(null===(n=(t=this.listeners).error)||void 0===n||n.call(t,e))}}}resolveUnknownChannelsByWindow(e){var t;if(!this.attributionParams)return;const n=this.attributionParams.resolutionWindowWords,s=e.words;let i=!1;for(let e=0;e<s.length;e++){if("unknown"!==s[e].channel)continue;const r=new Map,o=Math.max(0,e-n),a=Math.min(s.length-1,e+n);for(let n=o;n<=a;n++){if(n===e)continue;const i=s[n].channel;i&&"unknown"!==i&&r.set(i,(null!==(t=r.get(i))&&void 0!==t?t:0)+1)}if(0===r.size)continue;let l,c=0,h=!1;for(const[e,t]of r)t>c?(l=e,c=t,h=!1):t===c&&(h=!0);l&&!h&&(s[e].channel=l,s[e].channelResolved=!0,i=!0)}i&&(e.channel=z(s))}resolveUnknownChannelsBySpeakerHistory(e){var t;if(!this.timeline||!this.attributionParams||!this.speakerHistory)return;const n=this.attributionParams.speakerHistoryMinRmsEvidence,s=this.attributionParams.speakerHistoryDominanceRatio;for(const n of e.words){if(!n.speaker)continue;const e=this.timeline.framesInWindow(n.start,n.end);let s=this.speakerHistory.get(n.speaker);s||(s=new Map,this.speakerHistory.set(n.speaker,s));for(const n of e)n.active&&s.set(n.channel,(null!==(t=s.get(n.channel))&&void 0!==t?t:0)+n.rms)}let i=!1;for(const t of e.words){if("unknown"!==t.channel||!t.speaker)continue;const e=this.speakerHistory.get(t.speaker);if(!e||0===e.size)continue;let r,o=0,a=0,l=0;for(const[t,n]of e)o+=n,n>a?(l=a,a=n,r=t):n>l&&(l=n);o<n||(l>0&&a<s*l||r&&(t.channel=r,t.channelResolved=!0,i=!0))}i&&(e.channel=z(e.words))}updateConfiguration(e){const{min_end_of_turn_silence_when_confident:t,min_turn_silence:n}=e,i=s(e,["min_end_of_turn_silence_when_confident","min_turn_silence"]);void 0!==t&&(void 0!==n?console.warn("[Deprecation Warning] Both `min_end_of_turn_silence_when_confident` and `min_turn_silence` are set. Using `min_turn_silence`; `min_end_of_turn_silence_when_confident` is deprecated."):console.warn("[Deprecation Warning] `min_end_of_turn_silence_when_confident` is deprecated and will be removed in a future release. Please use `min_turn_silence` instead."));const r=null!=n?n:t,o=Object.assign(Object.assign({type:"UpdateConfiguration"},i),void 0!==r?{min_turn_silence:r}:{});this.send(JSON.stringify(o))}forceEndpoint(){this.send(JSON.stringify({type:"ForceEndpoint"}))}keepAlive(){this.send(JSON.stringify({type:"KeepAlive"}))}send(e){if(!this.socket||this.socket.readyState!==this.socket.OPEN)throw new Error("Socket is not open for communication");this.socket.send(e)}close(){return i(this,arguments,void 0,(function*(e=!0){var t;if(this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=void 0,this.flushMix(!0)),this.socket){if(this.socket.readyState===this.socket.OPEN)if(e){const e=new Promise((e=>{this.sessionTerminatedResolve=e}));this.socket.send(X),yield e}else this.socket.send(X);(null===(t=this.socket)||void 0===t?void 0:t.removeAllListeners)&&this.socket.removeAllListeners(),this.socket.close()}this.listeners={},this.socket=void 0}))}}class ee extends d{constructor(e){super(e),this.baseServiceParams=e}transcriber(e){const t=Object.assign({},e);return t.token||t.apiKey||(t.apiKey=this.baseServiceParams.apiKey),new Z(t)}createTemporaryToken(e){return i(this,void 0,void 0,(function*(){const t=new URLSearchParams;Object.entries(e).forEach((([e,n])=>{null!=n&&t.append(e,String(n))}));const n=t.toString(),s=n?`/v3/token?${n}`:"/v3/token";return(yield this.fetchJson(s,{method:"GET"})).token}))}}e.AssemblyAI=class{constructor(e){e.baseUrl=e.baseUrl||"https://api.assemblyai.com",e.baseUrl&&e.baseUrl.endsWith("/")&&(e.baseUrl=e.baseUrl.slice(0,-1)),this.files=new H(e),this.transcripts=new $(e,this.files),this.lemur=new I(e),this.realtime=new L(e),this.streaming=new ee(Object.assign(Object.assign({},e),{baseUrl:e.streamingBaseUrl||"https://streaming.assemblyai.com"}));let t=e.syncBaseUrl||"https://sync.assemblyai.com";t.endsWith("/")&&(t=t.slice(0,-1)),this.sync=new b(Object.assign(Object.assign({},e),{baseUrl:t}))}},e.BrowserOnlyError=n,e.DualChannelCapture=class{constructor(e){var t;if(this.running=!1,void 0===globalThis.AudioContext)throw new n;this.params={micStream:e.micStream,systemStream:e.systemStream,transcriber:e.transcriber,targetSampleRate:null!==(t=e.targetSampleRate)&&void 0!==t?t:16e3}}on(e,t){"error"===e&&(this.errorListener=t)}start(){return i(this,void 0,void 0,(function*(){if(this.running)throw new Error("DualChannelCapture already started");this.context=new AudioContext;const e=new Blob(['\nclass Pcm16EncoderProcessor extends AudioWorkletProcessor {\n constructor(options) {\n super();\n const opts = (options && options.processorOptions) || {};\n this.targetRate = opts.targetRate || 16000;\n this.chunkMs = opts.chunkMs || 50;\n this.ratio = sampleRate / this.targetRate;\n this.chunkSize = Math.round(this.targetRate * this.chunkMs / 1000);\n this.buffer = new Int16Array(this.chunkSize);\n this.bufferIdx = 0;\n this.samplesSent = 0;\n this.lastSample = 0;\n this.fractional = 0;\n }\n\n process(inputs) {\n const input = inputs[0];\n if (!input || input.length === 0 || !input[0] || input[0].length === 0) {\n return true;\n }\n const mono = input[0];\n let pos = this.fractional;\n while (pos < mono.length) {\n const i = Math.floor(pos);\n const frac = pos - i;\n const a = i === 0 ? this.lastSample : mono[i - 1];\n const b = mono[i];\n const sample = a + (b - a) * frac;\n const clamped = sample < -1 ? -1 : sample > 1 ? 1 : sample;\n this.buffer[this.bufferIdx++] = clamped < 0 ? clamped * 0x8000 : clamped * 0x7fff;\n if (this.bufferIdx === this.chunkSize) {\n const out = new Int16Array(this.chunkSize);\n out.set(this.buffer);\n this.samplesSent += this.chunkSize;\n this.port.postMessage(\n { pcm: out.buffer, samplesSent: this.samplesSent },\n [out.buffer],\n );\n this.bufferIdx = 0;\n }\n pos += this.ratio;\n }\n this.lastSample = mono[mono.length - 1];\n this.fractional = pos - mono.length;\n return true;\n }\n}\nregisterProcessor("aai-pcm16-encoder", Pcm16EncoderProcessor);\n'],{type:"application/javascript"}),t=URL.createObjectURL(e);try{yield this.context.audioWorklet.addModule(t)}finally{URL.revokeObjectURL(t)}this.micSource=this.context.createMediaStreamSource(this.params.micStream),this.sysSource=this.context.createMediaStreamSource(this.params.systemStream),this.micEncoder=this.makeEncoder("mic"),this.sysEncoder=this.makeEncoder("system"),this.micSource.connect(this.micEncoder),this.sysSource.connect(this.sysEncoder),this.running=!0}))}makeEncoder(e){const t=new AudioWorkletNode(this.context,"aai-pcm16-encoder",{numberOfInputs:1,numberOfOutputs:0,channelCount:1,channelCountMode:"explicit",channelInterpretation:"speakers",processorOptions:{targetRate:this.params.targetSampleRate,chunkMs:50}});return t.port.onmessage=t=>{var n;try{this.params.transcriber.sendAudio(t.data.pcm,{channel:e})}catch(e){null===(n=this.errorListener)||void 0===n||n.call(this,e)}},t}stop(){return i(this,void 0,void 0,(function*(){var e,t,n,s,i,r;if(this.running){this.running=!1;try{null===(e=this.micEncoder)||void 0===e||e.port.close(),null===(t=this.sysEncoder)||void 0===t||t.port.close(),null===(n=this.micEncoder)||void 0===n||n.disconnect(),null===(s=this.sysEncoder)||void 0===s||s.disconnect(),null===(i=this.micSource)||void 0===i||i.disconnect(),null===(r=this.sysSource)||void 0===r||r.disconnect()}catch(e){}this.context&&"closed"!==this.context.state&&(yield this.context.close()),this.context=void 0,this.micSource=void 0,this.sysSource=void 0,this.micEncoder=void 0,this.sysEncoder=void 0}}))}},e.EnergyVad=K,e.FileService=H,e.LemurService=I,e.LinearResampler=class{constructor(e,t){if(this.sourceRate=e,this.targetRate=t,this.lastSample=0,this.fractional=0,e<=0||t<=0)throw new Error("sourceRate and targetRate must be positive");this.ratio=e/t}process(e){var t;if(this.sourceRate===this.targetRate)return e;const n=new Float32Array(Math.ceil(e.length/this.ratio)+1);let s=0,i=this.fractional;for(;i<e.length;){const t=Math.floor(i),r=i-t,o=0===t?this.lastSample:e[t-1],a=e[t];n[s++]=o+(a-o)*r,i+=this.ratio}return this.lastSample=null!==(t=e[e.length-1])&&void 0!==t?t:this.lastSample,this.fractional=i-e.length,n.subarray(0,s)}reset(){this.lastSample=0,this.fractional=0}},e.RealtimeService=class extends D{},e.RealtimeServiceFactory=class extends L{},e.RealtimeTranscriber=D,e.RealtimeTranscriberFactory=L,e.StreamingTranscriber=Z,e.SyncTranscriber=b,e.SyncTranscriptError=u,e.TranscriptService=$,e.VadTimeline=V,e.attributeTurn=G,e.attributeWord=q,e.defaultSyncSpeechModel=t,e.float32ToPcm16=function(e){const t=new ArrayBuffer(2*e.length),n=new DataView(t);for(let t=0;t<e.length;t++){const s=Math.max(-1,Math.min(1,e[t]));n.setInt16(2*t,s<0?32768*s:32767*s,!0)}return t},e.rollUpTurnChannel=z}));