DJ commited on
Commit
a5bcf0a
·
1 Parent(s): 472b71c

Update script references and remove unused model cache file

Browse files
assets/{index-BRSFevle.js → index-D8qJ82kb.js} RENAMED
The diff for this file is too large to render. See raw diff
 
assets/model-cache-C6FnnOPD.js DELETED
@@ -1 +0,0 @@
1
- class c{constructor(){this.dbName="kitten-tts-cache",this.storeName="models",this.version=1,this.db=null}async init(){return this.db?this.db:new Promise((e,s)=>{const t=indexedDB.open(this.dbName,this.version);t.onerror=()=>s(t.error),t.onsuccess=()=>{this.db=t.result,e(this.db)},t.onupgradeneeded=o=>{const n=o.target.result;n.objectStoreNames.contains(this.storeName)||n.createObjectStore(this.storeName,{keyPath:"url"}).createIndex("timestamp","timestamp",{unique:!1})}})}async get(e){return await this.init(),new Promise((s,t)=>{const r=this.db.transaction([this.storeName],"readonly").objectStore(this.storeName).get(e);r.onerror=()=>t(r.error),r.onsuccess=()=>{const a=r.result;if(a)if(Date.now()-a.timestamp<6048e5){s(a.data);return}else this.delete(e);s(null)}})}async set(e,s){return await this.init(),new Promise((t,o)=>{const a=this.db.transaction([this.storeName],"readwrite").objectStore(this.storeName).put({url:e,data:s,timestamp:Date.now()});a.onerror=()=>o(a.error),a.onsuccess=()=>t()})}async delete(e){return await this.init(),new Promise((s,t)=>{const r=this.db.transaction([this.storeName],"readwrite").objectStore(this.storeName).delete(e);r.onerror=()=>t(r.error),r.onsuccess=()=>s()})}async clear(){return await this.init(),new Promise((e,s)=>{const n=this.db.transaction([this.storeName],"readwrite").objectStore(this.storeName).clear();n.onerror=()=>s(n.error),n.onsuccess=()=>e()})}}async function u(i){const e=new c,s=await e.get(i);if(s)return new Response(s);const t=await fetch(i);if(!t.ok)throw new Error(`HTTP error! status: ${t.status}`);const o=await t.arrayBuffer();return await e.set(i,o),new Response(o,{status:t.status,statusText:t.statusText,headers:t.headers})}export{u as cachedFetch,c as default};
 
 
assets/{worker-D3wn322F.js → worker-09xVWzsj.js} RENAMED
@@ -2897,4 +2897,4 @@ ${S}${Z}`+L.repeat(B)+`${S}`,N}function M(B,v,F,S){return`${v}${S}`+F.repeat(B)+
2897
  `).filter(p=>p.length>0)??[]};var e5=Object.freeze({__proto__:null,phonemize:e8}),P0={};function A5(a){if(a.includes("."))return a;if(a.includes(":")){let[b,C]=a.split(":").map(Number);return C===0?`${b} o'clock`:C<10?`${b} oh ${C}`:`${b} ${C}`}let i=parseInt(a.slice(0,4),10);if(i<1100||i%1e3<10)return a;let n=a.slice(0,2),u=parseInt(a.slice(2,4),10),p=a.endsWith("s")?"s":"";if(i%1e3>=100&&i%1e3<=999){if(u===0)return`${n} hundred${p}`;if(u<10)return`${n} oh ${u}${p}`}return`${n} ${u}${p}`}function t5(a){const i=a[0]==="$"?"dollar":"pound";if(isNaN(Number(a.slice(1))))return`${a.slice(1)} ${i}s`;if(!a.includes(".")){let b=a.slice(1)==="1"?"":"s";return`${a.slice(1)} ${i}${b}`}const[n,u]=a.slice(1).split("."),p=parseInt(u.padEnd(2,"0"),10);return`${n} ${i}${n==="1"?"":"s"} and ${p} ${a[0]==="$"?p===1?"cent":"cents":p===1?"penny":"pence"}`}function r5(a){let[i,n]=a.split(".");return`${i} point ${n.split("").join(" ")}`}const s5=new RegExp(`(\\s*[${q4=';:,.!?¡¿—…"«»“”(){}[]',q4.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}]+\\s*)+`,"g");var q4;async function $4(a,i="a",n=!0){n&&(a=function(w){return w.replace(/[‘’]/g,"'").replace(/«/g,"“").replace(/»/g,"”").replace(/[“”]/g,'"').replace(/\(/g,"«").replace(/\)/g,"»").replace(/、/g,", ").replace(/。/g,". ").replace(/!/g,"! ").replace(/,/g,", ").replace(/:/g,": ").replace(/;/g,"; ").replace(/?/g,"? ").replace(/[^\S \n]/g," ").replace(/ +/," ").replace(/(?<=\n) +(?=\n)/g,"").replace(/\bD[Rr]\.(?= [A-Z])/g,"Doctor").replace(/\b(?:Mr\.|MR\.(?= [A-Z]))/g,"Mister").replace(/\b(?:Ms\.|MS\.(?= [A-Z]))/g,"Miss").replace(/\b(?:Mrs\.|MRS\.(?= [A-Z]))/g,"Mrs").replace(/\betc\.(?! [A-Z])/gi,"etc").replace(/\b(y)eah?\b/gi,"$1e'a").replace(/\d*\.\d+|\b\d{4}s?\b|(?<!:)\b(?:[1-9]|1[0-2]):[0-5]\d\b(?!:)/g,A5).replace(/(?<=\d),(?=\d)/g,"").replace(/[$£]\d+(?:\.\d+)?(?: hundred| thousand| (?:[bm]|tr)illion)*\b|[$£]\d+\.\d\d?\b/gi,t5).replace(/\d*\.\d+/g,r5).replace(/(?<=\d)-(?=\d)/g," to ").replace(/(?<=\d)S/g," S").replace(/(?<=[BCDFGHJ-NP-TV-Z])'?s\b/g,"'S").replace(/(?<=X')S\b/g,"s").replace(/(?:[A-Za-z]\.){2,} [a-z]/g,M=>M.replace(/\./g,"-")).replace(/(?<=[A-Z])\.(?=[A-Z])/gi,"-").trim()}(a));const u=function(w,M){const E=[];let D=0;for(const B of w.matchAll(M)){const v=B[0];D<B.index&&E.push({match:!1,text:w.slice(D,B.index)}),v.length>0&&E.push({match:!0,text:v}),D=B.index+v.length}return D<w.length&&E.push({match:!1,text:w.slice(D)}),E}(a,s5),p=i==="a"?"en-us":"en";let C=(await Promise.all(u.map(async({match:w,text:M})=>w?M:(await e8(M,p)).join(" ")))).join("").replace(/kəkˈoːɹoʊ/g,"kˈoʊkəɹoʊ").replace(/kəkˈɔːɹəʊ/g,"kˈəʊkəɹəʊ").replace(/ʲ/g,"j").replace(/r/g,"ɹ").replace(/x/g,"k").replace(/ɬ/g,"l").replace(/(?<=[a-zɹː])(?=hˈʌndɹɪd)/g," ").replace(/ z(?=[;:,.!?¡¿—…"«»“” ]|$)/g,"z");return i==="a"&&(C=C.replace(/(?<=nˈaɪn)ti(?!ː)/g,"di")),C.trim()}function W2(a,i=!0){return".!?…。?!".includes(a)||i&&a===`
2898
  `}function a5(a,i){let n=i;for(;n<a.length&&!/\s/.test(a[n]);)++n;return a.substring(i,n)}const n5=new Set(["mr","mrs","ms","dr","prof","sr","jr","sgt","col","gen","rep","sen","gov","lt","maj","capt","st","mt","etc","co","inc","ltd","dept","vs","p","pg","jan","feb","mar","apr","jun","jul","aug","sep","sept","oct","nov","dec","sun","mon","tu","tue","tues","wed","th","thu","thur","thurs","fri","sat"]);function i5(a){return a=a.replace(/['’]s$/i,"").replace(/\.+$/,""),n5.has(a.toLowerCase())}const A8=new Map([[")","("],["]","["],["}","{"],["》","《"],["〉","〈"],["›","‹"],["»","«"],["〉","〈"],["」","「"],["』","『"],["〕","〔"],["】","【"]]),o5=new Set(A8.values());function l5(a,i,n,u){if(a==='"'||a==="'")return a==="'"&&n>0&&n<u.length-1&&/[A-Za-z]/.test(u[n-1])&&/[A-Za-z]/.test(u[n+1])?void 0:void(i.length&&i.at(-1)===a?i.pop():i.push(a));if(o5.has(a))return void i.push(a);const p=A8.get(a);p&&i.length&&i.at(-1)===p&&i.pop()}class em{constructor(){this._buffer="",this._sentences=[],this._resolver=null,this._closed=!1}push(...i){for(const n of i)this._buffer+=n,this._process()}close(){if(this._closed)throw new Error("Stream is already closed.");this._closed=!0,this.flush()}flush(){const i=this._buffer.trim();i.length>0&&this._sentences.push(i),this._buffer="",this._resolve()}_resolve(){this._resolver&&(this._resolver(),this._resolver=null)}_process(){let i=0;const n=this._buffer,u=n.length;let p=0,b=[];const C=w=>{let M=w;for(;M+1<u&&W2(n[M+1],!1);)++M;for(;M+1<u&&(E=n[M+1],`"')]}」』`.includes(E));)++M;var E;let D=M+1;for(;D<u&&/\s/.test(n[D]);)++D;return{end:M,nextNonSpace:D}};for(;p<u;){const w=n[p];if(l5(w,b,p,n),b.length===0&&W2(w)){const M=n.slice(i,p);if(/(^|\n)\d+$/.test(M)){++p;continue}const{end:E,nextNonSpace:D}=C(p);if(p===D-1&&w!==`
2899
  `){++p;continue}if(D===u)break;let B=p-1;for(;B>=0&&/\S/.test(n[B]);)B--;B=Math.max(i,B+1);const v=a5(n,B);if(!v){++p;continue}if((/https?[,:]\/\//.test(v)||v.includes("@"))&&!W2(v.at(-1))){p=B+v.length;continue}if(i5(v)){++p;continue}if(/^([A-Za-z]\.)+$/.test(v)&&D<u&&/[A-Z]/.test(n[D])){++p;continue}if(w==="."&&D<u&&/[a-z]/.test(n[D])){++p;continue}const F=n.substring(i,E+1).trim();if(F==="..."||F==="…"){++p;continue}F&&this._sentences.push(F),p=i=E+1}else++p}this._buffer=n.substring(i),this._sentences.length>0&&this._resolve()}async*[Symbol.asyncIterator](){if(this._resolver)throw new Error("Another iterator is already active.");for(;;)if(this._sentences.length>0)yield this._sentences.shift();else{if(this._closed)break;await new Promise(i=>{this._resolver=i})}}[Symbol.iterator](){this.flush();const i=this._sentences[Symbol.iterator]();return this._sentences=[],i}get sentences(){return this._sentences}}const jo=Object.freeze({af_heart:{name:"Heart",language:"en-us",gender:"Female",traits:"❤️",targetQuality:"A",overallGrade:"A"},af_alloy:{name:"Alloy",language:"en-us",gender:"Female",targetQuality:"B",overallGrade:"C"},af_aoede:{name:"Aoede",language:"en-us",gender:"Female",targetQuality:"B",overallGrade:"C+"},af_bella:{name:"Bella",language:"en-us",gender:"Female",traits:"🔥",targetQuality:"A",overallGrade:"A-"},af_jessica:{name:"Jessica",language:"en-us",gender:"Female",targetQuality:"C",overallGrade:"D"},af_kore:{name:"Kore",language:"en-us",gender:"Female",targetQuality:"B",overallGrade:"C+"},af_nicole:{name:"Nicole",language:"en-us",gender:"Female",traits:"🎧",targetQuality:"B",overallGrade:"B-"},af_nova:{name:"Nova",language:"en-us",gender:"Female",targetQuality:"B",overallGrade:"C"},af_river:{name:"River",language:"en-us",gender:"Female",targetQuality:"C",overallGrade:"D"},af_sarah:{name:"Sarah",language:"en-us",gender:"Female",targetQuality:"B",overallGrade:"C+"},af_sky:{name:"Sky",language:"en-us",gender:"Female",targetQuality:"B",overallGrade:"C-"},am_adam:{name:"Adam",language:"en-us",gender:"Male",targetQuality:"D",overallGrade:"F+"},am_echo:{name:"Echo",language:"en-us",gender:"Male",targetQuality:"C",overallGrade:"D"},am_eric:{name:"Eric",language:"en-us",gender:"Male",targetQuality:"C",overallGrade:"D"},am_fenrir:{name:"Fenrir",language:"en-us",gender:"Male",targetQuality:"B",overallGrade:"C+"},am_liam:{name:"Liam",language:"en-us",gender:"Male",targetQuality:"C",overallGrade:"D"},am_michael:{name:"Michael",language:"en-us",gender:"Male",targetQuality:"B",overallGrade:"C+"},am_onyx:{name:"Onyx",language:"en-us",gender:"Male",targetQuality:"C",overallGrade:"D"},am_puck:{name:"Puck",language:"en-us",gender:"Male",targetQuality:"B",overallGrade:"C+"},am_santa:{name:"Santa",language:"en-us",gender:"Male",targetQuality:"C",overallGrade:"D-"},bf_emma:{name:"Emma",language:"en-gb",gender:"Female",traits:"🚺",targetQuality:"B",overallGrade:"B-"},bf_isabella:{name:"Isabella",language:"en-gb",gender:"Female",targetQuality:"B",overallGrade:"C"},bm_george:{name:"George",language:"en-gb",gender:"Male",targetQuality:"B",overallGrade:"C"},bm_lewis:{name:"Lewis",language:"en-gb",gender:"Male",targetQuality:"C",overallGrade:"D+"},bf_alice:{name:"Alice",language:"en-gb",gender:"Female",traits:"🚺",targetQuality:"C",overallGrade:"D"},bf_lily:{name:"Lily",language:"en-gb",gender:"Female",traits:"🚺",targetQuality:"C",overallGrade:"D"},bm_daniel:{name:"Daniel",language:"en-gb",gender:"Male",traits:"🚹",targetQuality:"C",overallGrade:"D"},bm_fable:{name:"Fable",language:"en-gb",gender:"Male",traits:"🚹",targetQuality:"B",overallGrade:"C"}}),V2=new Map;async function c5(a){if(V2.has(a))return V2.get(a);const i=new Float32Array(await async function(n){if(P0&&Object.hasOwn(P0,"readFile")){const w=typeof __dirname<"u"?__dirname:import.meta.dirname,M=P0.resolve(w,`../voices/${n}.bin`),{buffer:E}=await P0.readFile(M);return E}const u=`https://huggingface.co/onnx-community/Kokoro-82M-v1.0-ONNX/resolve/main/voices/${n}.bin`;let p;try{p=await caches.open("kokoro-voices");const w=await p.match(u);if(w)return await w.arrayBuffer()}catch(w){console.warn("Unable to open cache",w)}const b=await fetch(u),C=await b.arrayBuffer();if(p)try{await p.put(u,new Response(C,{headers:b.headers}))}catch(w){console.warn("Unable to cache file",w)}return C}(a));return V2.set(a,i),i}class Rc{constructor(i,n){this.model=i,this.tokenizer=n}static async from_pretrained(i,{dtype:n="fp32",device:u=null,progress_callback:p=null}={}){const b=YI.from_pretrained(i,{progress_callback:p,dtype:n,device:u}),C=WI.from_pretrained(i,{progress_callback:p}),w=await Promise.all([b,C]);return new Rc(...w)}get voices(){return jo}list_voices(){console.table(jo)}_validate_voice(i){if(!jo.hasOwnProperty(i))throw console.error(`Voice "${i}" not found. Available voices:`),console.table(jo),new Error(`Voice "${i}" not found. Should be one of: ${Object.keys(jo).join(", ")}.`);return i.at(0)}async generate(i,{voice:n="af_heart",speed:u=1}={}){const p=this._validate_voice(n),b=await $4(i,p),{input_ids:C}=this.tokenizer(b,{truncation:!0});return this.generate_from_ids(C,{voice:n,speed:u})}async generate_from_ids(i,{voice:n="af_heart",speed:u=1}={}){const p=256*Math.min(Math.max(i.dims.at(-1)-2,0),509),b=(await c5(n)).slice(p,p+256),C={input_ids:i,style:new Y4("float32",b,[1,256]),speed:new Y4("float32",[u],[1])},{waveform:w}=await this.model(C);return new VI(w.data,24e3)}async*stream(i,{voice:n="af_heart",speed:u=1,split_pattern:p=null}={}){const b=this._validate_voice(n);let C;if(i instanceof em)C=i;else{if(typeof i!="string")throw new Error("Invalid input type. Expected string or TextSplitterStream.");{C=new em;const w=p?i.split(p).map(M=>M.trim()).filter(M=>M.length>0):[i];C.push(...w)}}for await(const w of C){const M=await $4(w,b),{input_ids:E}=this.tokenizer(M,{truncation:!0}),D=await this.generate_from_ids(E,{voice:n,speed:u});yield{text:w,phonemes:M,audio:D}}}}async function u5(){try{return!!await navigator.gpu.requestAdapter()}catch{return!1}}function t8(){const a={memory:navigator.deviceMemory||"unknown",cores:navigator.hardwareConcurrency||4,platform:navigator.platform,userAgent:navigator.userAgent,isMobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),isLowEnd:!1};return(a.memory!=="unknown"&&a.memory<=4||a.cores<=2||a.isMobile)&&(a.isLowEnd=!0),a}function d5(a){if(!a||typeof a!="string")return"";const i=/[\u{1F600}-\u{1F64F}]|[\u{1F300}-\u{1F5FF}]|[\u{1F680}-\u{1F6FF}]|[\u{1F1E0}-\u{1F1FF}]|[\u{2600}-\u{26FF}]|[\u{2700}-\u{27BF}]|[\u{1F900}-\u{1F9FF}]|[\u{1F018}-\u{1F270}]|[\u{238C}-\u{2454}]|[\u{20D0}-\u{20FF}]|[\u{FE0F}]|[\u{200D}]/gu;return a.replace(i,"").replace(/\b\/\b/," slash ").replace(/[\/\\()¯]/g,"").replace(/["“”]/g,"").replace(/\s—/g,".").replace(/\b_\b/g," ").replace(/\b-\b/g," ").replace(/[^\u0000-\u024F]/g,"").trim()}function f5(a){if(!a||typeof a!="string")return[];const i=4,n=500,u=a.split(`
2900
- `),p=[];for(const b of u){if(b.trim()==="")continue;const M=(/[.!?]$/.test(b.trim())?b:b.trim()+".").split(/(?<=[.!?])(?=\s+|$)/);let E="";for(const D of M){const B=D.trim();if(!B)continue;if(B.length>n){E&&(p.push(E),E="");const F=B.split(" ");let S="";for(const L of F){const Z=S+(S?" ":"")+L;Z.length<=n?S=Z:(S&&p.push(S),S=L)}S&&(E=S);continue}const v=E+(E?" ":"")+B;v.length>n?(E&&p.push(E),E=B):v.length<i?E=v:(E&&p.push(E),E=B)}E&&p.push(E)}return p}class r8{constructor(){this.chunks=[],this.closed=!1}chunkText(i){const n=d5(i);return f5(n)}push(i){const n=this.chunkText(i)||[i];this.chunks.push(...n)}close(){this.closed=!0}async*[Symbol.asyncIterator](){for(const i of this.chunks)yield i}}class _0{constructor(i,n){this.audio=i,this.sampling_rate=n}get length(){return this.audio.length}toBlob(){const i=this.encodeWAV(this.audio,this.sampling_rate);return new Blob([i],{type:"audio/wav"})}toDataURL(){const i=this.encodeWAV(this.audio,this.sampling_rate),n=new Uint8Array(i);let u="";for(let b=0;b<n.length;b++)u+=String.fromCharCode(n[b]);return`data:audio/wav;base64,${btoa(u)}`}encodeWAV(i,n){const u=new ArrayBuffer(44+i.length*2),p=new DataView(u);return this.writeString(p,0,"RIFF"),p.setUint32(4,36+i.length*2,!0),this.writeString(p,8,"WAVE"),this.writeString(p,12,"fmt "),p.setUint32(16,16,!0),p.setUint16(20,1,!0),p.setUint16(22,1,!0),p.setUint32(24,n,!0),p.setUint32(28,n*2,!0),p.setUint16(32,2,!0),p.setUint16(34,16,!0),this.writeString(p,36,"data"),p.setUint32(40,i.length*2,!0),this.floatTo16BitPCM(p,44,i),u}writeString(i,n,u){for(let p=0;p<u.length;p++)i.setUint8(n+p,u.charCodeAt(p))}floatTo16BitPCM(i,n,u){for(let p=0;p<u.length;p++,n+=2){const b=Math.max(-1,Math.min(1,u[p]));i.setInt16(n,b<0?b*32768:b*32767,!0)}}}let s8=class a8{constructor(i,n,u){this.voices=i||[],this.session=n,this.voiceEmbeddings=u||{},this.wasmSession=null}static async from_pretrained(i,n={}){let u=null,p=null,b={};try{const C=["expr-voice-2-f","expr-voice-2-m","expr-voice-3-f","expr-voice-3-m","expr-voice-4-f","expr-voice-4-m","expr-voice-5-f","expr-voice-5-m"];for(const w of C){const E=/(^|-)m(\b|$)/i.test(w)?"Male":"Female",D=w.replace("expr-","").replace(/-/g," ").replace(/\b\w/g,B=>B.toUpperCase());b[w]={name:D,gender:E,language:"en-us"}}p={};try{const w=await import("./ort.bundle.min-DDx0m2em.js");w.env.wasm.wasmPaths="https://cdn.jsdelivr.net/npm/onnxruntime-web@1.22.0/dist/";let M=null;try{const E=typeof n.progress_callback=="function"?n.progress_callback:null;E&&E({status:"initiate"});const B=await fetch("https://huggingface.co/onnx-community/kitten-tts-nano-0.1-ONNX/resolve/main/onnx/model_quantized.onnx"),v=Number(B.headers.get("content-length"))||0;if(B.body&&B.body.getReader){const F=B.body.getReader(),S=[];let L=0;for(;;){const{done:z,value:Y}=await F.read();if(z)break;Y&&(S.push(Y),L+=Y.length,E&&E({status:"progress",loaded:L,total:v,progress:v?L/v*100:0}))}const Z=new Uint8Array(L);let N=0;for(const z of S)Z.set(z,N),N+=z.length;M=Z.buffer}else M=await B.arrayBuffer(),E&&E({status:"progress",loaded:M.byteLength,total:v,progress:v?M.byteLength/v*100:0})}catch{}if(n.device==="webgpu")try{u=await w.InferenceSession.create(M,{executionProviders:[{name:"webgpu",deviceType:"gpu",powerPreference:"high-performance",preferredLayout:"NCHW",context:{preferredChannelsLast:!1,enableDebugLogs:!1}},"wasm"],optimizationLevel:"basic",enableProfiling:!1})}catch{}u||(u=await w.InferenceSession.create(M,{executionProviders:[{name:"wasm",simd:!0}]})),typeof n.progress_callback=="function"&&n.progress_callback({status:"ready"})}catch{}}catch(C){console.error("Error initializing Kitten TTS:",C),Object.keys(b).length||(b={"voice-1":{name:"Express 1",gender:"Female",language:"en-us"},"voice-2":{name:"Express 2",gender:"Male",language:"en-us"},"voice-3":{name:"Express 3",gender:"Female",language:"en-us"},"voice-4":{name:"Express 4",gender:"Male",language:"en-us"},"voice-5":{name:"Express 5",gender:"Female",language:"en-gb"},"voice-6":{name:"Express 6",gender:"Male",language:"en-gb"}}),p=p||{}}return new a8(b,u,p||{})}async loadTokenizer(){if(!this.tokenizer)try{const{cachedFetch:i}=await import("./model-cache-C6FnnOPD.js"),u=await(await i("https://huggingface.co/susnato/kitten_tts/resolve/main/tokenizer.json")).json();this.vocab=u.model.vocab,this.vocabArray=[];for(const[p,b]of Object.entries(this.vocab))this.vocabArray[b]=p;this.tokenizer=u}catch(i){console.error("Error loading tokenizer:",i),this.vocab={},this.vocabArray=[]}}async textToPhonemes(i){const{phonemize:n}=await Promise.resolve().then(function(){return e5});return await n(i,"en-us")}async tokenizeText(i){return await this.loadTokenizer(),`$${await this.textToPhonemes(i)}$`.split("").map(b=>{const C=this.vocab[b];return C===void 0?0:C})}async*stream(i,n={}){const{voice:u="expr-voice-2-m",speed:p=1}=n;for await(const b of i)if(b.trim())try{if(!this.voiceEmbeddings[u])try{const C=this.mapVoiceIdToRemote(u),M=await(await fetch(`https://huggingface.co/onnx-community/kitten-tts-nano-0.1-ONNX/resolve/main/voices/${C}.bin`)).arrayBuffer(),E=new Float32Array(M);this.voiceEmbeddings[u]=[E]}catch{}if(this.session&&this.voiceEmbeddings[u])try{const C=await this.tokenizeText(b),w=new BigInt64Array(C.map(Y=>BigInt(Y))),M=new Float32Array(this.voiceEmbeddings[u][0]),E=await import("./ort.bundle.min-DDx0m2em.js"),D={input_ids:new E.Tensor("int64",w,[1,w.length]),style:new E.Tensor("float32",M,[1,M.length]),speed:new E.Tensor("float32",new Float32Array([p]),[1])};let B=await this.session.run(D),v=B.waveform,F=v.data;if(F.length>0&&isNaN(F[0])){if(!this.wasmSession){const Y=await import("./ort.bundle.min-DDx0m2em.js");this.wasmSession=await Y.InferenceSession.create("https://huggingface.co/onnx-community/kitten-tts-nano-0.1-ONNX/resolve/main/model_quantized.onnx",{executionProviders:["wasm"]})}B=await this.wasmSession.run(D),v=B.waveform,F=v.data}const S=24e3;let L=F[0],Z=F[0];for(let Y=1;Y<F.length;Y++)F[Y]<L&&(L=F[Y]),F[Y]>Z&&(Z=F[Y]);let N=new Float32Array(F);if(p!==1){const Y=Math.floor(F.length/p);N=new Float32Array(Y);for(let f=0;f<Y;f++){const k=Math.floor(f*p);N[f]=F[Math.min(k,F.length-1)]}}let z=0;for(let Y=0;Y<N.length;Y++)isNaN(N[Y])||!isFinite(N[Y])?N[Y]=0:z=Math.max(z,Math.abs(N[Y]));if(z>0){const Y=.8/z;for(let f=0;f<N.length;f++)N[f]*=Y,N[f]=Math.max(-1,Math.min(1,N[f]))}yield{text:b,audio:new _0(N,S)}}catch(C){console.error("Model inference error:",C),console.error("Error details:",C.message)}else{const w=b.split(/\s+/).filter(Boolean).length,M=Math.min(.25+w*.15,3)/Math.max(p,.1),E=Math.max(1,Math.floor(24e3*M)),D=new Float32Array(E),B=/female|f\b/i.test(String(this.voices?.[u]?.gender))?260:180;for(let v=0;v<E;v++){const F=v/24e3,S=B*(1+.05*Math.sin(2*Math.PI*2*F));D[v]=.15*Math.sin(2*Math.PI*S*F)}yield{text:b,audio:new _0(D,24e3)}}}catch(C){console.error("Error generating audio:",C),yield{text:b,audio:new _0(new Float32Array(22050),22050)}}}mapVoiceIdToRemote(i){if(/^expr-voice-\d+-(m|f)$/i.test(i))return i;const n=String(i).match(/^voice-(\d+)(?:-(m|f))?$/i);if(!n)return"expr-voice-2-f";const u=parseInt(n[1],10),p=Math.max(2,Math.min(5,isNaN(u)?2:u)),b=(n[2]||"f").toLowerCase();return`expr-voice-${p}-${b}`}};var g5=Object.freeze({__proto__:null,KittenTTS:s8,RawAudio:_0,TextSplitterStream:r8});let Jn=null,jc=!1,X0=null;const p5=s8;async function m5(a="wasm",i="q8"){const n=t8(),u=await u5(),p=a==="webgpu"&&u?"webgpu":"wasm",b=i==="fp32"?"fp32":"q8";self.postMessage({status:"device",device:p,dtype:b,systemInfo:n,highPerfMode:b==="fp32"&&p==="webgpu",model:"kokoro"}),Jn=await Rc.from_pretrained("onnx-community/Kokoro-82M-ONNX",{dtype:b,device:p,progress_callback:w=>{w.status==="progress"||w.status==="download"?self.postMessage({status:"download_progress",loaded:w.loaded,total:w.total,progress:w.progress}):w.status==="initiate"?self.postMessage({status:"loading",message:"Initializing Kokoro model..."}):w.status==="ready"&&self.postMessage({status:"loading",message:"Kokoro model ready!"})}}).catch(w=>{throw self.postMessage({status:"error",data:w.message}),w}),self.postMessage({status:"ready",voices:Jn.voices,device:p,model:"kokoro"}),jc=!0,X0="kokoro"}async function h5(){const a=t8(),i="wasm",n="q8";self.postMessage({status:"device",device:i,dtype:n,systemInfo:a,highPerfMode:!1,model:"kitten"}),self.postMessage({status:"loading",message:"Loading Kitten TTS Nano..."});try{Jn=await p5.from_pretrained("/tts-model/model_quantized.onnx",{dtype:n,device:i,progress_callback:p=>{p?.status==="progress"&&self.postMessage({status:"download_progress",loaded:p.loaded||0,total:p.total||0,progress:p.progress||0})}}),self.postMessage({status:"ready",voices:Jn.voices,device:i,model:"kitten"}),jc=!0,X0="kitten"}catch(u){console.error("Error loading Kitten TTS:",u),self.postMessage({status:"error",data:u.message})}}self.addEventListener("message",async a=>{if(a.data.type==="init"){const i=a.data.modelType||"kokoro",n=a.data.kokoroDevice||"wasm",u=a.data.kokoroDtype||"q8";jc=!1,Jn=null,X0=null;try{i==="kitten"?await h5():await m5(n,u)}catch(p){console.error("Error initializing model:",p),self.postMessage({status:"error",data:p.message})}}else if(a.data.type==="generate"&&Jn){const{text:i,voice:n,isPreview:u}=a.data;try{if(console.log(`Generating audio for text: "${i}" with voice: ${n}`),X0==="kitten"){const C=new r8;C.push(i),C.close();const w=[],M=Jn.stream(C,{voice:n});for await(const{text:Z,audio:N}of M){if(u){const z=N.toDataURL();self.postMessage({status:"complete",audioUrl:z,text:Z,isPreview:!0});return}w.push(N)}if(w.length===0)throw new Error("No audio generated");const E=w[0].sampling_rate||24e3,D=w.reduce((Z,N)=>Z+N.audio.length,0),B=new Float32Array(D);let v=0;for(const Z of w)B.set(Z.audio,v),v+=Z.audio.length;const{RawAudio:F}=await Promise.resolve().then(function(){return g5}),L=new F(B,E).toBlob();self.postMessage({status:"complete",audio:L,text:i,isPreview:!1});return}const b=(await Jn.generate(i,{voice:n})).toBlob();self.postMessage({status:"complete",audio:b,text:i,isPreview:u})}catch(p){console.error("Error generating audio:",p),self.postMessage({status:"error",data:p.message})}}});
 
2897
  `).filter(p=>p.length>0)??[]};var e5=Object.freeze({__proto__:null,phonemize:e8}),P0={};function A5(a){if(a.includes("."))return a;if(a.includes(":")){let[b,C]=a.split(":").map(Number);return C===0?`${b} o'clock`:C<10?`${b} oh ${C}`:`${b} ${C}`}let i=parseInt(a.slice(0,4),10);if(i<1100||i%1e3<10)return a;let n=a.slice(0,2),u=parseInt(a.slice(2,4),10),p=a.endsWith("s")?"s":"";if(i%1e3>=100&&i%1e3<=999){if(u===0)return`${n} hundred${p}`;if(u<10)return`${n} oh ${u}${p}`}return`${n} ${u}${p}`}function t5(a){const i=a[0]==="$"?"dollar":"pound";if(isNaN(Number(a.slice(1))))return`${a.slice(1)} ${i}s`;if(!a.includes(".")){let b=a.slice(1)==="1"?"":"s";return`${a.slice(1)} ${i}${b}`}const[n,u]=a.slice(1).split("."),p=parseInt(u.padEnd(2,"0"),10);return`${n} ${i}${n==="1"?"":"s"} and ${p} ${a[0]==="$"?p===1?"cent":"cents":p===1?"penny":"pence"}`}function r5(a){let[i,n]=a.split(".");return`${i} point ${n.split("").join(" ")}`}const s5=new RegExp(`(\\s*[${q4=';:,.!?¡¿—…"«»“”(){}[]',q4.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}]+\\s*)+`,"g");var q4;async function $4(a,i="a",n=!0){n&&(a=function(w){return w.replace(/[‘’]/g,"'").replace(/«/g,"“").replace(/»/g,"”").replace(/[“”]/g,'"').replace(/\(/g,"«").replace(/\)/g,"»").replace(/、/g,", ").replace(/。/g,". ").replace(/!/g,"! ").replace(/,/g,", ").replace(/:/g,": ").replace(/;/g,"; ").replace(/?/g,"? ").replace(/[^\S \n]/g," ").replace(/ +/," ").replace(/(?<=\n) +(?=\n)/g,"").replace(/\bD[Rr]\.(?= [A-Z])/g,"Doctor").replace(/\b(?:Mr\.|MR\.(?= [A-Z]))/g,"Mister").replace(/\b(?:Ms\.|MS\.(?= [A-Z]))/g,"Miss").replace(/\b(?:Mrs\.|MRS\.(?= [A-Z]))/g,"Mrs").replace(/\betc\.(?! [A-Z])/gi,"etc").replace(/\b(y)eah?\b/gi,"$1e'a").replace(/\d*\.\d+|\b\d{4}s?\b|(?<!:)\b(?:[1-9]|1[0-2]):[0-5]\d\b(?!:)/g,A5).replace(/(?<=\d),(?=\d)/g,"").replace(/[$£]\d+(?:\.\d+)?(?: hundred| thousand| (?:[bm]|tr)illion)*\b|[$£]\d+\.\d\d?\b/gi,t5).replace(/\d*\.\d+/g,r5).replace(/(?<=\d)-(?=\d)/g," to ").replace(/(?<=\d)S/g," S").replace(/(?<=[BCDFGHJ-NP-TV-Z])'?s\b/g,"'S").replace(/(?<=X')S\b/g,"s").replace(/(?:[A-Za-z]\.){2,} [a-z]/g,M=>M.replace(/\./g,"-")).replace(/(?<=[A-Z])\.(?=[A-Z])/gi,"-").trim()}(a));const u=function(w,M){const E=[];let D=0;for(const B of w.matchAll(M)){const v=B[0];D<B.index&&E.push({match:!1,text:w.slice(D,B.index)}),v.length>0&&E.push({match:!0,text:v}),D=B.index+v.length}return D<w.length&&E.push({match:!1,text:w.slice(D)}),E}(a,s5),p=i==="a"?"en-us":"en";let C=(await Promise.all(u.map(async({match:w,text:M})=>w?M:(await e8(M,p)).join(" ")))).join("").replace(/kəkˈoːɹoʊ/g,"kˈoʊkəɹoʊ").replace(/kəkˈɔːɹəʊ/g,"kˈəʊkəɹəʊ").replace(/ʲ/g,"j").replace(/r/g,"ɹ").replace(/x/g,"k").replace(/ɬ/g,"l").replace(/(?<=[a-zɹː])(?=hˈʌndɹɪd)/g," ").replace(/ z(?=[;:,.!?¡¿—…"«»“” ]|$)/g,"z");return i==="a"&&(C=C.replace(/(?<=nˈaɪn)ti(?!ː)/g,"di")),C.trim()}function W2(a,i=!0){return".!?…。?!".includes(a)||i&&a===`
2898
  `}function a5(a,i){let n=i;for(;n<a.length&&!/\s/.test(a[n]);)++n;return a.substring(i,n)}const n5=new Set(["mr","mrs","ms","dr","prof","sr","jr","sgt","col","gen","rep","sen","gov","lt","maj","capt","st","mt","etc","co","inc","ltd","dept","vs","p","pg","jan","feb","mar","apr","jun","jul","aug","sep","sept","oct","nov","dec","sun","mon","tu","tue","tues","wed","th","thu","thur","thurs","fri","sat"]);function i5(a){return a=a.replace(/['’]s$/i,"").replace(/\.+$/,""),n5.has(a.toLowerCase())}const A8=new Map([[")","("],["]","["],["}","{"],["》","《"],["〉","〈"],["›","‹"],["»","«"],["〉","〈"],["」","「"],["』","『"],["〕","〔"],["】","【"]]),o5=new Set(A8.values());function l5(a,i,n,u){if(a==='"'||a==="'")return a==="'"&&n>0&&n<u.length-1&&/[A-Za-z]/.test(u[n-1])&&/[A-Za-z]/.test(u[n+1])?void 0:void(i.length&&i.at(-1)===a?i.pop():i.push(a));if(o5.has(a))return void i.push(a);const p=A8.get(a);p&&i.length&&i.at(-1)===p&&i.pop()}class em{constructor(){this._buffer="",this._sentences=[],this._resolver=null,this._closed=!1}push(...i){for(const n of i)this._buffer+=n,this._process()}close(){if(this._closed)throw new Error("Stream is already closed.");this._closed=!0,this.flush()}flush(){const i=this._buffer.trim();i.length>0&&this._sentences.push(i),this._buffer="",this._resolve()}_resolve(){this._resolver&&(this._resolver(),this._resolver=null)}_process(){let i=0;const n=this._buffer,u=n.length;let p=0,b=[];const C=w=>{let M=w;for(;M+1<u&&W2(n[M+1],!1);)++M;for(;M+1<u&&(E=n[M+1],`"')]}」』`.includes(E));)++M;var E;let D=M+1;for(;D<u&&/\s/.test(n[D]);)++D;return{end:M,nextNonSpace:D}};for(;p<u;){const w=n[p];if(l5(w,b,p,n),b.length===0&&W2(w)){const M=n.slice(i,p);if(/(^|\n)\d+$/.test(M)){++p;continue}const{end:E,nextNonSpace:D}=C(p);if(p===D-1&&w!==`
2899
  `){++p;continue}if(D===u)break;let B=p-1;for(;B>=0&&/\S/.test(n[B]);)B--;B=Math.max(i,B+1);const v=a5(n,B);if(!v){++p;continue}if((/https?[,:]\/\//.test(v)||v.includes("@"))&&!W2(v.at(-1))){p=B+v.length;continue}if(i5(v)){++p;continue}if(/^([A-Za-z]\.)+$/.test(v)&&D<u&&/[A-Z]/.test(n[D])){++p;continue}if(w==="."&&D<u&&/[a-z]/.test(n[D])){++p;continue}const F=n.substring(i,E+1).trim();if(F==="..."||F==="…"){++p;continue}F&&this._sentences.push(F),p=i=E+1}else++p}this._buffer=n.substring(i),this._sentences.length>0&&this._resolve()}async*[Symbol.asyncIterator](){if(this._resolver)throw new Error("Another iterator is already active.");for(;;)if(this._sentences.length>0)yield this._sentences.shift();else{if(this._closed)break;await new Promise(i=>{this._resolver=i})}}[Symbol.iterator](){this.flush();const i=this._sentences[Symbol.iterator]();return this._sentences=[],i}get sentences(){return this._sentences}}const jo=Object.freeze({af_heart:{name:"Heart",language:"en-us",gender:"Female",traits:"❤️",targetQuality:"A",overallGrade:"A"},af_alloy:{name:"Alloy",language:"en-us",gender:"Female",targetQuality:"B",overallGrade:"C"},af_aoede:{name:"Aoede",language:"en-us",gender:"Female",targetQuality:"B",overallGrade:"C+"},af_bella:{name:"Bella",language:"en-us",gender:"Female",traits:"🔥",targetQuality:"A",overallGrade:"A-"},af_jessica:{name:"Jessica",language:"en-us",gender:"Female",targetQuality:"C",overallGrade:"D"},af_kore:{name:"Kore",language:"en-us",gender:"Female",targetQuality:"B",overallGrade:"C+"},af_nicole:{name:"Nicole",language:"en-us",gender:"Female",traits:"🎧",targetQuality:"B",overallGrade:"B-"},af_nova:{name:"Nova",language:"en-us",gender:"Female",targetQuality:"B",overallGrade:"C"},af_river:{name:"River",language:"en-us",gender:"Female",targetQuality:"C",overallGrade:"D"},af_sarah:{name:"Sarah",language:"en-us",gender:"Female",targetQuality:"B",overallGrade:"C+"},af_sky:{name:"Sky",language:"en-us",gender:"Female",targetQuality:"B",overallGrade:"C-"},am_adam:{name:"Adam",language:"en-us",gender:"Male",targetQuality:"D",overallGrade:"F+"},am_echo:{name:"Echo",language:"en-us",gender:"Male",targetQuality:"C",overallGrade:"D"},am_eric:{name:"Eric",language:"en-us",gender:"Male",targetQuality:"C",overallGrade:"D"},am_fenrir:{name:"Fenrir",language:"en-us",gender:"Male",targetQuality:"B",overallGrade:"C+"},am_liam:{name:"Liam",language:"en-us",gender:"Male",targetQuality:"C",overallGrade:"D"},am_michael:{name:"Michael",language:"en-us",gender:"Male",targetQuality:"B",overallGrade:"C+"},am_onyx:{name:"Onyx",language:"en-us",gender:"Male",targetQuality:"C",overallGrade:"D"},am_puck:{name:"Puck",language:"en-us",gender:"Male",targetQuality:"B",overallGrade:"C+"},am_santa:{name:"Santa",language:"en-us",gender:"Male",targetQuality:"C",overallGrade:"D-"},bf_emma:{name:"Emma",language:"en-gb",gender:"Female",traits:"🚺",targetQuality:"B",overallGrade:"B-"},bf_isabella:{name:"Isabella",language:"en-gb",gender:"Female",targetQuality:"B",overallGrade:"C"},bm_george:{name:"George",language:"en-gb",gender:"Male",targetQuality:"B",overallGrade:"C"},bm_lewis:{name:"Lewis",language:"en-gb",gender:"Male",targetQuality:"C",overallGrade:"D+"},bf_alice:{name:"Alice",language:"en-gb",gender:"Female",traits:"🚺",targetQuality:"C",overallGrade:"D"},bf_lily:{name:"Lily",language:"en-gb",gender:"Female",traits:"🚺",targetQuality:"C",overallGrade:"D"},bm_daniel:{name:"Daniel",language:"en-gb",gender:"Male",traits:"🚹",targetQuality:"C",overallGrade:"D"},bm_fable:{name:"Fable",language:"en-gb",gender:"Male",traits:"🚹",targetQuality:"B",overallGrade:"C"}}),V2=new Map;async function c5(a){if(V2.has(a))return V2.get(a);const i=new Float32Array(await async function(n){if(P0&&Object.hasOwn(P0,"readFile")){const w=typeof __dirname<"u"?__dirname:import.meta.dirname,M=P0.resolve(w,`../voices/${n}.bin`),{buffer:E}=await P0.readFile(M);return E}const u=`https://huggingface.co/onnx-community/Kokoro-82M-v1.0-ONNX/resolve/main/voices/${n}.bin`;let p;try{p=await caches.open("kokoro-voices");const w=await p.match(u);if(w)return await w.arrayBuffer()}catch(w){console.warn("Unable to open cache",w)}const b=await fetch(u),C=await b.arrayBuffer();if(p)try{await p.put(u,new Response(C,{headers:b.headers}))}catch(w){console.warn("Unable to cache file",w)}return C}(a));return V2.set(a,i),i}class Rc{constructor(i,n){this.model=i,this.tokenizer=n}static async from_pretrained(i,{dtype:n="fp32",device:u=null,progress_callback:p=null}={}){const b=YI.from_pretrained(i,{progress_callback:p,dtype:n,device:u}),C=WI.from_pretrained(i,{progress_callback:p}),w=await Promise.all([b,C]);return new Rc(...w)}get voices(){return jo}list_voices(){console.table(jo)}_validate_voice(i){if(!jo.hasOwnProperty(i))throw console.error(`Voice "${i}" not found. Available voices:`),console.table(jo),new Error(`Voice "${i}" not found. Should be one of: ${Object.keys(jo).join(", ")}.`);return i.at(0)}async generate(i,{voice:n="af_heart",speed:u=1}={}){const p=this._validate_voice(n),b=await $4(i,p),{input_ids:C}=this.tokenizer(b,{truncation:!0});return this.generate_from_ids(C,{voice:n,speed:u})}async generate_from_ids(i,{voice:n="af_heart",speed:u=1}={}){const p=256*Math.min(Math.max(i.dims.at(-1)-2,0),509),b=(await c5(n)).slice(p,p+256),C={input_ids:i,style:new Y4("float32",b,[1,256]),speed:new Y4("float32",[u],[1])},{waveform:w}=await this.model(C);return new VI(w.data,24e3)}async*stream(i,{voice:n="af_heart",speed:u=1,split_pattern:p=null}={}){const b=this._validate_voice(n);let C;if(i instanceof em)C=i;else{if(typeof i!="string")throw new Error("Invalid input type. Expected string or TextSplitterStream.");{C=new em;const w=p?i.split(p).map(M=>M.trim()).filter(M=>M.length>0):[i];C.push(...w)}}for await(const w of C){const M=await $4(w,b),{input_ids:E}=this.tokenizer(M,{truncation:!0}),D=await this.generate_from_ids(E,{voice:n,speed:u});yield{text:w,phonemes:M,audio:D}}}}async function u5(){try{return!!await navigator.gpu.requestAdapter()}catch{return!1}}function t8(){const a={memory:navigator.deviceMemory||"unknown",cores:navigator.hardwareConcurrency||4,platform:navigator.platform,userAgent:navigator.userAgent,isMobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),isLowEnd:!1};return(a.memory!=="unknown"&&a.memory<=4||a.cores<=2||a.isMobile)&&(a.isLowEnd=!0),a}function d5(a){if(!a||typeof a!="string")return"";const i=/[\u{1F600}-\u{1F64F}]|[\u{1F300}-\u{1F5FF}]|[\u{1F680}-\u{1F6FF}]|[\u{1F1E0}-\u{1F1FF}]|[\u{2600}-\u{26FF}]|[\u{2700}-\u{27BF}]|[\u{1F900}-\u{1F9FF}]|[\u{1F018}-\u{1F270}]|[\u{238C}-\u{2454}]|[\u{20D0}-\u{20FF}]|[\u{FE0F}]|[\u{200D}]/gu;return a.replace(i,"").replace(/\b\/\b/," slash ").replace(/[\/\\()¯]/g,"").replace(/["“”]/g,"").replace(/\s—/g,".").replace(/\b_\b/g," ").replace(/\b-\b/g," ").replace(/[^\u0000-\u024F]/g,"").trim()}function f5(a){if(!a||typeof a!="string")return[];const i=4,n=500,u=a.split(`
2900
+ `),p=[];for(const b of u){if(b.trim()==="")continue;const M=(/[.!?]$/.test(b.trim())?b:b.trim()+".").split(/(?<=[.!?])(?=\s+|$)/);let E="";for(const D of M){const B=D.trim();if(!B)continue;if(B.length>n){E&&(p.push(E),E="");const F=B.split(" ");let S="";for(const L of F){const Z=S+(S?" ":"")+L;Z.length<=n?S=Z:(S&&p.push(S),S=L)}S&&(E=S);continue}const v=E+(E?" ":"")+B;v.length>n?(E&&p.push(E),E=B):v.length<i?E=v:(E&&p.push(E),E=B)}E&&p.push(E)}return p}class r8{constructor(){this.chunks=[],this.closed=!1}chunkText(i){const n=d5(i);return f5(n)}push(i){const n=this.chunkText(i)||[i];this.chunks.push(...n)}close(){this.closed=!0}async*[Symbol.asyncIterator](){for(const i of this.chunks)yield i}}class _0{constructor(i,n){this.audio=i,this.sampling_rate=n}get length(){return this.audio.length}toBlob(){const i=this.encodeWAV(this.audio,this.sampling_rate);return new Blob([i],{type:"audio/wav"})}toDataURL(){const i=this.encodeWAV(this.audio,this.sampling_rate),n=new Uint8Array(i);let u="";for(let b=0;b<n.length;b++)u+=String.fromCharCode(n[b]);return`data:audio/wav;base64,${btoa(u)}`}encodeWAV(i,n){const u=new ArrayBuffer(44+i.length*2),p=new DataView(u);return this.writeString(p,0,"RIFF"),p.setUint32(4,36+i.length*2,!0),this.writeString(p,8,"WAVE"),this.writeString(p,12,"fmt "),p.setUint32(16,16,!0),p.setUint16(20,1,!0),p.setUint16(22,1,!0),p.setUint32(24,n,!0),p.setUint32(28,n*2,!0),p.setUint16(32,2,!0),p.setUint16(34,16,!0),this.writeString(p,36,"data"),p.setUint32(40,i.length*2,!0),this.floatTo16BitPCM(p,44,i),u}writeString(i,n,u){for(let p=0;p<u.length;p++)i.setUint8(n+p,u.charCodeAt(p))}floatTo16BitPCM(i,n,u){for(let p=0;p<u.length;p++,n+=2){const b=Math.max(-1,Math.min(1,u[p]));i.setInt16(n,b<0?b*32768:b*32767,!0)}}}let s8=class a8{constructor(i,n,u){this.voices=i||[],this.session=n,this.voiceEmbeddings=u||{},this.wasmSession=null}static async from_pretrained(i,n={}){let u=null,p=null,b={};try{const C=["expr-voice-2-f","expr-voice-2-m","expr-voice-3-f","expr-voice-3-m","expr-voice-4-f","expr-voice-4-m","expr-voice-5-f","expr-voice-5-m"];for(const w of C){const E=/(^|-)m(\b|$)/i.test(w)?"Male":"Female",D=w.replace("expr-","").replace(/-/g," ").replace(/\b\w/g,B=>B.toUpperCase());b[w]={name:D,gender:E,language:"en-us"}}p={};try{const w=await import("./ort.bundle.min-DDx0m2em.js");w.env.wasm.wasmPaths="https://cdn.jsdelivr.net/npm/onnxruntime-web@1.22.0/dist/";let M=null;try{const E=typeof n.progress_callback=="function"?n.progress_callback:null;E&&E({status:"initiate"});const B=await fetch("https://huggingface.co/onnx-community/kitten-tts-nano-0.1-ONNX/resolve/main/onnx/model_quantized.onnx"),v=Number(B.headers.get("content-length"))||0;if(B.body&&B.body.getReader){const F=B.body.getReader(),S=[];let L=0;for(;;){const{done:z,value:Y}=await F.read();if(z)break;Y&&(S.push(Y),L+=Y.length,E&&E({status:"progress",loaded:L,total:v,progress:v?L/v*100:0}))}const Z=new Uint8Array(L);let N=0;for(const z of S)Z.set(z,N),N+=z.length;M=Z.buffer}else M=await B.arrayBuffer(),E&&E({status:"progress",loaded:M.byteLength,total:v,progress:v?M.byteLength/v*100:0})}catch{}if(n.device==="webgpu")try{u=await w.InferenceSession.create(M,{executionProviders:[{name:"webgpu",deviceType:"gpu",powerPreference:"high-performance",preferredLayout:"NCHW",context:{preferredChannelsLast:!1,enableDebugLogs:!1}},"wasm"],optimizationLevel:"basic",enableProfiling:!1})}catch{}u||(u=await w.InferenceSession.create(M,{executionProviders:[{name:"wasm",simd:!0,numThreads:4}],graphOptimizationLevel:"all",enableCpuMemArena:!0,enableMemPattern:!0})),typeof n.progress_callback=="function"&&n.progress_callback({status:"ready"})}catch{}}catch(C){console.error("Error initializing Kitten TTS:",C),Object.keys(b).length||(b={"voice-1":{name:"Express 1",gender:"Female",language:"en-us"},"voice-2":{name:"Express 2",gender:"Male",language:"en-us"},"voice-3":{name:"Express 3",gender:"Female",language:"en-us"},"voice-4":{name:"Express 4",gender:"Male",language:"en-us"},"voice-5":{name:"Express 5",gender:"Female",language:"en-gb"},"voice-6":{name:"Express 6",gender:"Male",language:"en-gb"}}),p=p||{}}return new a8(b,u,p||{})}async loadTokenizer(){if(!this.tokenizer)try{const i=await fetch("https://huggingface.co/onnx-community/kitten-tts-nano-0.1-ONNX/raw/main/tokenizer.json");if(!i.ok)throw new Error(`HTTP error! status: ${i.status}`);const n=await i.json();this.vocab=n.model.vocab,this.vocabArray=[];for(const[u,p]of Object.entries(this.vocab))this.vocabArray[p]=u;this.tokenizer=n}catch(i){console.error("Error loading tokenizer:",i),this.vocab={},this.vocabArray=[]}}async textToPhonemes(i){const{phonemize:n}=await Promise.resolve().then(function(){return e5});return await n(i,"en-us")}async tokenizeText(i){return await this.loadTokenizer(),`$${await this.textToPhonemes(i)}$`.split("").map(b=>{const C=this.vocab[b];return C===void 0?0:C})}async*stream(i,n={}){const{voice:u="expr-voice-2-m",speed:p=1}=n;for await(const b of i)if(b.trim())try{if(!this.voiceEmbeddings[u])try{const C=this.mapVoiceIdToRemote(u),M=await(await fetch(`https://huggingface.co/onnx-community/kitten-tts-nano-0.1-ONNX/resolve/main/voices/${C}.bin`)).arrayBuffer(),E=new Float32Array(M);this.voiceEmbeddings[u]=[E]}catch{}if(this.session&&this.voiceEmbeddings[u])try{const C=await this.tokenizeText(b),w=new BigInt64Array(C.map(Y=>BigInt(Y))),M=new Float32Array(this.voiceEmbeddings[u][0]),E=await import("./ort.bundle.min-DDx0m2em.js"),D={input_ids:new E.Tensor("int64",w,[1,w.length]),style:new E.Tensor("float32",M,[1,M.length]),speed:new E.Tensor("float32",new Float32Array([p]),[1])};let B=await this.session.run(D),v=B.waveform,F=v.data;if(F.length>0&&isNaN(F[0])){if(!this.wasmSession){const Y=await import("./ort.bundle.min-DDx0m2em.js");this.wasmSession=await Y.InferenceSession.create("https://huggingface.co/onnx-community/kitten-tts-nano-0.1-ONNX/resolve/main/model_quantized.onnx",{executionProviders:["wasm"]})}B=await this.wasmSession.run(D),v=B.waveform,F=v.data}const S=24e3;let L=F[0],Z=F[0];for(let Y=1;Y<F.length;Y++)F[Y]<L&&(L=F[Y]),F[Y]>Z&&(Z=F[Y]);let N=new Float32Array(F);if(p!==1){const Y=Math.floor(F.length/p);N=new Float32Array(Y);for(let f=0;f<Y;f++){const k=Math.floor(f*p);N[f]=F[Math.min(k,F.length-1)]}}let z=0;for(let Y=0;Y<N.length;Y++)isNaN(N[Y])||!isFinite(N[Y])?N[Y]=0:z=Math.max(z,Math.abs(N[Y]));if(z>0){const Y=.8/z;for(let f=0;f<N.length;f++)N[f]*=Y,N[f]=Math.max(-1,Math.min(1,N[f]))}yield{text:b,audio:new _0(N,S)}}catch(C){console.error("Model inference error:",C),console.error("Error details:",C.message)}else{const w=b.split(/\s+/).filter(Boolean).length,M=Math.min(.25+w*.15,3)/Math.max(p,.1),E=Math.max(1,Math.floor(24e3*M)),D=new Float32Array(E),B=/female|f\b/i.test(String(this.voices?.[u]?.gender))?260:180;for(let v=0;v<E;v++){const F=v/24e3,S=B*(1+.05*Math.sin(2*Math.PI*2*F));D[v]=.15*Math.sin(2*Math.PI*S*F)}yield{text:b,audio:new _0(D,24e3)}}}catch(C){console.error("Error generating audio:",C),yield{text:b,audio:new _0(new Float32Array(22050),22050)}}}mapVoiceIdToRemote(i){if(/^expr-voice-\d+-(m|f)$/i.test(i))return i;const n=String(i).match(/^voice-(\d+)(?:-(m|f))?$/i);if(!n)return"expr-voice-2-f";const u=parseInt(n[1],10),p=Math.max(2,Math.min(5,isNaN(u)?2:u)),b=(n[2]||"f").toLowerCase();return`expr-voice-${p}-${b}`}};var g5=Object.freeze({__proto__:null,KittenTTS:s8,RawAudio:_0,TextSplitterStream:r8});let Jn=null,jc=!1,X0=null;const p5=s8;async function m5(a="wasm",i="q8"){const n=t8(),u=await u5(),p=a==="webgpu"&&u?"webgpu":"wasm",b=i==="fp32"?"fp32":"q8";self.postMessage({status:"device",device:p,dtype:b,systemInfo:n,highPerfMode:b==="fp32"&&p==="webgpu",model:"kokoro"}),Jn=await Rc.from_pretrained("onnx-community/Kokoro-82M-ONNX",{dtype:b,device:p,progress_callback:w=>{w.status==="progress"||w.status==="download"?self.postMessage({status:"download_progress",loaded:w.loaded,total:w.total,progress:w.progress}):w.status==="initiate"?self.postMessage({status:"loading",message:"Initializing Kokoro model..."}):w.status==="ready"&&self.postMessage({status:"loading",message:"Kokoro model ready!"})}}).catch(w=>{throw self.postMessage({status:"error",data:w.message}),w}),self.postMessage({status:"ready",voices:Jn.voices,device:p,model:"kokoro"}),jc=!0,X0="kokoro"}async function h5(){const a=t8(),i="wasm",n="q8";self.postMessage({status:"device",device:i,dtype:n,systemInfo:a,highPerfMode:!1,model:"kitten"}),self.postMessage({status:"loading",message:"Loading Kitten TTS Nano..."});try{Jn=await p5.from_pretrained("/tts-model/model_quantized.onnx",{dtype:n,device:i,progress_callback:p=>{p?.status==="progress"&&self.postMessage({status:"download_progress",loaded:p.loaded||0,total:p.total||0,progress:p.progress||0})}}),self.postMessage({status:"ready",voices:Jn.voices,device:i,model:"kitten"}),jc=!0,X0="kitten"}catch(u){console.error("Error loading Kitten TTS:",u),self.postMessage({status:"error",data:u.message})}}self.addEventListener("message",async a=>{if(a.data.type==="init"){const i=a.data.modelType||"kokoro",n=a.data.kokoroDevice||"wasm",u=a.data.kokoroDtype||"q8";jc=!1,Jn=null,X0=null;try{i==="kitten"?await h5():await m5(n,u)}catch(p){console.error("Error initializing model:",p),self.postMessage({status:"error",data:p.message})}}else if(a.data.type==="generate"&&Jn){const{text:i,voice:n,isPreview:u}=a.data;try{if(console.log(`Generating audio for text: "${i}" with voice: ${n}`),X0==="kitten"){const C=new r8;C.push(i),C.close();const w=[],M=Jn.stream(C,{voice:n});for await(const{text:Z,audio:N}of M){if(u){const z=N.toDataURL();self.postMessage({status:"complete",audioUrl:z,text:Z,isPreview:!0});return}w.push(N)}if(w.length===0)throw new Error("No audio generated");const E=w[0].sampling_rate||24e3,D=w.reduce((Z,N)=>Z+N.audio.length,0),B=new Float32Array(D);let v=0;for(const Z of w)B.set(Z.audio,v),v+=Z.audio.length;const{RawAudio:F}=await Promise.resolve().then(function(){return g5}),L=new F(B,E).toBlob();self.postMessage({status:"complete",audio:L,text:i,isPreview:!1});return}const b=(await Jn.generate(i,{voice:n})).toBlob();self.postMessage({status:"complete",audio:b,text:i,isPreview:u})}catch(p){console.error("Error generating audio:",p),self.postMessage({status:"error",data:p.message})}}});
index.html CHANGED
@@ -54,7 +54,7 @@
54
  </script>
55
 
56
  <!-- End Matomo Code -->
57
- <script type="module" crossorigin src="/assets/index-BRSFevle.js"></script>
58
  <link rel="stylesheet" crossorigin href="/assets/index-D9-yFm_8.css">
59
  </head>
60
  <body>
 
54
  </script>
55
 
56
  <!-- End Matomo Code -->
57
+ <script type="module" crossorigin src="/assets/index-D8qJ82kb.js"></script>
58
  <link rel="stylesheet" crossorigin href="/assets/index-D9-yFm_8.css">
59
  </head>
60
  <body>