var e=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`,t=new Int8Array(256).fill(-1);for(let n=0;n<64;n++)t[e.charCodeAt(n)]=n;function n(e){let n=e.trim();if(n.startsWith(`data:`)){let e=n.indexOf(`,`);if(e<0)return null;n=n.slice(e+1)}let r=n.length;for(;r>0&&n.charCodeAt(r-1)===61;)r--;if(n.length-r>2||n.length%4!=0)return null;let i=new Uint8Array(Math.floor(r*3/4)),a=0,o=0,s=0;for(let e=0;e=8&&(s-=8,i[a++]=o>>s&255)}return i.subarray(0,a)}var r={description:"Request defaults and limits of every server and the studio (zonos3.generation). sample_rate: the API's audio rate (Hz). sampling: the v2 sampling defaults (servers/api/openapi.yaml repeats them; model/tests/test_generation.py keeps the two equal). tag_cfg_scale: the tag-CFG scale range. silence_prefill_frames: the server default length (ZONOS3_SILENCE_PREFILL_FRAMES overrides it) and the longest a request may ask for. decode_context_frames: the reference tail decoded ahead of the stream when a request leaves decode_context_frames unset or 0. reference_max_frames: the reference prefix of the GGUF servers (60 s at the dual codec's 2940-sample hop; longer reference codes keep their first frames). max_frames: the GGUF servers' default frame budget (--max). audio_max_seconds: the longest reference clip, upload and speech-edit clip. stream_codebooks: the prefix stream's early partial-frame decode defaults (request fields stream_codebooks / stream_codebooks_scope): a frame is decoded once its first `default` codebooks arrived, for the `scope` chunks (first: the first chunk only; all: every chunk); default = n_codebooks decodes complete frames only. output_limit_dbfs: the knee k of the soft limiter every server applies after the decoder's output gain: samples at or below it pass unchanged, louder ones bend smoothly into full scale, sign(x) (k + (1 - k) tanh((|x| - k) / (1 - k))).",sample_rate:44100,sampling:{temperature:.75,topk:80,top_p:.69,min_p:0,repetition_penalty:2.4,repetition_window:96,repetition_codebooks:6},tag_cfg_scale:{min:1,max:4},silence_prefill_frames:{default:3,max:30},decode_context_frames:30,reference_max_frames:900,max_frames:2e3,audio_max_seconds:{reference:60,upload:600,edit:150},stream_codebooks:{default:1,scope:`first`},output_limit_dbfs:-1},i=r.sample_rate;Object.freeze({...r.sampling}),r.tag_cfg_scale.min,r.tag_cfg_scale.max,r.silence_prefill_frames.default,r.silence_prefill_frames.max,r.decode_context_frames,r.reference_max_frames;var a=r.max_frames;r.stream_codebooks.default,r.stream_codebooks.scope,a+4096;var o=r.audio_max_seconds.reference,s=r.audio_max_seconds.edit;r.output_limit_dbfs;function c(){let e=typeof location>`u`?void 0:location,t=e?new URLSearchParams(e.search).get(`models`):null;return t?t.endsWith(`/`)?t:t+`/`:new URL(`/models/`,e?.origin??`http://localhost/`).href}async function l(e){let t=await fetch(e);if(!t.ok)throw Error(`failed to fetch ${e}: ${t.status}`);return t.json()}var u=new Worker(new URL(new URL(`worker.js`,import.meta.url).href,``+import.meta.url),{type:`module`}),d={"/v2/speakers":{field:`speaker_audio_base64`,maxSeconds:o},"/v2/generate":{field:`speaker_audio_base64`,maxSeconds:o},"/v1/audio/speech":{field:`speaker_audio_base64`,maxSeconds:o},"/v2/edit":{field:`audio_base64`,maxSeconds:s},"/v2/edit/align":{field:`audio_base64`,maxSeconds:s}},f=new Worker(new URL(new URL(`codec-worker.js`,import.meta.url).href,``+import.meta.url),{type:`module`}),p=new Map,m=1,h=!1,g=null,_=null,v=null,y=null,b=[],x=[],S=(e,t=[])=>u.postMessage(e,t);u.onmessage=e=>{let t=e.data;switch(t.type){case`progress`:{let{type:e,...n}=t;if(!h)y?.(n);else for(let e of x)e(n);break}case`ready`:h=!0,_?.();break;case`fatal`:if(!h)v?.(Error(t.message));else for(let e of b)e(t.message);break;case`res`:{let e=p.get(t.id);if(!e)break;let n=new ReadableStream({start:t=>{e.controller=t}});e.resolve(new Response(n,{status:t.status,headers:t.headers}));break}case`chunk`:p.get(t.id)?.controller?.enqueue(new Uint8Array(t.data));break;case`end`:p.get(t.id)?.controller?.close(),p.delete(t.id)}},u.onerror=e=>{let t=e.message||`engine worker failed to start`;if(!h)v?.(Error(t));else for(let e of b)e(t)},f.onerror=e=>{let t=`codec worker failed: `+(e.message||`did not start`);if(!h)v?.(Error(t));else for(let e of b)e(t)};async function C(e,t=o){let n=await new OfflineAudioContext(1,1,i).decodeAudioData(e),r=Math.min(Math.ceil(n.duration*i),t*i);if(r<=0)return{pcm:new Float32Array,seconds:n.duration};let a=new OfflineAudioContext(1,r,i),s=a.createBufferSource();return s.buffer=n,s.connect(a.destination),s.start(),{pcm:(await a.startRendering()).getChannelData(0).slice(0,r),seconds:n.duration}}async function w(e){let t=new URL(`voices/`,e).href,n=await l(t+`voices.json`),r={};return await Promise.all(n.map(async e=>{try{let n=await fetch(new URL(e.file,t).href);n.ok&&(r[e.id]=(await C(await n.arrayBuffer())).pcm)}catch(t){console.warn(`zonos3-web: default voice ${e.file} did not decode`,t)}})),r}var T={init(e,t={}){return y=e,g??=(async()=>{if(!(`gpu`in navigator)||!navigator.gpu)throw Error(`WebGPU is not available in this browser`);let e=t.base??c(),n=await w(e),r=Promise.withResolvers();_=r.resolve,v=r.reject;let i=new MessageChannel;f.postMessage({type:`port`},[i.port2]),S({type:`init`,base:e,cache:t.cache??!0,voicesPcm:n,codecPort:i.port1},[...Object.values(n).map(e=>e.buffer),i.port1]),await r.promise})().catch(e=>{throw g=null,e}),g},onFatal(e){b.push(e)},onEncoderProgress(e){x.push(e)}};async function E(e,t){if(!e)return;let r;try{r=JSON.parse(new TextDecoder().decode(e))}catch{return}if(!r||typeof r!=`object`||!(t.field in r))return;let i=Reflect.get(r,t.field);if(typeof i!=`string`||!i.trim())return;let a=n(i);if(a)try{let e=await C(a.slice().buffer,t.maxSeconds);return e.pcm.length?e:void 0}catch{return}}async function D(e,t){let n=e instanceof Request?e:null,r=new URL(n?n.url:String(e),location.href),i=r.pathname+r.search,a=(t?.method??n?.method??`GET`).toUpperCase(),o={};new Headers(t?.headers??n?.headers).forEach((e,t)=>{o[t.toLowerCase()]=e});let s=null;t?.body!==void 0&&t.body!==null?s=await new Response(t.body).arrayBuffer():n&&a!==`GET`&&a!==`HEAD`&&(s=await n.arrayBuffer()),s&&s.byteLength===0&&(s=null);let c=a===`POST`?d[r.pathname]:void 0,l=c?await E(s,c):void 0,u=t?.signal??n?.signal??null,f=m++,{promise:h,resolve:g,reject:_}=Promise.withResolvers(),v={resolve:g,reject:_};if(p.set(f,v),u){let e=()=>{S({type:`abort`,id:f});let e=new DOMException(`The operation was aborted.`,`AbortError`);if(v.controller)try{v.controller.error(e)}catch{}else _(e);p.delete(f)};if(u.aborted)return e(),h;u.addEventListener(`abort`,e,{once:!0})}let y=[];return s&&y.push(s),l&&y.push(l.pcm.buffer),S({type:`req`,id:f,method:a,path:i,headers:o,body:s,pcm:l?.pcm,pcmSeconds:l?.seconds},y),h}export{C as decodeTo44k,T as engine,D as localFetch};