diff --git a/.gitignore b/.gitignore index 80b3a04..6cb02eb 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,5 @@ openblas openfst emsdk test.js -test.wasm \ No newline at end of file +test.wasm +src/*.o \ No newline at end of file diff --git a/Examples/fromMic.html b/Examples/fromMic.html index 208ec10..48ddb7b 100644 --- a/Examples/fromMic.html +++ b/Examples/fromMic.html @@ -1,43 +1,45 @@ - - - + + + + - // Connect transferer to microphone - micNode.connect(transferer); - } - - - - \ No newline at end of file diff --git a/Vosklet.d.ts b/Vosklet.d.ts new file mode 100644 index 0000000..347ac3a --- /dev/null +++ b/Vosklet.d.ts @@ -0,0 +1,66 @@ +// vosklet.d.ts + +declare global { + interface Window { + loadVosklet(): Promise; + } +} + +export type EpMode = + | "ANSWER_DEFAULT" + | "DISABLED" + | "FAST" + | "MEDIUM" + | "SLOW"; + +export interface Module { + createModel(url: string, path: string, id: string): Promise; + createSpkModel(url: string, path: string, id: string): Promise; + createRecognizer(model: Model, sampleRate: number): Promise; + createRecognizerWithSpkModel( + model: Model, + spkModel: SpkModel, + sampleRate: number + ): Promise; + createRecognizerWithGrm( + model: Model, + grammar: string, + sampleRate: number + ): Promise; + setLogLevel(level: number): void; + createTransferer( + ctx: AudioContext, + bufferSize: number + ): Promise; + cleanUp(): Promise; + getModelCache(): Promise; + EpMode: EpMode; +} + +export interface Model { + findWord(word: string): number; + delete(): void; +} + +export interface SpkModel { + delete(): void; +} + +export interface Recognizer extends EventTarget { + acceptWaveform(audioData: Float32Array): void; + setWords(words: boolean): void; + setPartialWords(partialWords: boolean): void; + setNLSML(nlsml: boolean): void; + setMaxAlternatives(alts: number): void; + setGrm(grammar: string): void; + setSpkModel(model: SpkModel): void; + setEndpointerMode(mode: EpMode): void; + setEndpointerDelays( + tStartMax: number, + tEnd: number, + tMax: number + ): void; + + delete(processCurrent?: boolean): Promise; +} + diff --git a/Vosklet.js b/Vosklet.js index 18c8cdf..8b73d6a 100644 --- a/Vosklet.js +++ b/Vosklet.js @@ -1,69 +1,68 @@ var loadVosklet = (() => { var _scriptName = typeof document != 'undefined' ? document.currentScript?.src : undefined; - return ( async function(moduleArg = {}) { var moduleRtn; -var n=moduleArg,aa,ba,ca=new Promise((a,b)=>{aa=a;ba=b}),da="object"==typeof window,ea="undefined"!=typeof WorkerGlobalScope,fa=!!n.$ww; -if(da){var p=[],ha=["status","partialResult","result"];let a=caches.open("Vosklet"),b=URL.createObjectURL(new Blob(["(",(()=>{registerProcessor("VoskletTransferer",class extends AudioWorkletProcessor{constructor(e){super();this.pa=0;this.xa=e.processorOptions[0];this.ua=new Float32Array(this.xa)}process(e){e[0][0]&&(this.ua.set(e[0][0],this.pa),this.pa+=128,this.pa>=this.xa&&(this.pa=0,this.port.postMessage(this.ua,[this.ua.buffer]),this.ua=new Float32Array(this.xa)));return!0}})}).toString(),")()"], -{type:"text/javascript"}));class c extends EventTarget{constructor(){super();p.push(this)}delete(){this.ea.delete()}static async oa(e,f,g,h){let k=new c,m=new Promise((r,w)=>{k.addEventListener("status",u=>{u.detail?w(u.detail):(h&&(k.findWord=z=>k.ea.findWord(z)),r(k))},{once:!0})}),l=await caches.open("Vosklet"),q=(await l.keys(f,{ignoreSearch:!0}))[0];if("undefined"==typeof q||q.url.split("?")[1]!=g){e=await fetch(e,{cache:"no-store"});if(!e.ok)throw"Unable to fetch model, status: "+e.status;e= -new Response(e.body.pipeThrough(new DecompressionStream("gzip")));await l.put(f+"?"+g,e.clone())}else e=await l.match(q);f=await e.arrayBuffer();g=ia(f.byteLength);t().set(new Uint8Array(f),g);k.ea=new n.CommonModel(p.length-1,h,g,f.byteLength);return m}}class d extends EventTarget{constructor(){super();this.acceptWaveform=e=>{let f=ia(4*e.length);ja().set(e,f/4);this.ea.acceptWaveform(f,e.length)};p.push(this);return new Proxy(this,{get(e,f){if(void 0!=e[f]||void 0!=e.ea[f]){var g=e[f];if(g)return g.bind? -g.bind(e):g;g=e.ea[f];return g.bind?g.bind(e.ea):g}}})}async delete(e=!1){let f=new Promise(g=>this.addEventListener("status",()=>{this.ea.delete();g()},{once:!0}));this.ea.safeDelete(e);return f}static async oa(e,f,g,h,k){let m=new d,l=new Promise((q,r)=>{m.addEventListener("status",w=>{w.detail?r(w.detail):q(m)},{once:!0})});switch(g){case 1:m.ea=new n.Recognizer(p.length-1,f,e);break;case 2:m.ea=new n.Recognizer(p.length-1,f,e,k);break;default:m.ea=new n.Recognizer(p.length-1,f,e,h,0)}return l}} -n={getModelCache:()=>a,cleanUp:async()=>{for(let e of p)await e.delete();URL.revokeObjectURL(b)},createTransferer:async(e,f)=>{await e.audioWorklet.addModule(b);return new AudioWorkletNode(e,"VoskletTransferer",{channelCountMode:"explicit",numberOfInputs:1,numberOfOutputs:0,channelCount:1,processorOptions:[f]})},createModel:(e,f,g)=>c.oa(e,f,g,!0),createSpkModel:(e,f,g)=>c.oa(e,f,g,!1),createRecognizer:(e,f)=>d.oa(e.ea,f,1),createRecognizerWithGrm:(e,f,g)=>d.oa(e.ea,f,3,g,null),createRecognizerWithSpkModel:(e, -f,g)=>d.oa(e.ea,f,2,null,g.ea)}}var ka={...n},v="",la,ma; -if(da||ea)ea?v=self.location.href:"undefined"!=typeof document&&document.currentScript&&(v=document.currentScript.src),_scriptName&&(v=_scriptName),v.startsWith("blob:")?v="":v=v.slice(0,v.replace(/[?#].*/,"").lastIndexOf("/")+1),ea&&(ma=a=>{var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer";b.send(null);return new Uint8Array(b.response)}),la=async a=>{a=await fetch(a,{credentials:"same-origin"});if(a.ok)return a.arrayBuffer();throw Error(a.status+" : "+a.url);}; -var na=console.log.bind(console),x=console.error.bind(console);Object.assign(n,ka);ka=null;var y,oa,pa=!1,A,qa,ra,sa,ta,ua,va,wa,xa,ya;function B(){y.buffer!=A.buffer&&C();return A}function t(){y.buffer!=A.buffer&&C();return qa}function za(){y.buffer!=A.buffer&&C();return ra}function Aa(){y.buffer!=A.buffer&&C();return sa}function D(){y.buffer!=A.buffer&&C();return ta}function F(){y.buffer!=A.buffer&&C();return ua}function ja(){y.buffer!=A.buffer&&C();return va} -function C(){var a=y.buffer;A=new Int8Array(a);ra=new Int16Array(a);qa=new Uint8Array(a);sa=new Uint16Array(a);ta=new Int32Array(a);ua=new Uint32Array(a);va=new Float32Array(a);ya=new Float64Array(a);wa=new BigInt64Array(a);xa=new BigUint64Array(a)}n.wasmMemory?y=n.wasmMemory:y=new WebAssembly.Memory({initial:5040,maximum:32768,shared:!0});C();function Ba(){if(fa){let a=n;Ca(a.sb,a.sz);removeEventListener("message",Da);Ea=Ea.forEach(Fa);addEventListener("message",Fa)}else G.V()}var H=0,I=null; -function Ga(a){a="Aborted("+a+")";x(a);pa=!0;a=new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");ba(a);throw a;}var Ha;async function Ia(a){try{var b=await la(a);return new Uint8Array(b)}catch{}if(ma)a=ma(a);else throw"both async and sync fetching of the wasm failed";return a}async function Ja(a,b){try{var c=await Ia(a);return await WebAssembly.instantiate(c,b)}catch(d){x(`failed to asynchronously prepare wasm: ${d}`),Ga(d)}} -async function Ka(a){var b=Ha;if("function"==typeof WebAssembly.instantiateStreaming)try{var c=fetch(b,{credentials:"same-origin"});return await WebAssembly.instantiateStreaming(c,a)}catch(d){x(`wasm streaming compile failed: ${d}`),x("falling back to ArrayBuffer instantiation")}return Ja(b,a)}class La{name="ExitStatus";constructor(a){this.message=`Program terminated with exit(${a})`;this.status=a}} -var Ea=[],Ma=a=>{if(!pa)try{a()}catch(b){if(!(b instanceof La||"unwind"==b))throw b;}},Pa=[],Qa,Ra=a=>{var b=Pa[a];b||(Pa[a]=b=Qa.get(a));return b},Fa=a=>{let b=a.data,c=b._wsc;c&&Ma(()=>Ra(c)(...b.x))},Da=a=>{Ea.push(a)},Sa=new TextDecoder,J=(a,b)=>{if(!a)return"";b=a+b;for(var c=a;!(c>=b)&&t()[c];)++c;return Sa.decode(t().slice(a,c))};class Ta{constructor(a){this.ca=a-24}} -var Ua=0,Va=0,Wa=a=>{if(null===a)return"null";var b=typeof a;return"object"===b||"array"===b||"function"===b?a.toString():""+a},Xa,K=a=>{for(var b="";t()[a];)b+=Xa[t()[a++]];return b},L={},M={},Ya={},N=n.BindingError=class extends Error{constructor(a){super(a);this.name="BindingError"}},Za=a=>{throw new N(a);}; -function $a(a,b,c={}){var d=b.name;if(!a)throw new N(`type "${d}" must have a positive integer typeid pointer`);if(M.hasOwnProperty(a)){if(c.Ha)return;throw new N(`Cannot register type '${d}' twice`);}M[a]=b;delete Ya[a];L.hasOwnProperty(a)&&(b=L[a],delete L[a],b.forEach(e=>e()))}function O(a,b,c={}){return $a(a,b,c)} -var ab=(a,b,c)=>{switch(b){case 1:return c?d=>B()[d]:d=>t()[d];case 2:return c?d=>za()[d>>1]:d=>Aa()[d>>1];case 4:return c?d=>D()[d>>2]:d=>F()[d>>2];case 8:return c?d=>wa[d>>3]:d=>xa[d>>3];default:throw new TypeError(`invalid integer width (${b}): ${a}`);}},bb=a=>{throw new N(a.aa.da.ba.name+" instance already deleted");},cb=!1,db=()=>{},P=a=>{if("undefined"===typeof FinalizationRegistry)return P=b=>b,a;cb=new FinalizationRegistry(b=>{b=b.aa;--b.count.value;0===b.count.value&&(b.ga?b.ja.la(b.ga): -b.da.ba.la(b.ca))});P=b=>{var c=b.aa;c.ga&&cb.register(b,{aa:c},b);return b};db=b=>{cb.unregister(b)};return P(a)},eb=[];function fb(){} -var gb=(a,b)=>Object.defineProperty(b,"name",{value:a}),hb={},ib=(a,b,c)=>{if(void 0===a[b].fa){var d=a[b];a[b]=function(...e){if(!a[b].fa.hasOwnProperty(e.length))throw new N(`Function '${c}' called with an invalid number of arguments (${e.length}) - expects one of (${a[b].fa})!`);return a[b].fa[e.length].apply(this,e)};a[b].fa=[];a[b].fa[d.qa]=d}},jb=(a,b,c)=>{if(n.hasOwnProperty(a)){if(void 0===c||void 0!==n[a].fa&&void 0!==n[a].fa[c])throw new N(`Cannot register public name '${a}' twice`);ib(n, -a,a);if(n[a].fa.hasOwnProperty(c))throw new N(`Cannot register multiple overloads of a function with the same number of arguments (${c})!`);n[a].fa[c]=b}else n[a]=b,n[a].qa=c},kb=a=>{a=a.replace(/[^a-zA-Z0-9_]/g,"$");var b=a.charCodeAt(0);return 48<=b&&57>=b?`_${a}`:a};function lb(a,b,c,d,e,f,g,h){this.name=a;this.constructor=b;this.na=c;this.la=d;this.ha=e;this.Fa=f;this.ta=g;this.Da=h;this.Ja=[]} -var mb=(a,b,c)=>{for(;b!==c;){if(!b.ta)throw new N(`Expected null or instance of ${c.name}, got an instance of ${b.name}`);a=b.ta(a);b=b.ha}return a};function nb(a,b){if(null===b){if(this.ya)throw new N(`null is not a valid ${this.name}`);return 0}if(!b.aa)throw new N(`Cannot pass "${Wa(b)}" as a ${this.name}`);if(!b.aa.ca)throw new N(`Cannot pass deleted object as a pointer of type ${this.name}`);return mb(b.aa.ca,b.aa.da.ba,this.ba)} -function ob(a,b){if(null===b){if(this.ya)throw new N(`null is not a valid ${this.name}`);if(this.wa){var c=this.Ka();null!==a&&a.push(this.la,c);return c}return 0}if(!b||!b.aa)throw new N(`Cannot pass "${Wa(b)}" as a ${this.name}`);if(!b.aa.ca)throw new N(`Cannot pass deleted object as a pointer of type ${this.name}`);if(!this.va&&b.aa.da.va)throw new N(`Cannot convert argument of type ${b.aa.ja?b.aa.ja.name:b.aa.da.name} to parameter type ${this.name}`);c=mb(b.aa.ca,b.aa.da.ba,this.ba);if(this.wa){if(void 0=== -b.aa.ga)throw new N("Passing raw pointer to smart pointer is illegal");switch(this.Ma){case 0:if(b.aa.ja===this)c=b.aa.ga;else throw new N(`Cannot convert argument of type ${b.aa.ja?b.aa.ja.name:b.aa.da.name} to parameter type ${this.name}`);break;case 1:c=b.aa.ga;break;case 2:if(b.aa.ja===this)c=b.aa.ga;else{var d=b.clone();c=this.La(c,pb(()=>d["delete"]()));null!==a&&a.push(this.la,c)}break;default:throw new N("Unsupporting sharing policy");}}return c} -function qb(a,b){if(null===b){if(this.ya)throw new N(`null is not a valid ${this.name}`);return 0}if(!b.aa)throw new N(`Cannot pass "${Wa(b)}" as a ${this.name}`);if(!b.aa.ca)throw new N(`Cannot pass deleted object as a pointer of type ${this.name}`);if(b.aa.da.va)throw new N(`Cannot convert argument of type ${b.aa.da.name} to parameter type ${this.name}`);return mb(b.aa.ca,b.aa.da.ba,this.ba)}function rb(a){return this.fromWireType(F()[a>>2])} -var sb=(a,b,c)=>{if(b===c)return a;if(void 0===c.ha)return null;a=sb(a,b,c.ha);return null===a?null:c.Da(a)},tb={},ub=(a,b)=>{if(void 0===b)throw new N("ptr should not be undefined");for(;a.ha;)b=a.ta(b),a=a.ha;return tb[b]},vb=n.InternalError=class extends Error{constructor(a){super(a);this.name="InternalError"}},wb=(a,b)=>{if(!b.da||!b.ca)throw new vb("makeClassHandle requires ptr and ptrType");if(!!b.ja!==!!b.ga)throw new vb("Both smartPtrType and smartPtr must be specified");b.count={value:1}; -return P(Object.create(a,{aa:{value:b,writable:!0}}))};function xb(a,b,c,d,e,f,g,h,k,m,l){this.name=a;this.ba=b;this.ya=c;this.va=d;this.wa=e;this.Ia=f;this.Ma=g;this.Ba=h;this.Ka=k;this.La=m;this.la=l;e||void 0!==b.ha?this.toWireType=ob:(this.toWireType=d?nb:qb,this.ia=null)} -var yb=(a,b,c)=>{if(!n.hasOwnProperty(a))throw new vb("Replacing nonexistent public symbol");void 0!==n[a].fa&&void 0!==c?n[a].fa[c]=b:(n[a]=b,n[a].qa=c)},Q=(a,b)=>{a=K(a);var c=Ra(b);if("function"!=typeof c)throw new N(`unknown function pointer with signature ${a}: ${b}`);return c};class Ab extends Error{} -var Cb=a=>{a=Bb(a);var b=K(a);R(a);return b},Db=(a,b)=>{function c(f){e[f]||M[f]||(Ya[f]?Ya[f].forEach(c):(d.push(f),e[f]=!0))}var d=[],e={};b.forEach(c);throw new Ab(`${a}: `+d.map(Cb).join([", "]));},S=(a,b,c)=>{function d(h){h=c(h);if(h.length!==a.length)throw new vb("Mismatched type converter count");for(var k=0;kYa[h]=b);var e=Array(b.length),f=[],g=0;b.forEach((h,k)=>{M.hasOwnProperty(h)?e[k]=M[h]:(f.push(h),L.hasOwnProperty(h)||(L[h]=[]),L[h].push(()=> -{e[k]=M[h];++g;g===f.length&&d(e)}))});0===f.length&&d(e)},Eb=(a,b)=>{for(var c=[],d=0;d>2]);return c},Fb=a=>{for(;a.length;){var b=a.pop();a.pop()(b)}};function Gb(a){for(var b=1;bg)throw new N("argTypes array size mismatch! Must at least get return value and 'this' types!");var h=null!==b[1]&&null!==c,k=Gb(b);c="void"!==b[0].name;d=[a,Za,d,e,Fb,b[0],b[1]];for(e=0;e{a=a.trim();const b=a.indexOf("(");return-1===b?a:a.slice(0,b)},Jb=[],T=[],pb=a=>{switch(a){case void 0:return 2;case null:return 4;case !0:return 6;case !1:return 8;default:const b=Jb.pop()||T.length;T[b]=a;T[b+1]=1;return b}},Kb={name:"emscripten::val",fromWireType:a=>{if(!a)throw new N(`Cannot use deleted val. handle = ${a}`);var b=T[a];9pb(b),ka:8,readValueFromPointer:rb,ia:null},Lb=(a,b,c)=>{switch(b){case 1:return c? -function(d){return this.fromWireType(B()[d])}:function(d){return this.fromWireType(t()[d])};case 2:return c?function(d){return this.fromWireType(za()[d>>1])}:function(d){return this.fromWireType(Aa()[d>>1])};case 4:return c?function(d){return this.fromWireType(D()[d>>2])}:function(d){return this.fromWireType(F()[d>>2])};default:throw new TypeError(`invalid integer width (${b}): ${a}`);}},Mb=a=>{var b=M[a];if(void 0===b)throw a=`${"enum"} has unknown type ${Cb(a)}`,new N(a);return b},Nb=(a,b)=>{switch(b){case 4:return function(c){return this.fromWireType(ja()[c>> -2])};case 8:return function(c){var d=this.fromWireType;y.buffer!=A.buffer&&C();return d.call(this,ya[c>>3])};default:throw new TypeError(`invalid float width (${b}): ${a}`);}},U=(a,b,c,d)=>{if(!(0=g){var h=a.charCodeAt(++f);g=65536+((g&1023)<<10)|h&1023}if(127>=g){if(c>=d)break;b[c++]=g}else{if(2047>=g){if(c+1>=d)break;b[c++]=192|g>>6}else{if(65535>=g){if(c+2>=d)break;b[c++]=224|g>>12}else{if(c+3>=d)break; -b[c++]=240|g>>18;b[c++]=128|g>>12&63}b[c++]=128|g>>6&63}b[c++]=128|g&63}}b[c]=0;return c-e},Ob=(a,b)=>{U(a,t(),b,17)},V=a=>{for(var b=0,c=0;c=d?b++:2047>=d?b+=2:55296<=d&&57343>=d?(b+=4,++c):b+=3}return b},Pb=new TextDecoder("utf-16le"),Qb=(a,b)=>{var c=a>>1;for(b=c+b/2;!(c>=b)&&Aa()[c];)++c;c<<=1;return Pb.decode(t().slice(a,c))},Rb=(a,b,c)=>{c??=2147483647;if(2>c)return 0;c-=2;var d=b;c=c<2*a.length?c/2:a.length;for(var e=0;e>1]=f;b+=2}za()[b>>1]=0;return b-d},Sb=a=>2*a.length,Tb=(a,b)=>{for(var c=0,d="";!(c>=b/4);){var e=D()[a+4*c>>2];if(0==e)break;++c;65536<=e?(e-=65536,d+=String.fromCharCode(55296|e>>10,56320|e&1023)):d+=String.fromCharCode(e)}return d},Ub=(a,b,c)=>{c??=2147483647;if(4>c)return 0;var d=b;c=d+c-4;for(var e=0;e=f){var g=a.charCodeAt(++e);f=65536+((f&1023)<<10)|g&1023}D()[b>>2]=f;b+=4;if(b+4>c)break}D()[b>>2]=0;return b-d},Vb=a=>{for(var b= -0,c=0;c=d&&++c;b+=4}return b},Wb={},Xb=1,Yb=URL.createObjectURL(new Blob(["onmessage=function(d){onmessage=null;d=d.data;d[`instantiateWasm`]=(i,r)=>{var n=new WebAssembly.Instance(d[`wasm`],i);return r(n,d[`wasm`]);};importScripts(d.js);loadVosklet(d);d.wasm=d.mem=d.js=0;}"],{type:"application/javascript"})),W={},Zb=[],X=[],$b=[],ac={},cc=()=>{if(!bc){var a={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"== -typeof navigator&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:"./this.program"},b;for(b in ac)void 0===ac[b]?delete a[b]:a[b]=ac[b];var c=[];for(b in a)c.push(`${b}=${a[b]}`);bc=c}return bc},bc,dc=()=>a=>a.set(crypto.getRandomValues(new Uint8Array(a.byteLength))),ec=a=>{(ec=dc())(a)},fc=Array(256),gc=0;256>gc;++gc)fc[gc]=String.fromCharCode(gc);Xa=fc; -(()=>{let a=fb.prototype;Object.assign(a,{isAliasOf:function(c){if(!(this instanceof fb&&c instanceof fb))return!1;var d=this.aa.da.ba,e=this.aa.ca;c.aa=c.aa;var f=c.aa.da.ba;for(c=c.aa.ca;d.ha;)e=d.ta(e),d=d.ha;for(;f.ha;)c=f.ta(c),f=f.ha;return d===f&&e===c},clone:function(){this.aa.ca||bb(this);if(this.aa.sa)return this.aa.count.value+=1,this;var c=P,d=Object,e=d.create,f=Object.getPrototypeOf(this),g=this.aa;c=c(e.call(d,f,{aa:{value:{count:g.count,ra:g.ra,sa:g.sa,ca:g.ca,da:g.da,ga:g.ga,ja:g.ja}}})); -c.aa.count.value+=1;c.aa.ra=!1;return c},["delete"](){this.aa.ca||bb(this);if(this.aa.ra&&!this.aa.sa)throw new N("Object already scheduled for deletion");db(this);var c=this.aa;--c.count.value;0===c.count.value&&(c.ga?c.ja.la(c.ga):c.da.ba.la(c.ca));this.aa.sa||(this.aa.ga=void 0,this.aa.ca=void 0)},isDeleted:function(){return!this.aa.ca},deleteLater:function(){this.aa.ca||bb(this);if(this.aa.ra&&!this.aa.sa)throw new N("Object already scheduled for deletion");eb.push(this);this.aa.ra=!0;return this}}); +var k=moduleArg,ba,ca,da=new Promise((a,b)=>{ba=a;ca=b}),p="em-ww"==globalThis.name,ea="object"==typeof window,fa="undefined"!=typeof WorkerGlobalScope; +if(ea){var q=[],ha=["status","partialResult","result"];let a=caches.open("Vosklet"),b=URL.createObjectURL(new Blob(["(",(()=>{registerProcessor("VoskletTransferer",class extends AudioWorkletProcessor{constructor(e){super();this.ra=0;this.ya=e.processorOptions[0];this.va=new Float32Array(this.ya)}process(e){e[0][0]&&(this.va.set(e[0][0],this.ra),this.ra+=128,this.ra>=this.ya&&(this.ra=0,this.port.postMessage(this.va,[this.va.buffer]),this.va=new Float32Array(this.ya)));return!0}})}).toString(),")()"], +{type:"text/javascript"}));class c extends EventTarget{constructor(){super();q.push(this)}delete(){this.fa.delete()}static async pa(e,f,g,h){let l=new c,n=new Promise((t,w)=>{l.addEventListener("status",v=>{v.detail?w(v.detail):(h&&(l.findWord=z=>l.fa.findWord(z)),t(l))},{once:!0})}),m=await caches.open("Vosklet"),r=(await m.keys(f,{ignoreSearch:!0}))[0];if("undefined"==typeof r||r.url.split("?")[1]!=g){e=await fetch(e,{cache:"no-store"});if(!e.ok)throw"Unable to fetch model, status: "+e.status;e= +new Response(e.body.pipeThrough(new DecompressionStream("gzip")));await m.put(f+"?"+g,e.clone())}else e=await m.match(r);f=await e.arrayBuffer();g=u(f.byteLength);(x(),y).set(new Uint8Array(f),g);l.fa=new k.CommonModel(q.length-1,h,g,f.byteLength);return n}}class d extends EventTarget{constructor(){super();this.acceptWaveform=e=>{let f=u(4*e.length);(x(),ia).set(e,f/4);this.fa.acceptWaveform(f,e.length)};q.push(this);return new Proxy(this,{get(e,f){if(void 0!=e[f]||void 0!=e.fa[f]){var g=e[f];if(g)return g.bind? +g.bind(e):g;g=e.fa[f];return g.bind?g.bind(e.fa):g}}})}async delete(e=!1){let f=new Promise(g=>this.addEventListener("status",()=>{this.fa.delete();g()},{once:!0}));this.fa.safeDelete(e);return f}static async pa(e,f,g,h,l){let n=new d,m=new Promise((r,t)=>{n.addEventListener("status",w=>{w.detail?t(w.detail):r(n)},{once:!0})});switch(g){case 1:n.fa=new k.Recognizer(q.length-1,f,e);break;case 2:n.fa=new k.Recognizer(q.length-1,f,e,l);break;default:n.fa=new k.Recognizer(q.length-1,f,e,h,0)}return m}} +k={getModelCache:()=>a,cleanUp:async()=>{for(let e of q)await e.delete();URL.revokeObjectURL(b)},createTransferer:async(e,f)=>{await e.audioWorklet.addModule(b);return new AudioWorkletNode(e,"VoskletTransferer",{channelCountMode:"explicit",numberOfInputs:1,numberOfOutputs:0,channelCount:1,processorOptions:[f]})},createModel:(e,f,g)=>c.pa(e,f,g,!0),createSpkModel:(e,f,g)=>c.pa(e,f,g,!1),createRecognizer:(e,f)=>d.pa(e.fa,f,1),createRecognizerWithGrm:(e,f,g)=>d.pa(e.fa,f,3,g,null),createRecognizerWithSpkModel:(e, +f,g)=>d.pa(e.fa,f,2,null,g.fa)}}fa&&(_scriptName=self.location.href);var ja="",ka,la;if(ea||fa){try{ja=(new URL(".",_scriptName)).href}catch{}fa&&(la=a=>{var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer";b.send(null);return new Uint8Array(b.response)});ka=async a=>{a=await fetch(a,{credentials:"same-origin"});if(a.ok)return a.arrayBuffer();throw Error(a.status+" : "+a.url);}}var ma=console.log.bind(console),A=console.error.bind(console),B,na,oa=!1,C,y,D,F,G,H,ia,pa,qa,ra; +function x(){B.buffer!=C.buffer&&sa()}var ta,ua;p&&(onmessage=a=>{onmessage=null;ua=a=a.data;B=a.Ra;sa();ta(a.Da);a.Da=a.Ua=0});function sa(){var a=B.buffer;C=new Int8Array(a);D=new Int16Array(a);y=new Uint8Array(a);F=new Uint16Array(a);G=new Int32Array(a);H=new Uint32Array(a);ia=new Float32Array(a);ra=new Float64Array(a);pa=new BigInt64Array(a);qa=new BigUint64Array(a)} +function va(){p?(wa(ua.Pa,ua.Qa),xa(),removeEventListener("message",ya),za=za.forEach(Aa),addEventListener("message",Aa)):I.V()}var J=0,K=null;function Ba(a){a="Aborted("+a+")";A(a);oa=!0;a=new WebAssembly.RuntimeError(a+". Build with -sASSERTIONS for more info.");ca(a);throw a;}var Ca;async function Da(a){try{var b=await ka(a);return new Uint8Array(b)}catch{}if(la)a=la(a);else throw"both async and sync fetching of the wasm failed";return a} +async function Ea(a,b){try{var c=await Da(a);return await WebAssembly.instantiate(c,b)}catch(d){A(`failed to asynchronously prepare wasm: ${d}`),Ba(d)}}async function Fa(a){var b=Ca;if("function"==typeof WebAssembly.instantiateStreaming)try{var c=fetch(b,{credentials:"same-origin"});return await WebAssembly.instantiateStreaming(c,a)}catch(d){A(`wasm streaming compile failed: ${d}`),A("falling back to ArrayBuffer instantiation")}return Ea(b,a)} +function Ia(){Ja={b:Ka,c:La,L:Ma,q:Na,P:Oa,o:Pa,i:Qa,f:Ra,N:Sa,G:Ta,j:Ua,p:Va,M:Wa,h:Xa,d:Ya,O:Za,m:$a,Q:ab,E:bb,s:cb,t:db,H:eb,A:fb,y:gb,z:hb,w:ib,u:jb,B:kb,x:lb,v:mb,D:nb,R:ob,T:pb,S:qb,e:rb,k:sb,l:ub,C:vb,I:wb,J:xb,K:yb,n:zb,g:Ab,a:B,r:Bb,F:Cb,U:Db};return{a:Ja}}class Eb{name="ExitStatus";constructor(a){this.message=`Program terminated with exit(${a})`;this.status=a}} +var za=[],Bb=a=>{throw new Eb(a);},zb=a=>{throw new Eb(a);},Fb=a=>{if(!oa)try{a()}catch(b){if(!(b instanceof Eb||"unwind"==b))throw b;}},Gb=[],Hb,Ib=a=>{var b=Gb[a];b||(Gb[a]=b=Hb.get(a));return b},Aa=a=>{let b=a.data,c=b._wsc;c&&Fb(()=>Ib(c)(...b.x))},ya=a=>{za.push(a)},Jb=new TextDecoder,L=(a,b)=>{if(!a)return"";b=a+b;for(var c=a;!(c>=b)&&(x(),y)[c];)++c;return Jb.decode((x(),y).slice(a,c))},Ka=(a,b,c,d)=>Ba(`Assertion failed: ${L(a)}, at: `+[b?L(b):"unknown filename",c,d?L(d):"unknown function"]); +class Kb{constructor(a){this.da=a-24}}var Lb=0,Mb=0,La=(a,b,c)=>{var d=new Kb(a);(x(),H)[d.da+16>>2]=0;(x(),H)[d.da+4>>2]=b;(x(),H)[d.da+8>>2]=c;Lb=a;Mb++;throw Lb;},Ma=()=>Ba(""),Nb,M=a=>{for(var b="";(x(),y)[a];)b+=Nb[(x(),y)[a++]];return b},N={},O={},Ob={},P=class extends Error{constructor(a){super(a);this.name="BindingError"}},Pb=a=>{throw new P(a);}; +function Qb(a,b,c={}){var d=b.name;if(!a)throw new P(`type "${d}" must have a positive integer typeid pointer`);if(O.hasOwnProperty(a)){if(c.Ja)return;throw new P(`Cannot register type '${d}' twice`);}O[a]=b;delete Ob[a];N.hasOwnProperty(a)&&(b=N[a],delete N[a],b.forEach(e=>e()))}function Q(a,b,c={}){return Qb(a,b,c)} +var Rb=(a,b,c)=>{switch(b){case 1:return c?d=>(x(),C)[d]:d=>(x(),y)[d];case 2:return c?d=>(x(),D)[d>>1]:d=>(x(),F)[d>>1];case 4:return c?d=>(x(),G)[d>>2]:d=>(x(),H)[d>>2];case 8:return c?d=>(x(),pa)[d>>3]:d=>(x(),qa)[d>>3];default:throw new TypeError(`invalid integer width (${b}): ${a}`);}},Na=(a,b,c,d,e)=>{b=M(b);d=0n===d;let f=g=>g;if(d){const g=8*c;f=h=>BigInt.asUintN(g,h);e=f(e)}Q(a,{name:b,fromWireType:f,toWireType:(g,h)=>{"number"==typeof h&&(h=BigInt(h));return h},la:R,readValueFromPointer:Rb(b, +c,!d),ja:null})},R=8,Oa=(a,b,c,d)=>{b=M(b);Q(a,{name:b,fromWireType:function(e){return!!e},toWireType:function(e,f){return f?c:d},la:R,readValueFromPointer:function(e){return this.fromWireType((x(),y)[e])},ja:null})},Sb=a=>{throw new P(a.ba.ea.ca.name+" instance already deleted");},Tb=!1,Ub=()=>{},S=a=>{if("undefined"===typeof FinalizationRegistry)return S=b=>b,a;Tb=new FinalizationRegistry(b=>{b=b.ba;--b.count.value;0===b.count.value&&(b.ha?b.ka.ma(b.ha):b.ea.ca.ma(b.da))});S=b=>{var c=b.ba;c.ha&& +Tb.register(b,{ba:c},b);return b};Ub=b=>{Tb.unregister(b)};return S(a)},Vb=[];function Wb(){} +var Xb=(a,b)=>Object.defineProperty(b,"name",{value:a}),Yb={},Zb=(a,b,c)=>{if(void 0===a[b].ga){var d=a[b];a[b]=function(...e){if(!a[b].ga.hasOwnProperty(e.length))throw new P(`Function '${c}' called with an invalid number of arguments (${e.length}) - expects one of (${a[b].ga})!`);return a[b].ga[e.length].apply(this,e)};a[b].ga=[];a[b].ga[d.qa]=d}},$b=(a,b,c)=>{if(k.hasOwnProperty(a)){if(void 0===c||void 0!==k[a].ga&&void 0!==k[a].ga[c])throw new P(`Cannot register public name '${a}' twice`);Zb(k, +a,a);if(k[a].ga.hasOwnProperty(c))throw new P(`Cannot register multiple overloads of a function with the same number of arguments (${c})!`);k[a].ga[c]=b}else k[a]=b,k[a].qa=c},ac=a=>{a=a.replace(/[^a-zA-Z0-9_]/g,"$");var b=a.charCodeAt(0);return 48<=b&&57>=b?`_${a}`:a};function bc(a,b,c,d,e,f,g,h){this.name=a;this.constructor=b;this.oa=c;this.ma=d;this.ia=e;this.Ha=f;this.ua=g;this.Fa=h;this.La=[]} +var cc=(a,b,c)=>{for(;b!==c;){if(!b.ua)throw new P(`Expected null or instance of ${c.name}, got an instance of ${b.name}`);a=b.ua(a);b=b.ia}return a},dc=a=>{if(null===a)return"null";var b=typeof a;return"object"===b||"array"===b||"function"===b?a.toString():""+a}; +function ec(a,b){if(null===b){if(this.za)throw new P(`null is not a valid ${this.name}`);return 0}if(!b.ba)throw new P(`Cannot pass "${dc(b)}" as a ${this.name}`);if(!b.ba.da)throw new P(`Cannot pass deleted object as a pointer of type ${this.name}`);return cc(b.ba.da,b.ba.ea.ca,this.ca)} +function fc(a,b){if(null===b){if(this.za)throw new P(`null is not a valid ${this.name}`);if(this.xa){var c=this.Ma();null!==a&&a.push(this.ma,c);return c}return 0}if(!b||!b.ba)throw new P(`Cannot pass "${dc(b)}" as a ${this.name}`);if(!b.ba.da)throw new P(`Cannot pass deleted object as a pointer of type ${this.name}`);if(!this.wa&&b.ba.ea.wa)throw new P(`Cannot convert argument of type ${b.ba.ka?b.ba.ka.name:b.ba.ea.name} to parameter type ${this.name}`);c=cc(b.ba.da,b.ba.ea.ca,this.ca);if(this.xa){if(void 0=== +b.ba.ha)throw new P("Passing raw pointer to smart pointer is illegal");switch(this.Oa){case 0:if(b.ba.ka===this)c=b.ba.ha;else throw new P(`Cannot convert argument of type ${b.ba.ka?b.ba.ka.name:b.ba.ea.name} to parameter type ${this.name}`);break;case 1:c=b.ba.ha;break;case 2:if(b.ba.ka===this)c=b.ba.ha;else{var d=b.clone();c=this.Na(c,gc(()=>d["delete"]()));null!==a&&a.push(this.ma,c)}break;default:throw new P("Unsupporting sharing policy");}}return c} +function hc(a,b){if(null===b){if(this.za)throw new P(`null is not a valid ${this.name}`);return 0}if(!b.ba)throw new P(`Cannot pass "${dc(b)}" as a ${this.name}`);if(!b.ba.da)throw new P(`Cannot pass deleted object as a pointer of type ${this.name}`);if(b.ba.ea.wa)throw new P(`Cannot convert argument of type ${b.ba.ea.name} to parameter type ${this.name}`);return cc(b.ba.da,b.ba.ea.ca,this.ca)}function ic(a){return this.fromWireType((x(),H)[a>>2])} +var jc=(a,b,c)=>{if(b===c)return a;if(void 0===c.ia)return null;a=jc(a,b,c.ia);return null===a?null:c.Fa(a)},kc={},lc=(a,b)=>{if(void 0===b)throw new P("ptr should not be undefined");for(;a.ia;)b=a.ua(b),a=a.ia;return kc[b]},mc=class extends Error{constructor(a){super(a);this.name="InternalError"}},nc=(a,b)=>{if(!b.ea||!b.da)throw new mc("makeClassHandle requires ptr and ptrType");if(!!b.ka!==!!b.ha)throw new mc("Both smartPtrType and smartPtr must be specified");b.count={value:1};return S(Object.create(a, +{ba:{value:b,writable:!0}}))};function oc(a,b,c,d,e,f,g,h,l,n,m){this.name=a;this.ca=b;this.za=c;this.wa=d;this.xa=e;this.Ka=f;this.Oa=g;this.Ca=h;this.Ma=l;this.Na=n;this.ma=m;e||void 0!==b.ia?this.toWireType=fc:(this.toWireType=d?ec:hc,this.ja=null)} +var pc=(a,b,c)=>{if(!k.hasOwnProperty(a))throw new mc("Replacing nonexistent public symbol");void 0!==k[a].ga&&void 0!==c?k[a].ga[c]=b:(k[a]=b,k[a].qa=c)},T=(a,b)=>{a=M(a);var c=Ib(b);if("function"!=typeof c)throw new P(`unknown function pointer with signature ${a}: ${b}`);return c};class qc extends Error{} +var sc=a=>{a=rc(a);var b=M(a);U(a);return b},tc=(a,b)=>{function c(f){e[f]||O[f]||(Ob[f]?Ob[f].forEach(c):(d.push(f),e[f]=!0))}var d=[],e={};b.forEach(c);throw new qc(`${a}: `+d.map(sc).join([", "]));},V=(a,b,c)=>{function d(h){h=c(h);if(h.length!==a.length)throw new mc("Mismatched type converter count");for(var l=0;lOb[h]=b);var e=Array(b.length),f=[],g=0;b.forEach((h,l)=>{O.hasOwnProperty(h)?e[l]=O[h]:(f.push(h),N.hasOwnProperty(h)||(N[h]=[]),N[h].push(()=> +{e[l]=O[h];++g;g===f.length&&d(e)}))});0===f.length&&d(e)},Pa=(a,b,c,d,e,f,g,h,l,n,m,r,t)=>{m=M(m);f=T(e,f);h&&=T(g,h);n&&=T(l,n);t=T(r,t);var w=ac(m);$b(w,function(){tc(`Cannot construct ${m} due to unbound types`,[d])});V([a,b,c],d?[d]:[],v=>{v=v[0];if(d){var z=v.ca;var Z=z.oa}else Z=Wb.prototype;v=Xb(m,function(...Ga){if(Object.getPrototypeOf(this)!==Ha)throw new P(`Use 'new' to construct ${m}`);if(void 0===E.na)throw new P(`${m} has no accessible constructor`);var tb=E.na[Ga.length];if(void 0=== +tb)throw new P(`Tried to invoke ctor of ${m} with invalid number of parameters (${Ga.length}) - expected (${Object.keys(E.na).toString()}) parameters instead!`);return tb.apply(this,Ga)});var Ha=Object.create(Z,{constructor:{value:v}});v.prototype=Ha;var E=new bc(m,v,Ha,t,z,f,h,n);if(E.ia){var aa;(aa=E.ia).Aa??(aa.Aa=[]);E.ia.Aa.push(E)}z=new oc(m,E,!0,!1,!1);aa=new oc(m+"*",E,!1,!1,!1);Z=new oc(m+" const*",E,!1,!0,!1);Yb[a]={pointerType:aa,Ea:Z};pc(w,v);return[z,aa,Z]})},uc=(a,b)=>{for(var c=[], +d=0;d>2]);return c},vc=a=>{for(;a.length;){var b=a.pop();a.pop()(b)}};function wc(a){for(var b=1;bg)throw new P("argTypes array size mismatch! Must at least get return value and 'this' types!");var h=null!==b[1]&&null!==c,l=wc(b);c="void"!==b[0].name;d=[a,Pb,d,e,vc,b[0],b[1]];for(e=0;e{var g=uc(b,c);e=T(d,e);V([],[a],h=>{h=h[0];var l=`constructor ${h.name}`;void 0===h.ca.na&&(h.ca.na=[]);if(void 0!==h.ca.na[b-1])throw new P(`Cannot register multiple constructors with identical number of parameters (${b-1}) for class '${h.name}'! Overload resolution is currently only performed using the parameter count, not actual type info!`);h.ca.na[b-1]=()=>{tc(`Cannot construct ${h.name} due to unbound types`,g)};V([],g,n=>{n.splice(1,0,null);h.ca.na[b-1]=xc(l,n,null, +e,f);return[]});return[]})},yc=a=>{a=a.trim();const b=a.indexOf("(");return-1===b?a:a.slice(0,b)},Ra=(a,b,c,d,e,f,g,h,l)=>{var n=uc(c,d);b=M(b);b=yc(b);f=T(e,f);V([],[a],m=>{function r(){tc(`Cannot call ${t} due to unbound types`,n)}m=m[0];var t=`${m.name}.${b}`;b.startsWith("@@")&&(b=Symbol[b.substring(2)]);h&&m.ca.La.push(b);var w=m.ca.oa,v=w[b];void 0===v||void 0===v.ga&&v.className!==m.name&&v.qa===c-2?(r.qa=c-2,r.className=m.name,w[b]=r):(Zb(w,b,t),w[b].ga[c-2]=r);V([],n,z=>{z=xc(t,z,m,f,g,l); +void 0===w[b].ga?(z.qa=c-2,w[b]=z):w[b].ga[c-2]=z;return[]});return[]})},zc=[],W=[0,1,,1,null,1,!0,1,!1,1],gc=a=>{switch(a){case void 0:return 2;case null:return 4;case !0:return 6;case !1:return 8;default:const b=zc.pop()||W.length;W[b]=a;W[b+1]=1;return b}},Ac={name:"emscripten::val",fromWireType:a=>{if(!a)throw new P(`Cannot use deleted val. handle = ${a}`);var b=W[a];9gc(b),la:R,readValueFromPointer:ic,ja:null},Sa=a=>Q(a,Ac), +Bc=(a,b,c)=>{switch(b){case 1:return c?function(d){return this.fromWireType((x(),C)[d])}:function(d){return this.fromWireType((x(),y)[d])};case 2:return c?function(d){return this.fromWireType((x(),D)[d>>1])}:function(d){return this.fromWireType((x(),F)[d>>1])};case 4:return c?function(d){return this.fromWireType((x(),G)[d>>2])}:function(d){return this.fromWireType((x(),H)[d>>2])};default:throw new TypeError(`invalid integer width (${b}): ${a}`);}},Ta=(a,b,c,d)=>{function e(){}b=M(b);e.values={};Q(a, +{name:b,constructor:e,fromWireType:function(f){return this.constructor.values[f]},toWireType:(f,g)=>g.value,la:R,readValueFromPointer:Bc(b,c,d),ja:null});$b(b,e)},Cc=a=>{var b=O[a];if(void 0===b)throw a=`${"enum"} has unknown type ${sc(a)}`,new P(a);return b},Ua=(a,b,c)=>{var d=Cc(a);b=M(b);a=d.constructor;d=Object.create(d.constructor.prototype,{value:{value:c},constructor:{value:Xb(`${d.name}_${b}`,function(){})}});a.values[c]=d;a[b]=d},Dc=(a,b)=>{switch(b){case 4:return function(c){return this.fromWireType((x(), +ia)[c>>2])};case 8:return function(c){return this.fromWireType((x(),ra)[c>>3])};default:throw new TypeError(`invalid float width (${b}): ${a}`);}},Va=(a,b,c)=>{b=M(b);Q(a,{name:b,fromWireType:d=>d,toWireType:(d,e)=>e,la:R,readValueFromPointer:Dc(b,c),ja:null})},Wa=(a,b,c,d,e,f,g)=>{var h=uc(b,c);a=M(a);a=yc(a);e=T(d,e);$b(a,function(){tc(`Cannot call ${a} due to unbound types`,h)},b-1);V([],h,l=>{pc(a,xc(a,[l[0],null].concat(l.slice(1)),null,e,f,g),b-1);return[]})},Xa=(a,b,c,d,e)=>{b=M(b);let f=h=> +h;if(0===d){var g=32-8*c;f=h=>h<>>g;e=f(e)}Q(a,{name:b,fromWireType:f,toWireType:(h,l)=>l,la:R,readValueFromPointer:Rb(b,c,0!==d),ja:null})},Ya=(a,b,c)=>{function d(f){var g=(x(),H)[f>>2];f=(x(),H)[f+4>>2];return new e((x(),C).buffer,f,g)}var e=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array][b];c=M(c);Q(a,{name:c,fromWireType:d,la:R,readValueFromPointer:d},{Ja:!0})},Ec=(a,b,c,d)=>{if(!(0=g){var h=a.charCodeAt(++f);g=65536+((g&1023)<<10)|h&1023}if(127>=g){if(c>=d)break;b[c++]=g}else{if(2047>=g){if(c+1>=d)break;b[c++]=192|g>>6}else{if(65535>=g){if(c+2>=d)break;b[c++]=224|g>>12}else{if(c+3>=d)break;b[c++]=240|g>>18;b[c++]=128|g>>12&63}b[c++]=128|g>>6&63}b[c++]=128|g&63}}b[c]=0;return c-e},X=(a,b,c)=>Ec(a,(x(),y),b,c),Y=a=>{for(var b=0,c=0;c=d?b++:2047>=d?b+=2:55296<=d&&57343>=d?(b+=4, +++c):b+=3}return b},Za=(a,b)=>{b=M(b);Q(a,{name:b,fromWireType:function(c){for(var d=(x(),H)[c>>2],e=c+4,f,g=e,h=0;h<=d;++h){var l=e+h;if(h==d||0==(x(),y)[l])g=L(g,l-g),void 0===f?f=g:(f+=String.fromCharCode(0),f+=g),g=l+1}U(c);return f},toWireType:function(c,d){d instanceof ArrayBuffer&&(d=new Uint8Array(d));var e="string"==typeof d;if(!(e||ArrayBuffer.isView(d)&&1==d.BYTES_PER_ELEMENT))throw new P("Cannot pass non-string to std::string");var f=e?Y(d):d.length;var g=u(4+f+1),h=g+4;(x(),H)[g>>2]= +f;e?X(d,h,f+1):(x(),y).set(d,h);null!==c&&c.push(U,g);return g},la:R,readValueFromPointer:ic,ja(c){U(c)}})},Fc=new TextDecoder("utf-16le"),Gc=(a,b)=>{a>>=1;b=a+b/2;for(var c=a;!(c>=b)&&(x(),F)[c];)++c;return Fc.decode((x(),F).buffer instanceof ArrayBuffer?(x(),F).subarray(a,c):(x(),F).slice(a,c))},Hc=(a,b,c)=>{c??=2147483647;if(2>c)return 0;c-=2;var d=b;c=c<2*a.length?c/2:a.length;for(var e=0;e>1]=f;b+=2}(x(),D)[b>>1]=0;return b-d},Ic=a=>2*a.length,Jc=(a,b)=> +{for(var c=0,d="";!(c>=b/4);){var e=(x(),G)[a+4*c>>2];if(0==e)break;++c;65536<=e?(e-=65536,d+=String.fromCharCode(55296|e>>10,56320|e&1023)):d+=String.fromCharCode(e)}return d},Kc=(a,b,c)=>{c??=2147483647;if(4>c)return 0;var d=b;c=d+c-4;for(var e=0;e=f){var g=a.charCodeAt(++e);f=65536+((f&1023)<<10)|g&1023}(x(),G)[b>>2]=f;b+=4;if(b+4>c)break}(x(),G)[b>>2]=0;return b-d},Lc=a=>{for(var b=0,c=0;c= +d&&++c;b+=4}return b},$a=(a,b,c)=>{c=M(c);if(2===b){var d=Gc;var e=Hc;var f=Ic;var g=h=>(x(),F)[h>>1]}else 4===b&&(d=Jc,e=Kc,f=Lc,g=h=>(x(),H)[h>>2]);Q(a,{name:c,fromWireType:h=>{for(var l=(x(),H)[h>>2],n,m=h+4,r=0;r<=l;++r){var t=h+4+r*b;if(r==l||0==g(t))m=d(m,t-m),void 0===n?n=m:(n+=String.fromCharCode(0),n+=m),m=t+b}U(h);return n},toWireType:(h,l)=>{if("string"!=typeof l)throw new P(`Cannot pass non-string to C++ string type ${c}`);var n=f(l),m=u(4+n+b);(x(),H)[m>>2]=n/b;e(l,m+4,n+b);null!==h&& +h.push(U,m);return m},la:R,readValueFromPointer:ic,ja(h){U(h)}})},ab=(a,b)=>{b=M(b);Q(a,{Ta:!0,name:b,la:0,fromWireType:()=>{},toWireType:()=>{}})},Mc={},Nc=1,bb=(a,b)=>{let c;c=Mc[Nc]=new Worker(ja+"Vosklet.js",{name:"em-ww"});c.postMessage({Ya:Nc,Da:na,Ra:B,Pa:a,Qa:b});c.onmessage=Aa;return Nc++},cb=()=>{},Oc={},ub=()=>performance.now(),db=(a,b)=>{Oc[a]&&(clearTimeout(Oc[a].id),delete Oc[a]);if(!b)return 0;var c=setTimeout(()=>{delete Oc[a];Fb(()=>Pc(a,performance.now()))},b);Oc[a]={id:c,Xa:b}; +return 0},eb=(a,b,c,d)=>{var e=(new Date).getFullYear(),f=(new Date(e,0,1)).getTimezoneOffset();e=(new Date(e,6,1)).getTimezoneOffset();var g=Math.max(f,e);(x(),H)[a>>2]=60*g;(x(),G)[b>>2]=Number(f!=e);b=h=>{var l=Math.abs(h);return`UTC${0<=h?"-":"+"}${String(Math.floor(l/60)).padStart(2,"0")}${String(l%60).padStart(2,"0")}`};a=b(f);b=b(e);e(x(),y).set(Qc[a].Ga,b),Rc=[],gb=()=>Rc.length,Qc=[],hb=()=>Qc.length,ib=(a,b)=>{a=Rc[a].Sa;X(a,b,Y(a)+ +1)},jb=a=>Qc[a].mode,kb=a=>Qc[a].Ga.length,lb=(a,b)=>{a=Rc[a].Va;X(a,b,Y(a)+1)},mb=(a,b)=>{a=Qc[a].Wa;X(a,b,Y(a)+1)},Sc=[],nb=()=>{a:{if(!Sc.length){var a=null;"undefined"!=typeof window&&"function"==typeof window.prompt&&(a=window.prompt("Input: "),null!==a&&(a+="\n"));if(!a){var b=null;break a}b=Array(Y(a)+1);a=Ec(a,b,0,b.length);b.length=a;Sc=b}b=Sc.shift()}return"number"===typeof b?b:-1},ob=a=>{console.error(L(a))},pb=a=>{console.log(L(a))},qb=a=>{console.warn(L(a))},rb=()=>Date.now(),sb=a=>A(L(a)), +vb=a=>ma(L(a)),wb=a=>{var b=(x(),y).length;a>>>=0;if(a<=b||2147483648=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);a:{d=(Math.min(2147483648,65536*Math.ceil(Math.max(a,d)/65536))-B.buffer.byteLength+65535)/65536|0;try{B.grow(d);sa();var e=1;break a}catch(f){}e=void 0}if(e)return!0}return!1},Tc={},Vc=()=>{if(!Uc){var a={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:("object"==typeof navigator&&navigator.languages&&navigator.languages[0]|| +"C").replace("-","_")+".UTF-8",_:"./this.program"},b;for(b in Tc)void 0===Tc[b]?delete a[b]:a[b]=Tc[b];var c=[];for(b in a)c.push(`${b}=${a[b]}`);Uc=c}return Uc},Uc,xb=(a,b)=>{var c=0,d=0,e;for(e of Vc()){var f=b+c;(x(),H)[a+d>>2]=f;c+=X(e,f,Infinity)+1;d+=4}return 0},yb=(a,b)=>{var c=Vc();(x(),H)[a>>2]=c.length;a=0;for(var d of c)a+=Y(d)+1;(x(),H)[b>>2]=a;return 0},Wc=()=>a=>a.set(crypto.getRandomValues(new Uint8Array(a.byteLength))),Xc=a=>{(Xc=Wc())(a)},Cb=(a,b)=>{Xc((x(),y).subarray(a,a+b));return 0}, +Yc=Array(256),Zc=0;256>Zc;++Zc)Yc[Zc]=String.fromCharCode(Zc);Nb=Yc; +(()=>{let a=Wb.prototype;Object.assign(a,{isAliasOf:function(c){if(!(this instanceof Wb&&c instanceof Wb))return!1;var d=this.ba.ea.ca,e=this.ba.da;c.ba=c.ba;var f=c.ba.ea.ca;for(c=c.ba.da;d.ia;)e=d.ua(e),d=d.ia;for(;f.ia;)c=f.ua(c),f=f.ia;return d===f&&e===c},clone:function(){this.ba.da||Sb(this);if(this.ba.ta)return this.ba.count.value+=1,this;var c=S,d=Object,e=d.create,f=Object.getPrototypeOf(this),g=this.ba;c=c(e.call(d,f,{ba:{value:{count:g.count,sa:g.sa,ta:g.ta,da:g.da,ea:g.ea,ha:g.ha,ka:g.ka}}})); +c.ba.count.value+=1;c.ba.sa=!1;return c},["delete"](){this.ba.da||Sb(this);if(this.ba.sa&&!this.ba.ta)throw new P("Object already scheduled for deletion");Ub(this);var c=this.ba;--c.count.value;0===c.count.value&&(c.ha?c.ka.ma(c.ha):c.ea.ca.ma(c.da));this.ba.ta||(this.ba.ha=void 0,this.ba.da=void 0)},isDeleted:function(){return!this.ba.da},deleteLater:function(){this.ba.da||Sb(this);if(this.ba.sa&&!this.ba.ta)throw new P("Object already scheduled for deletion");Vb.push(this);this.ba.sa=!0;return this}}); const b=Symbol.dispose;b&&(a[b]=a["delete"])})(); -Object.assign(xb.prototype,{Ga(a){this.Ba&&(a=this.Ba(a));return a},Aa(a){this.la?.(a)},ka:8,readValueFromPointer:rb,fromWireType:function(a){function b(){return this.wa?wb(this.ba.na,{da:this.Ia,ca:c,ja:this,ga:a}):wb(this.ba.na,{da:this,ca:a})}var c=this.Ga(a);if(!c)return this.Aa(a),null;var d=ub(this.ba,c);if(void 0!==d){if(0===d.aa.count.value)return d.aa.ca=c,d.aa.ga=a,d.clone();d=d.clone();this.Aa(a);return d}d=this.ba.Fa(c);d=hb[d];if(!d)return b.call(this);d=this.va?d.Ca:d.pointerType;var e= -sb(c,this.ba,d.ba);return null===e?b.call(this):this.wa?wb(d.ba.na,{da:d,ca:e,ja:this,ga:a}):wb(d.ba.na,{da:d,ca:e})}});T.push(0,1,void 0,1,null,1,!0,1,!1,1);n.count_emval_handles=()=>T.length/2-5-Jb.length;fa&&(Wb[0]=this,addEventListener("message",Da));function hc(a,b,c){da?p[a].dispatchEvent(new CustomEvent(ha[b],{detail:0==c?null:J(c)})):self.postMessage([a,b,c])} -var jc={b:(a,b,c,d)=>Ga(`Assertion failed: ${J(a)}, at: `+[b?J(b):"unknown filename",c,d?J(d):"unknown function"]),c:(a,b,c)=>{var d=new Ta(a);F()[d.ca+16>>2]=0;F()[d.ca+4>>2]=b;F()[d.ca+8>>2]=c;Ua=a;Va++;throw Ua;},L:()=>Ga(""),q:(a,b,c)=>{b=K(b);O(a,{name:b,fromWireType:d=>d,toWireType:function(d,e){if("bigint"!=typeof e&&"number"!=typeof e)throw new TypeError(`Cannot convert "${Wa(e)}" to ${this.name}`);"number"==typeof e&&(e=BigInt(e));return e},ka:8,readValueFromPointer:ab(b,c,-1==b.indexOf("u")), -ia:null})},P:(a,b,c,d)=>{b=K(b);O(a,{name:b,fromWireType:function(e){return!!e},toWireType:function(e,f){return f?c:d},ka:8,readValueFromPointer:function(e){return this.fromWireType(t()[e])},ia:null})},o:(a,b,c,d,e,f,g,h,k,m,l,q,r)=>{l=K(l);f=Q(e,f);h&&=Q(g,h);m&&=Q(k,m);r=Q(q,r);var w=kb(l);jb(w,function(){Db(`Cannot construct ${l} due to unbound types`,[d])});S([a,b,c],d?[d]:[],u=>{u=u[0];if(d){var z=u.ba;var Y=z.na}else Y=fb.prototype;u=gb(l,function(...Na){if(Object.getPrototypeOf(this)!==Oa)throw new N(`Use 'new' to construct ${l}`); -if(void 0===E.ma)throw new N(`${l} has no accessible constructor`);var zb=E.ma[Na.length];if(void 0===zb)throw new N(`Tried to invoke ctor of ${l} with invalid number of parameters (${Na.length}) - expected (${Object.keys(E.ma).toString()}) parameters instead!`);return zb.apply(this,Na)});var Oa=Object.create(Y,{constructor:{value:u}});u.prototype=Oa;var E=new lb(l,u,Oa,r,z,f,h,m);if(E.ha){var Z;(Z=E.ha).za??(Z.za=[]);E.ha.za.push(E)}z=new xb(l,E,!0,!1,!1);Z=new xb(l+"*",E,!1,!1,!1);Y=new xb(l+" const*", -E,!1,!0,!1);hb[a]={pointerType:Z,Ca:Y};yb(w,u);return[z,Z,Y]})},i:(a,b,c,d,e,f)=>{var g=Eb(b,c);e=Q(d,e);S([],[a],h=>{h=h[0];var k=`constructor ${h.name}`;void 0===h.ba.ma&&(h.ba.ma=[]);if(void 0!==h.ba.ma[b-1])throw new N(`Cannot register multiple constructors with identical number of parameters (${b-1}) for class '${h.name}'! Overload resolution is currently only performed using the parameter count, not actual type info!`);h.ba.ma[b-1]=()=>{Db(`Cannot construct ${h.name} due to unbound types`,g)}; -S([],g,m=>{m.splice(1,0,null);h.ba.ma[b-1]=Hb(k,m,null,e,f);return[]});return[]})},f:(a,b,c,d,e,f,g,h,k)=>{var m=Eb(c,d);b=K(b);b=Ib(b);f=Q(e,f);S([],[a],l=>{function q(){Db(`Cannot call ${r} due to unbound types`,m)}l=l[0];var r=`${l.name}.${b}`;b.startsWith("@@")&&(b=Symbol[b.substring(2)]);h&&l.ba.Ja.push(b);var w=l.ba.na,u=w[b];void 0===u||void 0===u.fa&&u.className!==l.name&&u.qa===c-2?(q.qa=c-2,q.className=l.name,w[b]=q):(ib(w,b,r),w[b].fa[c-2]=q);S([],m,z=>{z=Hb(r,z,l,f,g,k);void 0===w[b].fa? -(z.qa=c-2,w[b]=z):w[b].fa[c-2]=z;return[]});return[]})},N:a=>O(a,Kb),G:(a,b,c,d)=>{function e(){}b=K(b);e.values={};O(a,{name:b,constructor:e,fromWireType:function(f){return this.constructor.values[f]},toWireType:(f,g)=>g.value,ka:8,readValueFromPointer:Lb(b,c,d),ia:null});jb(b,e)},j:(a,b,c)=>{var d=Mb(a);b=K(b);a=d.constructor;d=Object.create(d.constructor.prototype,{value:{value:c},constructor:{value:gb(`${d.name}_${b}`,function(){})}});a.values[c]=d;a[b]=d},p:(a,b,c)=>{b=K(b);O(a,{name:b,fromWireType:d=> -d,toWireType:(d,e)=>e,ka:8,readValueFromPointer:Nb(b,c),ia:null})},M:(a,b,c,d,e,f,g)=>{var h=Eb(b,c);a=K(a);a=Ib(a);e=Q(d,e);jb(a,function(){Db(`Cannot call ${a} due to unbound types`,h)},b-1);S([],h,k=>{yb(a,Hb(a,[k[0],null].concat(k.slice(1)),null,e,f,g),b-1);return[]})},h:(a,b,c,d,e)=>{b=K(b);-1===e&&(e=4294967295);e=h=>h;if(0===d){var f=32-8*c;e=h=>h<>>f}var g=b.includes("unsigned")?function(h,k){return k>>>0}:function(h,k){return k};O(a,{name:b,fromWireType:e,toWireType:g,ka:8,readValueFromPointer:ab(b, -c,0!==d),ia:null})},d:(a,b,c)=>{function d(f){var g=F()[f>>2];f=F()[f+4>>2];return new e(B().buffer,f,g)}var e=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array][b];c=K(c);O(a,{name:c,fromWireType:d,ka:8,readValueFromPointer:d},{Ha:!0})},O:(a,b)=>{b=K(b);O(a,{name:b,fromWireType:function(c){for(var d=F()[c>>2],e=c+4,f,g=e,h=0;h<=d;++h){var k=e+h;if(h==d||0==t()[k])g=J(g,k-g),void 0===f?f=g:(f+=String.fromCharCode(0),f+=g),g= -k+1}R(c);return f},toWireType:function(c,d){d instanceof ArrayBuffer&&(d=new Uint8Array(d));var e="string"==typeof d;if(!(e||ArrayBuffer.isView(d)&&1==d.BYTES_PER_ELEMENT))throw new N("Cannot pass non-string to std::string");var f=e?V(d):d.length;var g=ia(4+f+1),h=g+4;F()[g>>2]=f;e?(f+=1,U(d,t(),h,f)):t().set(d,h);null!==c&&c.push(R,g);return g},ka:8,readValueFromPointer:rb,ia(c){R(c)}})},m:(a,b,c)=>{c=K(c);if(2===b){var d=Qb;var e=Rb;var f=Sb;var g=h=>Aa()[h>>1]}else 4===b&&(d=Tb,e=Ub,f=Vb,g=h=> -F()[h>>2]);O(a,{name:c,fromWireType:h=>{for(var k=F()[h>>2],m,l=h+4,q=0;q<=k;++q){var r=h+4+q*b;if(q==k||0==g(r))l=d(l,r-l),void 0===m?m=l:(m+=String.fromCharCode(0),m+=l),l=r+b}R(h);return m},toWireType:(h,k)=>{if("string"!=typeof k)throw new N(`Cannot pass non-string to C++ string type ${c}`);var m=f(k),l=ia(4+m+b);F()[l>>2]=m/b;e(k,l+4,m+b);null!==h&&h.push(R,l);return l},ka:8,readValueFromPointer:rb,ia(h){R(h)}})},Q:(a,b)=>{b=K(b);O(a,{Oa:!0,name:b,ka:0,fromWireType:()=>{},toWireType:()=>{}})}, -E:(a,b)=>{let c;c=Wb[Xb]=new Worker(Yb);c.postMessage({$ww:Xb,wasm:oa,js:n.mainScriptUrlOrBlob||_scriptName,wasmMemory:y,sb:a,sz:b});c.onmessage=Fa;return Xb++},s:()=>{},t:(a,b)=>{W[a]&&(clearTimeout(W[a].id),delete W[a]);if(!b)return 0;var c=setTimeout(()=>{delete W[a];Ma(()=>ic(a,performance.now()))},b);W[a]={id:c,Ra:b};return 0},H:(a,b,c,d)=>{var e=(new Date).getFullYear(),f=(new Date(e,0,1)).getTimezoneOffset();e=(new Date(e,6,1)).getTimezoneOffset();var g=Math.max(f,e);F()[a>>2]=60*g;D()[b>> -2]=Number(f!=e);b=h=>{var k=Math.abs(h);return`UTC${0<=h?"-":"+"}${String(Math.floor(k/60)).padStart(2,"0")}${String(k%60).padStart(2,"0")}`};a=b(f);b=b(e);et().set(X[a].Ea,b),y:()=>Zb.length,z:()=>X.length,w:(a,b)=>{a=Zb[a].Na;var c=V(a)+1;U(a,t(),b,c)},u:a=>X[a].mode,B:a=>X[a].Ea.length,x:(a,b)=>{a=Zb[a].Pa;var c=V(a)+1;U(a,t(),b,c)},v:(a,b)=>{a=X[a].Qa;var c=V(a)+1;U(a,t(),b,c)},D:()=>{a:{if(!$b.length){var a=null;"undefined"!=typeof window&&"function"== -typeof window.prompt&&(a=window.prompt("Input: "),null!==a&&(a+="\n"));if(!a){var b=null;break a}b=Array(V(a)+1);a=U(a,b,0,b.length);b.length=a;$b=b}b=$b.shift()}return"number"===typeof b?b:-1},R:a=>{console.error(J(a))},T:a=>{console.log(J(a))},S:a=>{console.warn(J(a))},e:()=>Date.now(),k:a=>x(J(a)),l:()=>performance.now(),C:a=>na(J(a)),I:a=>{var b=t().length;a>>>=0;if(a<=b||2147483648=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,a+100663296);a:{d=(Math.min(2147483648,65536*Math.ceil(Math.max(a, -d)/65536))-y.buffer.byteLength+65535)/65536|0;try{y.grow(d);C();var e=1;break a}catch(f){}e=void 0}if(e)return!0}return!1},J:(a,b)=>{var c=0;cc().forEach((d,e)=>{var f=b+c;e=F()[a+4*e>>2]=f;for(f=0;f{var c=cc();F()[a>>2]=c.length;var d=0;c.forEach(e=>d+=e.length+1);F()[b>>2]=d;return 0},n:a=>{throw new La(a);},g:hc,a:y,r:a=>{throw new La(a);},F:(a,b)=>{ec(t().subarray(a,a+b));return 0},U:function(a,b){for(let c of Object.values(Wb))c.postMessage({_wsc:a, -x:[b]}),c.onmessage=d=>hc(...d.data)}},G=await (async function(){function a(d,e){G=d.exports;Qa=G.Z;oa=e;H--;0==H&&I&&(d=I,I=null,d());return G}H++;var b={a:jc};if(n.instantiateWasm)return new Promise(d=>{n.instantiateWasm(b,(e,f)=>{a(e,f);d(e.exports)})});Ha??=v+"Vosklet.wasm";try{var c=await Ka(b);return a(c.instance,c.module)}catch(d){return ba(d),Promise.reject(d)}}()),R=G.W,ia=G.X,Bb=G.Y,ic=G._,Ca=G.$; -function kc(){0Ab(...d.data)} +var Ja,I=await (async function(){function a(d,e){I=d.exports;Hb=I._;na=e;J--;0==J&&K&&(d=K,K=null,d());return I}J++;var b=Ia();if(k.instantiateWasm)return new Promise(d=>{k.instantiateWasm(b,(e,f)=>{d(a(e,f))})});if(p)return new Promise(d=>{ta=e=>{var f=new WebAssembly.Instance(e,Ia());d(a(f,e))}});Ca??=ja+"Vosklet.wasm";try{var c=await Fa(b);return a(c.instance,c.module)}catch(d){return ca(d),Promise.reject(d)}}()),U=a=>(U=I.W)(a),u=a=>(u=I.X)(a),rc=a=>(rc=I.Y)(a),xa=()=>(xa=I.Z)(),Pc= +(a,b)=>(Pc=I.$)(a,b),wa=(a,b)=>(wa=I.aa)(a,b);function $c(){0 loadVosklet); +var isWW = globalThis.self?.name == 'em-ww'; +// When running as a wasm worker, construct a new instance on startup +isWW && loadVosklet(); diff --git a/Vosklet.wasm b/Vosklet.wasm index 2391399..c44f99e 100755 Binary files a/Vosklet.wasm and b/Vosklet.wasm differ diff --git a/src/Bindings.cc b/src/Bindings.cc index c5d2914..7c87556 100644 --- a/src/Bindings.cc +++ b/src/Bindings.cc @@ -4,32 +4,32 @@ #include using namespace emscripten; -EMSCRIPTEN_BINDINGS() { +EMSCRIPTEN_BINDINGS() +{ function("setLogLevel", &vosk_set_log_level); enum_("EpMode") - .value("ANSWER_DEFAULT", VOSK_EP_ANSWER_DEFAULT) - .value("ANSWER_SHORT", VOSK_EP_ANSWER_SHORT) - .value("ANSWER_LONG", VOSK_EP_ANSWER_LONG) - .value("ANSWER_VERY_LONG", VOSK_EP_ANSWER_VERY_LONG); + .value("ANSWER_DEFAULT", VOSK_EP_ANSWER_DEFAULT) + .value("ANSWER_SHORT", VOSK_EP_ANSWER_SHORT) + .value("ANSWER_LONG", VOSK_EP_ANSWER_LONG) + .value("ANSWER_VERY_LONG", VOSK_EP_ANSWER_VERY_LONG); class_("CommonModel") - .constructor(return_value_policy::take_ownership()) - .function("findWord", &CommonModel::findWord); + .constructor(return_value_policy::take_ownership()) + .function("findWord", &CommonModel::findWord); class_("Recognizer") - .constructor(return_value_policy::take_ownership()) - .constructor(return_value_policy::take_ownership()) - .constructor(return_value_policy::take_ownership()) - .function("safeDelete", &Recognizer::safeDelete) - .function("acceptWaveform", &Recognizer::acceptWaveform) - .function("reset", &Recognizer::reset) - .function("setEndpointerMode", &Recognizer::setEndpointerMode) - .function("setEndpointerDelays", &Recognizer::setEndpointerDelays) - .function("setWords", &Recognizer::setWords) - .function("setPartialWords", &Recognizer::setPartialWords) - .function("setGrm", &Recognizer::setGrm) - .function("setNLSML", &Recognizer::setNLSML) - .function("setSpkModel", &Recognizer::setSpkModel, allow_raw_pointers()) - .function("setMaxAlternatives", &Recognizer::setMaxAlternatives); + .constructor(return_value_policy::take_ownership()) + .constructor(return_value_policy::take_ownership()) + .constructor(return_value_policy::take_ownership()) + .function("acceptWaveform", &Recognizer::acceptWaveform, allow_raw_pointers()) + .function("reset", &Recognizer::reset) + .function("setEndpointerMode", &Recognizer::setEndpointerMode) + .function("setEndpointerDelays", &Recognizer::setEndpointerDelays) + .function("setWords", &Recognizer::setWords) + .function("setPartialWords", &Recognizer::setPartialWords) + .function("setGrm", &Recognizer::setGrm) + .function("setNLSML", &Recognizer::setNLSML) + .function("setSpkModel", &Recognizer::setSpkModel, allow_raw_pointers()) + .function("setMaxAlternatives", &Recognizer::setMaxAlternatives); }; \ No newline at end of file diff --git a/src/CommonModel.cc b/src/CommonModel.cc index ee2b114..ff5f6b8 100644 --- a/src/CommonModel.cc +++ b/src/CommonModel.cc @@ -1,19 +1,18 @@ #include "CommonModel.h" -CommonModel::CommonModel(int index, bool normalMdl, int tarStart, int tarSize) : - normalMdl{normalMdl}, index{index} +CommonModel::CommonModel(int index, bool normalMdl, int tarStart, int tarSize) : normalMdl{normalMdl}, index{index} { - globalPool.exec([this, tarStart, tarSize]{ - extractAndLoad(reinterpret_cast(tarStart), tarSize); - }); + extractAndLoad(reinterpret_cast(tarStart), tarSize); } -void CommonModel::extractAndLoad(unsigned char* tar, int tarSize) { +void CommonModel::extractAndLoad(unsigned char *tar, int tarSize) +{ // Map index onto [A-Z] const char storepath[3]{'/', static_cast(index % 26 + 'A')}; int res{untar(tar, tarSize, storepath)}; free(tar); - const char* untarErr{}; - switch(res) { + const char *untarErr{}; + switch (res) + { case IncorrectFormat: untarErr = "Untar: Incorrect tar format, must be USTAR"; break; @@ -29,20 +28,29 @@ void CommonModel::extractAndLoad(unsigned char* tar, int tarSize) { case FailedClose: untarErr = "Untar: Unable to close file after write"; }; - if(untarErr != nullptr) { - fireEv(index, Event::status, untarErr); + if (untarErr != nullptr) + { + fireEv(index, untarErr); return; } - if(normalMdl) mdl = vosk_model_new(storepath); - else mdl = vosk_spk_model_new(storepath); - if(normalMdl ? std::get(mdl) != nullptr : std::get(mdl) != nullptr) fireEv(index, status); - else fireEv(index, status, "Unable to load model for recognition"); + if (normalMdl) + mdl = vosk_model_new(storepath); + else + mdl = vosk_spk_model_new(storepath); + if (normalMdl ? std::get(mdl) != nullptr : std::get(mdl) != nullptr) + fireEv(index); + else + fireEv(index, "Unable to load model for recognition"); fs::remove_all(storepath); } -int CommonModel::findWord(std::string word) { - return vosk_model_find_word(std::get(mdl), word.c_str()); +int CommonModel::findWord(std::string word) +{ + return vosk_model_find_word(std::get(mdl), word.c_str()); } -CommonModel::~CommonModel() { - if(normalMdl) vosk_model_free(std::get(mdl)); - else vosk_spk_model_free(std::get(mdl)); +CommonModel::~CommonModel() +{ + if (normalMdl) + vosk_model_free(std::get(mdl)); + else + vosk_spk_model_free(std::get(mdl)); } \ No newline at end of file diff --git a/src/Recognizer.cc b/src/Recognizer.cc index f86c768..14f85cd 100644 --- a/src/Recognizer.cc +++ b/src/Recognizer.cc @@ -1,102 +1,74 @@ #include "Recognizer.h" #include -const char* recognizerInitErr{"Unable to initialize recognizer"}; -Recognizer::Recognizer(int index, float sampleRate, CommonModel* model) : - rec{vosk_recognizer_new(std::get(model->mdl), sampleRate)} { - if(rec == nullptr) fireEv(index, Event::status, recognizerInitErr); - else globalPool.exec([this, index]{main(index);}); -} -Recognizer::Recognizer(int index, float sampleRate, CommonModel* model, CommonModel* spkModel) : - rec{vosk_recognizer_new_spk(std::get(model->mdl), sampleRate, std::get(spkModel->mdl))} { - if(rec == nullptr) fireEv(index, Event::status, recognizerInitErr); - else globalPool.exec([this, index]{main(index);}); -} -Recognizer::Recognizer(int index, float sampleRate, CommonModel* model, const std::string& grm, int) : - rec{vosk_recognizer_new_grm(std::get(model->mdl), sampleRate, grm.c_str())} { - if(rec == nullptr) fireEv(index, Event::status, recognizerInitErr); - else globalPool.exec([this, index]{main(index);}); -} -void Recognizer::safeDelete(bool _processCurrent) { - emscripten_atomic_store_u8(&processCurrent, _processCurrent); - emscripten_atomic_store_u8(&done, true); - emscripten_atomic_store_u32(&haveData, true); - emscripten_atomic_notify(&haveData, 1); -} -void Recognizer::main(int index) { - fireEv(index, Event::status); - AudioData* next; - while(!emscripten_atomic_load_u8(&done)) { - if(dataQ.empty()) { - emscripten_atomic_store_u32(&haveData, false); - emscripten_atomic_wait_u32(&haveData, false, -1); - } - else { - next = &dataQ.front(); - switch(vosk_recognizer_accept_waveform_f(rec, next->data, next->len)) { - case 0: - fireEv(index, Event::partialResult, vosk_recognizer_partial_result(rec)); - break; - case 1: - fireEv(index, Event::result, vosk_recognizer_result(rec)); - } - free(next->data); - dataQ.pop(); - } +const char *recognizerInitErr{"Unable to initialize recognizer"}; +Recognizer::Recognizer(int index, float sampleRate, CommonModel *model) : rec{vosk_recognizer_new(std::get(model->mdl), sampleRate)} +{ + if (rec == nullptr) + { + fireEv(index, recognizerInitErr); } - if(emscripten_atomic_load_u8(&processCurrent)) { - while(!dataQ.empty()) { - free(dataQ.front().data); - dataQ.pop(); - } - } - else { - while(!dataQ.empty()) { - next = &dataQ.front(); - switch(vosk_recognizer_accept_waveform_f(rec, next->data, next->len)) { - case 0: [[likely]] - fireEv(index, Event::partialResult, vosk_recognizer_partial_result(rec)); - break; - case 1: [[unlikely]] - fireEv(index, Event::result, vosk_recognizer_result(rec)); - } - free(next->data); - dataQ.pop(); - } - } - fireEv(index, Event::result, vosk_recognizer_final_result(rec)); - vosk_recognizer_free(rec); - fireEv(index, Event::status); } -void Recognizer::acceptWaveform(int start, int len) { - dataQ.emplace(start, len); - emscripten_atomic_store_u32(&haveData, true); - emscripten_atomic_notify(&haveData, 1); +Recognizer::Recognizer(int index, float sampleRate, CommonModel *model, CommonModel *spkModel) : rec{vosk_recognizer_new_spk(std::get(model->mdl), sampleRate, std::get(spkModel->mdl))} +{ + if (rec == nullptr) + { + fireEv(index, recognizerInitErr); + } } -void Recognizer::reset() { +Recognizer::Recognizer(int index, float sampleRate, CommonModel *model, const std::string &grm, int) : rec{vosk_recognizer_new_grm(std::get(model->mdl), sampleRate, grm.c_str())} +{ + if (rec == nullptr) + { + fireEv(index, recognizerInitErr); + } +} + +const char *Recognizer::acceptWaveform(int start, int len) +{ + switch (vosk_recognizer_accept_waveform_f(rec, reinterpret_cast(start), len)) + { + case 0: + return vosk_recognizer_partial_result(rec); + break; + case 1: + return vosk_recognizer_result(rec); + } + return nullptr; +} +void Recognizer::reset() +{ vosk_recognizer_reset(rec); } -void Recognizer::setEndpointerMode(VoskEndpointerMode mode) { +void Recognizer::setEndpointerMode(VoskEndpointerMode mode) +{ vosk_recognizer_set_endpointer_mode(rec, mode); } -void Recognizer::setEndpointerDelays(float tStartMax, float tEnd, float tMax) { +void Recognizer::setEndpointerDelays(float tStartMax, float tEnd, float tMax) +{ vosk_recognizer_set_endpointer_delays(rec, tStartMax, tEnd, tMax); } -void Recognizer::setGrm(const std::string& grm) { +void Recognizer::setGrm(const std::string &grm) +{ vosk_recognizer_set_grm(rec, grm.c_str()); } -void Recognizer::setSpkModel(CommonModel* spkModel) { - vosk_recognizer_set_spk_model(rec, std::get(spkModel->mdl)); +void Recognizer::setSpkModel(CommonModel *spkModel) +{ + vosk_recognizer_set_spk_model(rec, std::get(spkModel->mdl)); } -void Recognizer::setWords(bool words) { +void Recognizer::setWords(bool words) +{ vosk_recognizer_set_words(rec, words); } -void Recognizer::setPartialWords(bool partialWords) { +void Recognizer::setPartialWords(bool partialWords) +{ vosk_recognizer_set_partial_words(rec, partialWords); } -void Recognizer::setNLSML(bool nlsml) { +void Recognizer::setNLSML(bool nlsml) +{ vosk_recognizer_set_nlsml(rec, nlsml); } -void Recognizer::setMaxAlternatives(int alts) { +void Recognizer::setMaxAlternatives(int alts) +{ vosk_recognizer_set_max_alternatives(rec, alts); } \ No newline at end of file diff --git a/src/Recognizer.h b/src/Recognizer.h index 2f58527..947da86 100644 --- a/src/Recognizer.h +++ b/src/Recognizer.h @@ -4,23 +4,19 @@ // Prevent naming conflicts with Vosk's Recognizer class #define Recognizer Recognizer_ -struct Recognizer { - int haveData{}; - bool processCurrent{}; - bool done{}; - VoskRecognizer* rec; - std::queue dataQ; - Recognizer(int index, float sampleRate, CommonModel* model); - Recognizer(int index, float sampleRate, CommonModel* model, CommonModel* spkModel); - Recognizer(int index, float sampleRate, CommonModel* model, const std::string& grm, int); - void main(int index); - void safeDelete(bool _processCurrent); - void acceptWaveform(int start, int len); +struct Recognizer +{ + int index; + VoskRecognizer *rec; + Recognizer(int index, float sampleRate, CommonModel *model); + Recognizer(int index, float sampleRate, CommonModel *model, CommonModel *spkModel); + Recognizer(int index, float sampleRate, CommonModel *model, const std::string &grm, int); + const char *acceptWaveform(int start, int len); void reset(); void setEndpointerMode(VoskEndpointerMode mode); void setEndpointerDelays(float tStartMax, float tEnd, float tMax); - void setSpkModel(CommonModel* model); - void setGrm(const std::string& grm); + void setSpkModel(CommonModel *model); + void setGrm(const std::string &grm); void setWords(bool words); void setPartialWords(bool partialWords); void setNLSML(bool nlsml); diff --git a/src/Util.cc b/src/Util.cc index 9f314fe..d4e56fc 100644 --- a/src/Util.cc +++ b/src/Util.cc @@ -1,108 +1,57 @@ #include "Util.h" -#include "emscripten/wasm_worker.h" #include "emscripten/em_js.h" +#include -EM_JS(void, fireEv, (int idx, int typeIdx, const char* content), { - if(ENVIRONMENT_IS_WEB) objs[idx].dispatchEvent(new CustomEvent(events[typeIdx], { - "detail": content == 0 ? null : UTF8ToString(content) - })); - else self.postMessage([idx, typeIdx, content]); -}); -int untar(unsigned char* tar, int tarSize, const char* storepath) { - if(std::memcmp(tar + 257, "ustar", 5)) return IncorrectFormat; +int untar(unsigned char *tar, int tarSize, const char *storepath) +{ + if (std::memcmp(tar + 257, "ustar", 5)) + return IncorrectFormat; size_t size{}; std::string path; path.reserve(100); // Max length - unsigned char* end = tar + tarSize; - while(tar <= end) { - if(tar[156] != '5' && tar[156] != 0 && - tar[156] != '0') { + unsigned char *end = tar + tarSize; + while (tar <= end) + { + if (tar[156] != '5' && tar[156] != 0 && + tar[156] != '0') + { return IncorrectFiletype; } path.clear(); - path += reinterpret_cast(tar + 345); - path += reinterpret_cast(tar); + path += reinterpret_cast(tar + 345); + path += reinterpret_cast(tar); tar += 124; - for(int i{0}; i < 11; i++) { + for (int i{0}; i < 11; i++) + { size *= 8; size += *tar - 48; tar++; } tar += 377; size_t firstSlash = path.find_first_of("/"); - if(firstSlash == std::string::npos) { - if(size != 0) tar += size + 512 - size % 512; + if (firstSlash == std::string::npos) + { + if (size != 0) + tar += size + 512 - size % 512; continue; } path = storepath + path.substr(firstSlash); std::ofstream file; - if(size == 0) fs::create_directory(path); - else { + if (size == 0) + fs::create_directory(path); + else + { file.open(path, std::ios::trunc | std::ios::binary); - if(!file) return FailedOpen; - if(!file.write(reinterpret_cast(tar), size)) return FailedWrite; + if (!file) + return FailedOpen; + if (!file.write(reinterpret_cast(tar), size)) + return FailedWrite; file.close(); - if(!file) return FailedClose; + if (!file) + return FailedClose; tar += size + 512 - size % 512; } } return Successful; -} -void workerStartup(int _pool) { - WorkerPool& pool{*reinterpret_cast(_pool)}; - std::function fn; - while(!pool.done) { - // Wait until unlocked - emscripten_atomic_wait_u32(&pool.qLock, true, -1); - if(pool.done) break; - // If there is no task then everyone has to wait until there is more - if(pool.taskQ.empty()) { - emscripten_atomic_store_u32(&pool.qLock, true); - continue; - } - // If this locks, the returned (loaded) value will be false, and we move on - if(emscripten_atomic_cas_u32(&pool.qLock, false, true)) continue; - fn = pool.taskQ.front(); - pool.taskQ.pop(); - // Unlock - emscripten_atomic_store_u32(&pool.qLock, false); - emscripten_atomic_notify(&pool.qLock, 1); - fn(); - } -} -using _startupFn = void(*)(int); -EM_JS(void, startupWorkers, (_startupFn startupFn, WorkerPool* pool), { - for(let worker of Object.values(_wasmWorkers)) { - worker.postMessage({ - "_wsc": startupFn, - "x": [ pool ] - }); - worker.onmessage = msg => fireEv(...msg.data); - } -}) -constexpr int workerStack{32768}; -std::array stacks; -WorkerPool::WorkerPool() { - for(int i{}; i < MAX_WORKERS; ++i) { - emscripten_create_wasm_worker(&stacks[i * workerStack], workerStack); - } - startupWorkers(workerStartup, this); -} -#undef MAX_WORKERS -WorkerPool::~WorkerPool() { - // LTO will remove the EM_JS definition for some reason if it isn't called in the same translation unit (I get undefined symbols), even though it is annotated with EMSCRIPTEN_KEEPALIVE. "Call" it here (this destructor is never called) to workaround that. I'm going to file an issue on Emscripten - fireEv(0, 0); - /* - done = true; - emscripten_atomic_store_u32(&qLock, false); - emscripten_atomic_notify(&qLock, -1); - emscripten_terminate_all_wasm_workers(); - */ -} -void WorkerPool::exec(std::function fn) { - taskQ.emplace(fn); - emscripten_atomic_store_u32(&qLock, false); - emscripten_atomic_notify(&qLock, 1); -} -WorkerPool globalPool; \ No newline at end of file +} \ No newline at end of file diff --git a/src/Util.h b/src/Util.h index 73d85ad..bb25c73 100644 --- a/src/Util.h +++ b/src/Util.h @@ -9,15 +9,9 @@ #include "emscripten/console.h" namespace fs = std::filesystem; -enum Event { - // Shared - status, - // Recognizer - partialResult, - result, -}; -enum UntarStatus { +enum UntarStatus +{ Successful, IncorrectFormat, IncorrectFiletype, @@ -25,25 +19,7 @@ enum UntarStatus { FailedWrite, FailedClose }; -struct AudioData { - float* data; - int len; - AudioData(int start, int len) : data{reinterpret_cast(start)}, len{len} {} -}; -#ifndef MAX_WORKERS -#define MAX_WORKERS 1 -#endif -struct WorkerPool { - bool qLock{true}; // True is locked, false is unlocked - bool done{}; - std::queue> taskQ; - WorkerPool(); - ~WorkerPool(); - void exec(std::function fn); -}; -extern "C" void fireEv(int idx, int typeIdx, const char* content = nullptr); +extern "C" void fireEv(int idx, const char *content = nullptr); -int untar(unsigned char* tar, int tarSize, const char* storepath); - -extern WorkerPool globalPool; \ No newline at end of file +int untar(unsigned char *tar, int tarSize, const char *storepath); diff --git a/src/Wrapper.js b/src/Wrapper.js index b7c786b..6d12e54 100644 --- a/src/Wrapper.js +++ b/src/Wrapper.js @@ -3,7 +3,7 @@ * @suppress {undefinedVars|checkTypes} */ -if(ENVIRONMENT_IS_WEB) { +if (ENVIRONMENT_IS_WEB) { // 'var' to expose this outside the if var objs = []; @@ -18,10 +18,10 @@ if(ENVIRONMENT_IS_WEB) { this.buf = new Float32Array(this.bufSize); } process(inputs) { - if(inputs[0][0]) { + if (inputs[0][0]) { this.buf.set(inputs[0][0], this.filled); this.filled += 128; - if(this.filled >= this.bufSize) { + if (this.filled >= this.bufSize) { this.filled = 0; this.port.postMessage(this.buf, [this.buf.buffer]); this.buf = new Float32Array(this.bufSize); @@ -42,9 +42,9 @@ if(ENVIRONMENT_IS_WEB) { static async mk(url, storepath, id, normalMdl) { let mdl = new CommonModel(); let result = new Promise((resolve, reject) => { - mdl.addEventListener('status', ev => { - if(!ev.detail) { - if(normalMdl) mdl['findWord'] = word => mdl.obj['findWord'](word); + mdl.addEventListener('', ev => { + if (!ev.detail) { + if (normalMdl) mdl['findWord'] = word => mdl.obj['findWord'](word); resolve(mdl); } else reject(ev.detail); @@ -54,7 +54,7 @@ if(ENVIRONMENT_IS_WEB) { let req = (await cache.keys(storepath, { ignoreSearch: true }))[0]; let res; if (typeof req == 'undefined' || req.url.split('?')[1] != id) { - + // Caching already handled explicitly res = await fetch(url, { cache: 'no-store' }); if (!res.ok) throw 'Unable to fetch model, status: ' + res.status; @@ -72,46 +72,30 @@ if(ENVIRONMENT_IS_WEB) { class Recognizer extends EventTarget { constructor() { super(); - - // Closure workaround to prevent acceptWaveform from getting removed - this['acceptWaveform'] = audioData => { - let start = _malloc(audioData.length * 4); - HEAPF32.set(audioData, start / 4); - this.obj['acceptWaveform'](start, audioData.length); - } objs.push(this); - return new Proxy(this, { - get(self, prop, _) { - if(self[prop] == undefined && self.obj[prop] == undefined) return; - let p = self[prop]; - if(p) return p.bind ? p.bind(self) : p; - p = self.obj[prop]; - return p.bind ? p.bind(self.obj) : p; - } - }) } - async delete(processCurrent = false) { - let result = new Promise((resolve, _) => this.addEventListener('status', _ => { - this.obj.delete(); - resolve(); - }, { once: true })); - this.obj['safeDelete'](processCurrent); - return result; + acceptWaveform(audioData) { + let start = _malloc(audioData.length * 4); + HEAPF32.set(audioData, start / 4); + return UTF8ToString(this.obj['acceptWaveform'](start, audioData.length)); + } + delete() { + this.obj.delete(); } static async mk(model, sampleRate, mode, grammar, spkModel) { let rec = new Recognizer(); let result = new Promise((resolve, reject) => { - rec.addEventListener('status', ev => { - if(!ev.detail) resolve(rec); + rec.addEventListener('', ev => { + if (!ev.detail) resolve(rec); else reject(ev.detail); }, { once: true }); }) - switch(mode) { + switch (mode) { case 1: rec.obj = new Module['Recognizer'](objs.length - 1, sampleRate, model); break; case 2: - rec.obj = new Module['Recognizer'](objs.length -1, sampleRate, model, spkModel); + rec.obj = new Module['Recognizer'](objs.length - 1, sampleRate, model, spkModel); break; default: rec.obj = new Module['Recognizer'](objs.length - 1, sampleRate, model, grammar, 0); @@ -121,12 +105,12 @@ if(ENVIRONMENT_IS_WEB) { } Module = { 'getModelCache': () => _cache, - + 'cleanUp': async () => { - for(let obj of objs) await obj.delete(); + for (let obj of objs) await obj.delete(); URL.revokeObjectURL(processorURL); }, - + 'createTransferer': async (ctx, bufSize) => { await ctx.audioWorklet.addModule(processorURL); return new AudioWorkletNode(ctx, 'VoskletTransferer', { @@ -137,21 +121,21 @@ if(ENVIRONMENT_IS_WEB) { processorOptions: [bufSize] }); }, - + 'createModel': (url, storepath, id) => CommonModel.mk(url, storepath, id, true), - + 'createSpkModel': (url, storepath, id) => CommonModel.mk(url, storepath, id, false), - + 'createRecognizer': (model, sampleRate) => Recognizer.mk(model.obj, sampleRate, 1), - + 'createRecognizerWithGrm': (model, sampleRate, grammar) => Recognizer.mk(model.obj, sampleRate, 3, grammar, null), - + 'createRecognizerWithSpkModel': (model, sampleRate, spkModel) => Recognizer.mk(model.obj, sampleRate, 2, null, spkModel.obj) } - + } \ No newline at end of file diff --git a/src/make b/src/make index 5f84650..0cba540 100755 --- a/src/make +++ b/src/make @@ -24,8 +24,8 @@ if [ "$EMSDK" = ../emsdk ] && [ ! -f "$EMSDK" ]; then echo "Installing emsdk + Emscripten..." git clone --depth=1 https://github.com/emscripten-core/emsdk.git ../emsdk && cd ../emsdk && - ./emsdk install 4.0.6 && - ./emsdk activate 4.0.6 + ./emsdk install 4.0.13 && + ./emsdk activate 4.0.13 fi . $(realpath "$EMSDK")/emsdk_env.sh && export PATH=:$PATH:$(realpath "$EMSDK")/upstream/bin && @@ -48,11 +48,10 @@ if [ ! -f "$OPENFST/lib/libfst.a" ]; then autoreconf -is && CXXFLAGS="$SHARED_FLAGS -O3 -fno-rtti" emconfigure ./configure --prefix="$OPENFST" --enable-static --disable-shared --enable-ngram-fsts --disable-bin && emmake make -j"$JOBS" install > /dev/null && - rm -rf /tmp/openfst fi if [ ! -f "$OPENBLAS/lib/libopenblas.a" ]; then rm -rf /tmp/openblas && - git clone -b v0.3.29 https://github.com/OpenMathLib/OpenBLAS --depth=1 /tmp/openblas && + git clone -b v0.3.30 https://github.com/OpenMathLib/OpenBLAS --depth=1 /tmp/openblas && cd /tmp/openblas && git apply "$SRC"/OpenBLAS.patch && @@ -61,7 +60,6 @@ if [ ! -f "$OPENBLAS/lib/libopenblas.a" ]; then openblasCFlags="$SHARED_FLAGS -fno-exceptions -fno-rtti -Wno-implicit-function-declaration -Wno-unused-function -Wno-unused-but-set-variable" make $openblasFlags CFLAGS="$openblasCFlags" PREFIX="$OPENBLAS" -j"$JOBS" > /dev/null && make $openblasFlags CFLAGS="$openblasCFlags" PREFIX="$OPENBLAS" -j"$JOBS" install && - rm -rf /tmp/openblas fi if [ ! -f "$KALDI/src/kaldi.mk" ]; then @@ -85,7 +83,7 @@ fi cd "$SRC" && voskletFiles="Util.o CommonModel.o Recognizer.o Bindings.o" -voskletFlags="$SHARED_FLAGS -fno-rtti -sSTRICT -sWASM_WORKERS=2" +voskletFlags="$SHARED_FLAGS -fno-rtti -sSTRICT -sWASM_WORKERS" voskletLDFlags="-sWASMFS -sMODULARIZE -sTEXTDECODER=2 -sEVAL_CTORS=2 -sALLOW_UNIMPLEMENTED_SYSCALLS -sINITIAL_MEMORY=$INITIAL_MEMORY -sALLOW_MEMORY_GROWTH -sPOLYFILL=0 -sEXIT_RUNTIME=0 -sINVOKE_RUN=0 -sSUPPORT_LONGJMP=0 -sINCOMING_MODULE_JS_API=wasmMemory,instantiateWasm,wasm -sEXPORT_NAME=loadVosklet -sMALLOC=emmalloc -sENVIRONMENT=web,worker -L$KALDI/src -l:online2/kaldi-online2.a -l:decoder/kaldi-decoder.a -l:ivector/kaldi-ivector.a -l:gmm/kaldi-gmm.a -l:tree/kaldi-tree.a -l:feat/kaldi-feat.a -l:cudamatrix/kaldi-cudamatrix.a -l:lat/kaldi-lat.a -l:lm/kaldi-lm.a -l:rnnlm/kaldi-rnnlm.a -l:hmm/kaldi-hmm.a -l:nnet3/kaldi-nnet3.a -l:transform/kaldi-transform.a -l:matrix/kaldi-matrix.a -l:fstext/kaldi-fstext.a -l:util/kaldi-util.a -l:base/kaldi-base.a -L$OPENFST/lib -l:libfst.a -l:libfstngram.a -L$OPENBLAS -l:lib/libopenblas.a -L$VOSK/src -l:vosk.a -lembind --no-entry --closure 1 --pre-js Wrapper.js" # shellcheck disable=SC2086 @@ -93,4 +91,6 @@ em++ ${voskletFiles//.o/.cc} $voskletFlags -DEMSCRIPTEN_HAS_UNBOUND_TYPE_NAMES=0 em++ $voskletFiles $voskletFlags $voskletLDFlags -o ../Vosklet.js rm -f $voskletFiles +rm -rf /tmp/openblas +rm -rf /tmp/openfst cd .. \ No newline at end of file