Remove async
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -6,4 +6,5 @@ openblas
|
|||||||
openfst
|
openfst
|
||||||
emsdk
|
emsdk
|
||||||
test.js
|
test.js
|
||||||
test.wasm
|
test.wasm
|
||||||
|
src/*.o
|
||||||
@@ -1,43 +1,45 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
|
||||||
<script src="../Vosklet.js" async defer></script>
|
|
||||||
<script>
|
|
||||||
async function start() {
|
|
||||||
|
|
||||||
// All data is collected and transfered to the main thread so the AudioContext won't output anything. Set sinkId type to none to save power
|
|
||||||
let ctx = new AudioContext({sinkId: {type: "none"}});
|
|
||||||
|
|
||||||
// Setup microphone
|
<head>
|
||||||
let micNode = ctx.createMediaStreamSource(await navigator.mediaDevices.getUserMedia({
|
<script src="../Vosklet.js" async defer></script>
|
||||||
video: false,
|
<script>
|
||||||
audio: {
|
async function start() {
|
||||||
echoCancellation: true,
|
|
||||||
noiseSuppression: true,
|
|
||||||
channelCount: 1
|
|
||||||
},
|
|
||||||
}));
|
|
||||||
|
|
||||||
// Load Vosklet module, model and recognizer
|
// All data is collected and transfered to the main thread so the AudioContext won't output anything. Set sinkId type to none to save power
|
||||||
let module = await loadVosklet();
|
let ctx = new AudioContext({ sinkId: { type: "none" } });
|
||||||
let model = await module.createModel("https://ccoreilly.github.io/vosk-browser/models/vosk-model-small-en-us-0.15.tar.gz", "English", "vosk-model-small-en-us-0.15");
|
|
||||||
let recognizer = await module.createRecognizer(model, ctx.sampleRate);
|
|
||||||
|
|
||||||
// Listen for result and partial result
|
// Setup microphone
|
||||||
recognizer.addEventListener("result", ev => console.log("Result: ", ev.detail));
|
let micNode = ctx.createMediaStreamSource(await navigator.mediaDevices.getUserMedia({
|
||||||
recognizer.addEventListener("partialResult", ev => console.log("Partial result: ", ev.detail));
|
video: false,
|
||||||
|
audio: {
|
||||||
|
echoCancellation: true,
|
||||||
|
noiseSuppression: true,
|
||||||
|
channelCount: 1
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
|
||||||
// Create a transferer node to get audio data on the main thread
|
// Load Vosklet module, model and recognizer
|
||||||
let transferer = await module.createTransferer(ctx, 128 * 150);
|
let module = await loadVosklet();
|
||||||
|
let model = await module.createModel("https://ccoreilly.github.io/vosk-browser/models/vosk-model-small-en-us-0.15.tar.gz", "English", "vosk-model-small-en-us-0.15");
|
||||||
|
let recognizer = await module.createRecognizer(model, ctx.sampleRate);
|
||||||
|
|
||||||
// Recognize data on arrival
|
// Listen for result and partial result
|
||||||
transferer.port.onmessage = ev => recognizer.acceptWaveform(ev.data);
|
recognizer.addEventListener("result", ev => console.log("Result: ", ev.detail));
|
||||||
|
recognizer.addEventListener("partialResult", ev => console.log("Partial result: ", ev.detail));
|
||||||
|
|
||||||
|
// Create a transferer node to get audio data on the main thread
|
||||||
|
let transferer = await module.createTransferer(ctx, 128 * 150);
|
||||||
|
|
||||||
|
// Recognize data on arrival
|
||||||
|
transferer.port.onmessage = ev => recognizer.acceptWaveform(ev.data);
|
||||||
|
|
||||||
|
// Connect transferer to microphone
|
||||||
|
micNode.connect(transferer);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<!-- Start and create audio context only as a result of user's action -->
|
||||||
|
<button onclick="start()">Start</button>
|
||||||
|
</head>
|
||||||
|
|
||||||
// Connect transferer to microphone
|
|
||||||
micNode.connect(transferer);
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<!-- Start and create audio context only as a result of user's action -->
|
|
||||||
<button onclick="start()">Start</button>
|
|
||||||
</head>
|
|
||||||
</html>
|
</html>
|
||||||
66
Vosklet.d.ts
vendored
Normal file
66
Vosklet.d.ts
vendored
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
// vosklet.d.ts
|
||||||
|
|
||||||
|
declare global {
|
||||||
|
interface Window {
|
||||||
|
loadVosklet(): Promise<Module>;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export type EpMode =
|
||||||
|
| "ANSWER_DEFAULT"
|
||||||
|
| "DISABLED"
|
||||||
|
| "FAST"
|
||||||
|
| "MEDIUM"
|
||||||
|
| "SLOW";
|
||||||
|
|
||||||
|
export interface Module {
|
||||||
|
createModel(url: string, path: string, id: string): Promise<Model>;
|
||||||
|
createSpkModel(url: string, path: string, id: string): Promise<SpkModel>;
|
||||||
|
createRecognizer(model: Model, sampleRate: number): Promise<Recognizer>;
|
||||||
|
createRecognizerWithSpkModel(
|
||||||
|
model: Model,
|
||||||
|
spkModel: SpkModel,
|
||||||
|
sampleRate: number
|
||||||
|
): Promise<Recognizer>;
|
||||||
|
createRecognizerWithGrm(
|
||||||
|
model: Model,
|
||||||
|
grammar: string,
|
||||||
|
sampleRate: number
|
||||||
|
): Promise<Recognizer>;
|
||||||
|
setLogLevel(level: number): void;
|
||||||
|
createTransferer(
|
||||||
|
ctx: AudioContext,
|
||||||
|
bufferSize: number
|
||||||
|
): Promise<AudioWorkletNode>;
|
||||||
|
cleanUp(): Promise<void>;
|
||||||
|
getModelCache(): Promise<Cache>;
|
||||||
|
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<void>;
|
||||||
|
}
|
||||||
|
|
||||||
120
Vosklet.js
120
Vosklet.js
@@ -1,69 +1,68 @@
|
|||||||
var loadVosklet = (() => {
|
var loadVosklet = (() => {
|
||||||
var _scriptName = typeof document != 'undefined' ? document.currentScript?.src : undefined;
|
var _scriptName = typeof document != 'undefined' ? document.currentScript?.src : undefined;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
async function(moduleArg = {}) {
|
async function(moduleArg = {}) {
|
||||||
var moduleRtn;
|
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;
|
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(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(),")()"],
|
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();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=
|
{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 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?
|
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.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}}
|
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}}
|
||||||
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,
|
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.oa(e.ea,f,2,null,g.ea)}}var ka={...n},v="",la,ma;
|
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;
|
||||||
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);};
|
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)}
|
||||||
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 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}
|
||||||
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;
|
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 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)}}
|
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}}
|
||||||
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 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"]);
|
||||||
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}}
|
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);};
|
||||||
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 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)}
|
||||||
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 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,
|
||||||
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):
|
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&&
|
||||||
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(){}
|
Tb.register(b,{ba:c},b);return b};Ub=b=>{Tb.unregister(b)};return S(a)},Vb=[];function Wb(){}
|
||||||
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,
|
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(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=[]}
|
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 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)}
|
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 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===
|
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)}
|
||||||
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 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===
|
||||||
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])}
|
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}
|
||||||
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};
|
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])}
|
||||||
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 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,
|
||||||
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{}
|
{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 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;k<a.length;++k)O(a[k],h[k])}a.forEach(h=>Ya[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(()=>
|
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{}
|
||||||
{e[k]=M[h];++g;g===f.length&&d(e)}))});0===f.length&&d(e)},Eb=(a,b)=>{for(var c=[],d=0;d<a;d++)c.push(F()[b+4*d>>2]);return c},Fb=a=>{for(;a.length;){var b=a.pop();a.pop()(b)}};function Gb(a){for(var b=1;b<a.length;++b)if(null!==a[b]&&void 0===a[b].ia)return!0;return!1}
|
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;l<a.length;++l)Q(a[l],h[l])}a.forEach(h=>Ob[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(()=>
|
||||||
function Hb(a,b,c,d,e,f){var g=b.length;if(2>g)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<g-2;++e)d.push(b[e+2]);if(!k)for(e=h?1:2;e<b.length;++e)null!==b[e].ia&&d.push(b[e].ia);k=Gb(b);e=b.length-2;var m=[],l=["fn"];h&&l.push("thisWired");for(g=0;g<e;++g)m.push(`arg${g}`),l.push(`arg${g}Wired`);m=m.join(",");l=l.join(",");m=`return function (${m}) {\n`;k&&
|
{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===
|
||||||
(m+="var destructors = [];\n");var q=k?"destructors":"null",r="humanName throwBindingError invoker fn runDestructors retType classParam".split(" ");h&&(m+=`var thisWired = classParam['toWireType'](${q}, this);\n`);for(g=0;g<e;++g)m+=`var arg${g}Wired = argType${g}['toWireType'](${q}, arg${g});\n`,r.push(`argType${g}`);m+=(c||f?"var rv = ":"")+`invoker(${l});\n`;if(k)m+="runDestructors(destructors);\n";else for(g=h?1:2;g<b.length;++g)f=1===g?"thisWired":"arg"+(g-2)+"Wired",null!==b[g].ia&&(m+=`${f}_dtor(${f});\n`,
|
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=[],
|
||||||
r.push(`${f}_dtor`));c&&(m+="var ret = retType['fromWireType'](rv);\nreturn ret;\n");let [w,u]=[r,m+"}\n"];b=(new Function(...w,u))(...d);return gb(a,b)}
|
d=0;d<a;d++)c.push((x(),H)[b+4*d>>2]);return c},vc=a=>{for(;a.length;){var b=a.pop();a.pop()(b)}};function wc(a){for(var b=1;b<a.length;++b)if(null!==a[b]&&void 0===a[b].ja)return!0;return!1}
|
||||||
for(var Ib=a=>{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];9<a&&0===--T[a+1]&&(T[a]=void 0,Jb.push(a));return b},toWireType:(a,b)=>pb(b),ka:8,readValueFromPointer:rb,ia:null},Lb=(a,b,c)=>{switch(b){case 1:return c?
|
function xc(a,b,c,d,e,f){var g=b.length;if(2>g)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<g-2;++e)d.push(b[e+2]);if(!l)for(e=h?1:2;e<b.length;++e)null!==b[e].ja&&d.push(b[e].ja);l=wc(b);e=b.length-2;var n=[],m=["fn"];h&&m.push("thisWired");for(g=0;g<e;++g)n.push(`arg${g}`),m.push(`arg${g}Wired`);n=n.join(",");m=m.join(",");n=`return function (${n}) {\n`;l&&
|
||||||
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>>
|
(n+="var destructors = [];\n");var r=l?"destructors":"null",t="humanName throwBindingError invoker fn runDestructors retType classParam".split(" ");h&&(n+=`var thisWired = classParam['toWireType'](${r}, this);\n`);for(g=0;g<e;++g)n+=`var arg${g}Wired = argType${g}['toWireType'](${r}, arg${g});\n`,t.push(`argType${g}`);n+=(c||f?"var rv = ":"")+`invoker(${m});\n`;if(l)n+="runDestructors(destructors);\n";else for(g=h?1:2;g<b.length;++g)f=1===g?"thisWired":"arg"+(g-2)+"Wired",null!==b[g].ja&&(n+=`${f}_dtor(${f});\n`,
|
||||||
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<d))return 0;var e=c;d=c+d-1;for(var f=0;f<a.length;++f){var g=a.charCodeAt(f);if(55296<=g&&57343>=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;
|
t.push(`${f}_dtor`));c&&(n+="var ret = retType['fromWireType'](rv);\nreturn ret;\n");let [w,v]=[t,n+"}\n"];b=(new Function(...w,v))(...d);return Xb(a,b)}
|
||||||
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<a.length;++c){var d=a.charCodeAt(c);127>=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<c;++e){var f=a.charCodeAt(e);
|
for(var Qa=(a,b,c,d,e,f)=>{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,
|
||||||
za()[b>>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<a.length;++e){var f=a.charCodeAt(e);if(55296<=f&&57343>=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=
|
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);
|
||||||
0,c=0;c<a.length;++c){var d=a.charCodeAt(c);55296<=d&&57343>=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"==
|
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];9<a&&0===--W[a+1]&&(W[a]=void 0,zc.push(a));return b},toWireType:(a,b)=>gc(b),la:R,readValueFromPointer:ic,ja:null},Sa=a=>Q(a,Ac),
|
||||||
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;
|
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,
|
||||||
(()=>{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}}}));
|
{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(),
|
||||||
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}});
|
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>>>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<d))return 0;var e=c;d=c+d-1;for(var f=
|
||||||
|
0;f<a.length;++f){var g=a.charCodeAt(f);if(55296<=g&&57343>=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<a.length;++c){var d=a.charCodeAt(c);127>=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<c;++e){var f=a.charCodeAt(e);(x(),D)[b>>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<a.length;++e){var f=a.charCodeAt(e);if(55296<=f&&57343>=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<a.length;++c){var d=a.charCodeAt(c);55296<=d&&57343>=
|
||||||
|
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<f?(X(a,c,17),X(b,d,17)):(X(a,d,17),X(b,c,17))},fb=(a,b)=>(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<a)return!1;for(var c=1;4>=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"])})();
|
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=
|
Object.assign(oc.prototype,{Ia(a){this.Ca&&(a=this.Ca(a));return a},Ba(a){this.ma?.(a)},la:R,readValueFromPointer:ic,fromWireType:function(a){function b(){return this.xa?nc(this.ca.oa,{ea:this.Ka,da:c,ka:this,ha:a}):nc(this.ca.oa,{ea:this,da:a})}var c=this.Ia(a);if(!c)return this.Ba(a),null;var d=lc(this.ca,c);if(void 0!==d){if(0===d.ba.count.value)return d.ba.da=c,d.ba.ha=a,d.clone();d=d.clone();this.Ba(a);return d}d=this.ca.Ha(c);d=Yb[d];if(!d)return b.call(this);d=this.wa?d.Ea: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])}
|
jc(c,this.ca,d.ca);return null===e?b.call(this):this.xa?nc(d.ca.oa,{ea:d,da:e,ka:this,ha:a}):nc(d.ca.oa,{ea:d,da:e})}});p&&(Mc[0]=globalThis,addEventListener("message",ya));p||(k.wasmMemory?B=k.wasmMemory:B=new WebAssembly.Memory({initial:5040,maximum:32768,shared:!0}),sa());function Ab(a,b,c){ea?q[a].dispatchEvent(new CustomEvent(ha[b],{detail:0==c?null:L(c)})):self.postMessage([a,b,c])}function Db(a,b){for(let c of Object.values(Mc))c.postMessage({_wsc:a,x:[b]}),c.onmessage=d=>Ab(...d.data)}
|
||||||
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")),
|
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=
|
||||||
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}`);
|
(a,b)=>(Pc=I.$)(a,b),wa=(a,b)=>(wa=I.aa)(a,b);function $c(){0<J?K=$c:p?(ba(k),va()):0<J?K=$c:(k.calledRun=!0,oa||(va(),ba(k)))}$c();moduleRtn=da;
|
||||||
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>>>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);e<f?(Ob(a,c),Ob(b,d)):(Ob(a,d),Ob(b,c))},A:(a,b)=>t().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<a)return!1;for(var c=1;4>=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<d.length;++f)B()[e++]=d.charCodeAt(f);B()[e]=0;c+=d.length+1});return 0},K:(a,b)=>{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(){0<H?I=kc:fa?(aa(n),Ba()):0<H?I=kc:(n.calledRun=!0,pa||(Ba(),aa(n)))}kc();moduleRtn=ca;
|
|
||||||
|
|
||||||
|
|
||||||
return moduleRtn;
|
return moduleRtn;
|
||||||
@@ -77,3 +76,6 @@ if (typeof exports === 'object' && typeof module === 'object') {
|
|||||||
module.exports.default = loadVosklet;
|
module.exports.default = loadVosklet;
|
||||||
} else if (typeof define === 'function' && define['amd'])
|
} else if (typeof define === 'function' && define['amd'])
|
||||||
define([], () => loadVosklet);
|
define([], () => loadVosklet);
|
||||||
|
var isWW = globalThis.self?.name == 'em-ww';
|
||||||
|
// When running as a wasm worker, construct a new instance on startup
|
||||||
|
isWW && loadVosklet();
|
||||||
|
|||||||
BIN
Vosklet.wasm
BIN
Vosklet.wasm
Binary file not shown.
@@ -4,32 +4,32 @@
|
|||||||
#include <emscripten/bind.h>
|
#include <emscripten/bind.h>
|
||||||
using namespace emscripten;
|
using namespace emscripten;
|
||||||
|
|
||||||
EMSCRIPTEN_BINDINGS() {
|
EMSCRIPTEN_BINDINGS()
|
||||||
|
{
|
||||||
function("setLogLevel", &vosk_set_log_level);
|
function("setLogLevel", &vosk_set_log_level);
|
||||||
|
|
||||||
enum_<VoskEndpointerMode>("EpMode")
|
enum_<VoskEndpointerMode>("EpMode")
|
||||||
.value("ANSWER_DEFAULT", VOSK_EP_ANSWER_DEFAULT)
|
.value("ANSWER_DEFAULT", VOSK_EP_ANSWER_DEFAULT)
|
||||||
.value("ANSWER_SHORT", VOSK_EP_ANSWER_SHORT)
|
.value("ANSWER_SHORT", VOSK_EP_ANSWER_SHORT)
|
||||||
.value("ANSWER_LONG", VOSK_EP_ANSWER_LONG)
|
.value("ANSWER_LONG", VOSK_EP_ANSWER_LONG)
|
||||||
.value("ANSWER_VERY_LONG", VOSK_EP_ANSWER_VERY_LONG);
|
.value("ANSWER_VERY_LONG", VOSK_EP_ANSWER_VERY_LONG);
|
||||||
|
|
||||||
class_<CommonModel>("CommonModel")
|
class_<CommonModel>("CommonModel")
|
||||||
.constructor<int, bool, int, int>(return_value_policy::take_ownership())
|
.constructor<int, bool, int, int>(return_value_policy::take_ownership())
|
||||||
.function("findWord", &CommonModel::findWord);
|
.function("findWord", &CommonModel::findWord);
|
||||||
|
|
||||||
class_<Recognizer>("Recognizer")
|
class_<Recognizer>("Recognizer")
|
||||||
.constructor<int, float, CommonModel*>(return_value_policy::take_ownership())
|
.constructor<int, float, CommonModel *>(return_value_policy::take_ownership())
|
||||||
.constructor<int, float, CommonModel*, CommonModel*>(return_value_policy::take_ownership())
|
.constructor<int, float, CommonModel *, CommonModel *>(return_value_policy::take_ownership())
|
||||||
.constructor<int, float, CommonModel*, const std::string&, int>(return_value_policy::take_ownership())
|
.constructor<int, float, CommonModel *, const std::string &, int>(return_value_policy::take_ownership())
|
||||||
.function("safeDelete", &Recognizer::safeDelete)
|
.function("acceptWaveform", &Recognizer::acceptWaveform, allow_raw_pointers())
|
||||||
.function("acceptWaveform", &Recognizer::acceptWaveform)
|
.function("reset", &Recognizer::reset)
|
||||||
.function("reset", &Recognizer::reset)
|
.function("setEndpointerMode", &Recognizer::setEndpointerMode)
|
||||||
.function("setEndpointerMode", &Recognizer::setEndpointerMode)
|
.function("setEndpointerDelays", &Recognizer::setEndpointerDelays)
|
||||||
.function("setEndpointerDelays", &Recognizer::setEndpointerDelays)
|
.function("setWords", &Recognizer::setWords)
|
||||||
.function("setWords", &Recognizer::setWords)
|
.function("setPartialWords", &Recognizer::setPartialWords)
|
||||||
.function("setPartialWords", &Recognizer::setPartialWords)
|
.function("setGrm", &Recognizer::setGrm)
|
||||||
.function("setGrm", &Recognizer::setGrm)
|
.function("setNLSML", &Recognizer::setNLSML)
|
||||||
.function("setNLSML", &Recognizer::setNLSML)
|
.function("setSpkModel", &Recognizer::setSpkModel, allow_raw_pointers())
|
||||||
.function("setSpkModel", &Recognizer::setSpkModel, allow_raw_pointers())
|
.function("setMaxAlternatives", &Recognizer::setMaxAlternatives);
|
||||||
.function("setMaxAlternatives", &Recognizer::setMaxAlternatives);
|
|
||||||
};
|
};
|
||||||
@@ -1,19 +1,18 @@
|
|||||||
#include "CommonModel.h"
|
#include "CommonModel.h"
|
||||||
|
|
||||||
CommonModel::CommonModel(int index, bool normalMdl, int tarStart, int tarSize) :
|
CommonModel::CommonModel(int index, bool normalMdl, int tarStart, int tarSize) : normalMdl{normalMdl}, index{index}
|
||||||
normalMdl{normalMdl}, index{index}
|
|
||||||
{
|
{
|
||||||
globalPool.exec([this, tarStart, tarSize]{
|
extractAndLoad(reinterpret_cast<unsigned char *>(tarStart), tarSize);
|
||||||
extractAndLoad(reinterpret_cast<unsigned char*>(tarStart), tarSize);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
void CommonModel::extractAndLoad(unsigned char* tar, int tarSize) {
|
void CommonModel::extractAndLoad(unsigned char *tar, int tarSize)
|
||||||
|
{
|
||||||
// Map index onto [A-Z]
|
// Map index onto [A-Z]
|
||||||
const char storepath[3]{'/', static_cast<char>(index % 26 + 'A')};
|
const char storepath[3]{'/', static_cast<char>(index % 26 + 'A')};
|
||||||
int res{untar(tar, tarSize, storepath)};
|
int res{untar(tar, tarSize, storepath)};
|
||||||
free(tar);
|
free(tar);
|
||||||
const char* untarErr{};
|
const char *untarErr{};
|
||||||
switch(res) {
|
switch (res)
|
||||||
|
{
|
||||||
case IncorrectFormat:
|
case IncorrectFormat:
|
||||||
untarErr = "Untar: Incorrect tar format, must be USTAR";
|
untarErr = "Untar: Incorrect tar format, must be USTAR";
|
||||||
break;
|
break;
|
||||||
@@ -29,20 +28,29 @@ void CommonModel::extractAndLoad(unsigned char* tar, int tarSize) {
|
|||||||
case FailedClose:
|
case FailedClose:
|
||||||
untarErr = "Untar: Unable to close file after write";
|
untarErr = "Untar: Unable to close file after write";
|
||||||
};
|
};
|
||||||
if(untarErr != nullptr) {
|
if (untarErr != nullptr)
|
||||||
fireEv(index, Event::status, untarErr);
|
{
|
||||||
|
fireEv(index, untarErr);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(normalMdl) mdl = vosk_model_new(storepath);
|
if (normalMdl)
|
||||||
else mdl = vosk_spk_model_new(storepath);
|
mdl = vosk_model_new(storepath);
|
||||||
if(normalMdl ? std::get<VoskModel*>(mdl) != nullptr : std::get<VoskSpkModel*>(mdl) != nullptr) fireEv(index, status);
|
else
|
||||||
else fireEv(index, status, "Unable to load model for recognition");
|
mdl = vosk_spk_model_new(storepath);
|
||||||
|
if (normalMdl ? std::get<VoskModel *>(mdl) != nullptr : std::get<VoskSpkModel *>(mdl) != nullptr)
|
||||||
|
fireEv(index);
|
||||||
|
else
|
||||||
|
fireEv(index, "Unable to load model for recognition");
|
||||||
fs::remove_all(storepath);
|
fs::remove_all(storepath);
|
||||||
}
|
}
|
||||||
int CommonModel::findWord(std::string word) {
|
int CommonModel::findWord(std::string word)
|
||||||
return vosk_model_find_word(std::get<VoskModel*>(mdl), word.c_str());
|
{
|
||||||
|
return vosk_model_find_word(std::get<VoskModel *>(mdl), word.c_str());
|
||||||
}
|
}
|
||||||
CommonModel::~CommonModel() {
|
CommonModel::~CommonModel()
|
||||||
if(normalMdl) vosk_model_free(std::get<VoskModel*>(mdl));
|
{
|
||||||
else vosk_spk_model_free(std::get<VoskSpkModel*>(mdl));
|
if (normalMdl)
|
||||||
|
vosk_model_free(std::get<VoskModel *>(mdl));
|
||||||
|
else
|
||||||
|
vosk_spk_model_free(std::get<VoskSpkModel *>(mdl));
|
||||||
}
|
}
|
||||||
@@ -1,102 +1,74 @@
|
|||||||
#include "Recognizer.h"
|
#include "Recognizer.h"
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
|
|
||||||
const char* recognizerInitErr{"Unable to initialize recognizer"};
|
const char *recognizerInitErr{"Unable to initialize recognizer"};
|
||||||
Recognizer::Recognizer(int index, float sampleRate, CommonModel* model) :
|
Recognizer::Recognizer(int index, float sampleRate, CommonModel *model) : rec{vosk_recognizer_new(std::get<VoskModel *>(model->mdl), sampleRate)}
|
||||||
rec{vosk_recognizer_new(std::get<VoskModel*>(model->mdl), sampleRate)} {
|
{
|
||||||
if(rec == nullptr) fireEv(index, Event::status, recognizerInitErr);
|
if (rec == nullptr)
|
||||||
else globalPool.exec([this, index]{main(index);});
|
{
|
||||||
}
|
fireEv(index, recognizerInitErr);
|
||||||
Recognizer::Recognizer(int index, float sampleRate, CommonModel* model, CommonModel* spkModel) :
|
|
||||||
rec{vosk_recognizer_new_spk(std::get<VoskModel*>(model->mdl), sampleRate, std::get<VoskSpkModel*>(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<VoskModel*>(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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
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) {
|
Recognizer::Recognizer(int index, float sampleRate, CommonModel *model, CommonModel *spkModel) : rec{vosk_recognizer_new_spk(std::get<VoskModel *>(model->mdl), sampleRate, std::get<VoskSpkModel *>(spkModel->mdl))}
|
||||||
dataQ.emplace(start, len);
|
{
|
||||||
emscripten_atomic_store_u32(&haveData, true);
|
if (rec == nullptr)
|
||||||
emscripten_atomic_notify(&haveData, 1);
|
{
|
||||||
|
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<VoskModel *>(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<float *>(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);
|
vosk_recognizer_reset(rec);
|
||||||
}
|
}
|
||||||
void Recognizer::setEndpointerMode(VoskEndpointerMode mode) {
|
void Recognizer::setEndpointerMode(VoskEndpointerMode mode)
|
||||||
|
{
|
||||||
vosk_recognizer_set_endpointer_mode(rec, 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);
|
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());
|
vosk_recognizer_set_grm(rec, grm.c_str());
|
||||||
}
|
}
|
||||||
void Recognizer::setSpkModel(CommonModel* spkModel) {
|
void Recognizer::setSpkModel(CommonModel *spkModel)
|
||||||
vosk_recognizer_set_spk_model(rec, std::get<VoskSpkModel*>(spkModel->mdl));
|
{
|
||||||
|
vosk_recognizer_set_spk_model(rec, std::get<VoskSpkModel *>(spkModel->mdl));
|
||||||
}
|
}
|
||||||
void Recognizer::setWords(bool words) {
|
void Recognizer::setWords(bool words)
|
||||||
|
{
|
||||||
vosk_recognizer_set_words(rec, words);
|
vosk_recognizer_set_words(rec, words);
|
||||||
}
|
}
|
||||||
void Recognizer::setPartialWords(bool partialWords) {
|
void Recognizer::setPartialWords(bool partialWords)
|
||||||
|
{
|
||||||
vosk_recognizer_set_partial_words(rec, partialWords);
|
vosk_recognizer_set_partial_words(rec, partialWords);
|
||||||
}
|
}
|
||||||
void Recognizer::setNLSML(bool nlsml) {
|
void Recognizer::setNLSML(bool nlsml)
|
||||||
|
{
|
||||||
vosk_recognizer_set_nlsml(rec, nlsml);
|
vosk_recognizer_set_nlsml(rec, nlsml);
|
||||||
}
|
}
|
||||||
void Recognizer::setMaxAlternatives(int alts) {
|
void Recognizer::setMaxAlternatives(int alts)
|
||||||
|
{
|
||||||
vosk_recognizer_set_max_alternatives(rec, alts);
|
vosk_recognizer_set_max_alternatives(rec, alts);
|
||||||
}
|
}
|
||||||
@@ -4,23 +4,19 @@
|
|||||||
|
|
||||||
// Prevent naming conflicts with Vosk's Recognizer class
|
// Prevent naming conflicts with Vosk's Recognizer class
|
||||||
#define Recognizer Recognizer_
|
#define Recognizer Recognizer_
|
||||||
struct Recognizer {
|
struct Recognizer
|
||||||
int haveData{};
|
{
|
||||||
bool processCurrent{};
|
int index;
|
||||||
bool done{};
|
VoskRecognizer *rec;
|
||||||
VoskRecognizer* rec;
|
Recognizer(int index, float sampleRate, CommonModel *model);
|
||||||
std::queue<AudioData> dataQ;
|
Recognizer(int index, float sampleRate, CommonModel *model, CommonModel *spkModel);
|
||||||
Recognizer(int index, float sampleRate, CommonModel* model);
|
Recognizer(int index, float sampleRate, CommonModel *model, const std::string &grm, int);
|
||||||
Recognizer(int index, float sampleRate, CommonModel* model, CommonModel* spkModel);
|
const char *acceptWaveform(int start, int len);
|
||||||
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);
|
|
||||||
void reset();
|
void reset();
|
||||||
void setEndpointerMode(VoskEndpointerMode mode);
|
void setEndpointerMode(VoskEndpointerMode mode);
|
||||||
void setEndpointerDelays(float tStartMax, float tEnd, float tMax);
|
void setEndpointerDelays(float tStartMax, float tEnd, float tMax);
|
||||||
void setSpkModel(CommonModel* model);
|
void setSpkModel(CommonModel *model);
|
||||||
void setGrm(const std::string& grm);
|
void setGrm(const std::string &grm);
|
||||||
void setWords(bool words);
|
void setWords(bool words);
|
||||||
void setPartialWords(bool partialWords);
|
void setPartialWords(bool partialWords);
|
||||||
void setNLSML(bool nlsml);
|
void setNLSML(bool nlsml);
|
||||||
|
|||||||
111
src/Util.cc
111
src/Util.cc
@@ -1,108 +1,57 @@
|
|||||||
#include "Util.h"
|
#include "Util.h"
|
||||||
|
|
||||||
#include "emscripten/wasm_worker.h"
|
|
||||||
#include "emscripten/em_js.h"
|
#include "emscripten/em_js.h"
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
EM_JS(void, fireEv, (int idx, int typeIdx, const char* content), {
|
int untar(unsigned char *tar, int tarSize, const char *storepath)
|
||||||
if(ENVIRONMENT_IS_WEB) objs[idx].dispatchEvent(new CustomEvent(events[typeIdx], {
|
{
|
||||||
"detail": content == 0 ? null : UTF8ToString(content)
|
if (std::memcmp(tar + 257, "ustar", 5))
|
||||||
}));
|
return IncorrectFormat;
|
||||||
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;
|
|
||||||
size_t size{};
|
size_t size{};
|
||||||
std::string path;
|
std::string path;
|
||||||
path.reserve(100); // Max length
|
path.reserve(100); // Max length
|
||||||
unsigned char* end = tar + tarSize;
|
unsigned char *end = tar + tarSize;
|
||||||
while(tar <= end) {
|
while (tar <= end)
|
||||||
if(tar[156] != '5' && tar[156] != 0 &&
|
{
|
||||||
tar[156] != '0') {
|
if (tar[156] != '5' && tar[156] != 0 &&
|
||||||
|
tar[156] != '0')
|
||||||
|
{
|
||||||
return IncorrectFiletype;
|
return IncorrectFiletype;
|
||||||
}
|
}
|
||||||
path.clear();
|
path.clear();
|
||||||
path += reinterpret_cast<char*>(tar + 345);
|
path += reinterpret_cast<char *>(tar + 345);
|
||||||
path += reinterpret_cast<char*>(tar);
|
path += reinterpret_cast<char *>(tar);
|
||||||
tar += 124;
|
tar += 124;
|
||||||
for(int i{0}; i < 11; i++) {
|
for (int i{0}; i < 11; i++)
|
||||||
|
{
|
||||||
size *= 8;
|
size *= 8;
|
||||||
size += *tar - 48;
|
size += *tar - 48;
|
||||||
tar++;
|
tar++;
|
||||||
}
|
}
|
||||||
tar += 377;
|
tar += 377;
|
||||||
size_t firstSlash = path.find_first_of("/");
|
size_t firstSlash = path.find_first_of("/");
|
||||||
if(firstSlash == std::string::npos) {
|
if (firstSlash == std::string::npos)
|
||||||
if(size != 0) tar += size + 512 - size % 512;
|
{
|
||||||
|
if (size != 0)
|
||||||
|
tar += size + 512 - size % 512;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
path = storepath + path.substr(firstSlash);
|
path = storepath + path.substr(firstSlash);
|
||||||
std::ofstream file;
|
std::ofstream file;
|
||||||
if(size == 0) fs::create_directory(path);
|
if (size == 0)
|
||||||
else {
|
fs::create_directory(path);
|
||||||
|
else
|
||||||
|
{
|
||||||
file.open(path, std::ios::trunc | std::ios::binary);
|
file.open(path, std::ios::trunc | std::ios::binary);
|
||||||
if(!file) return FailedOpen;
|
if (!file)
|
||||||
if(!file.write(reinterpret_cast<char*>(tar), size)) return FailedWrite;
|
return FailedOpen;
|
||||||
|
if (!file.write(reinterpret_cast<char *>(tar), size))
|
||||||
|
return FailedWrite;
|
||||||
file.close();
|
file.close();
|
||||||
if(!file) return FailedClose;
|
if (!file)
|
||||||
|
return FailedClose;
|
||||||
tar += size + 512 - size % 512;
|
tar += size + 512 - size % 512;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Successful;
|
return Successful;
|
||||||
}
|
}
|
||||||
void workerStartup(int _pool) {
|
|
||||||
WorkerPool& pool{*reinterpret_cast<WorkerPool*>(_pool)};
|
|
||||||
std::function<void()> 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<std::byte, MAX_WORKERS * workerStack> 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<void()> fn) {
|
|
||||||
taskQ.emplace(fn);
|
|
||||||
emscripten_atomic_store_u32(&qLock, false);
|
|
||||||
emscripten_atomic_notify(&qLock, 1);
|
|
||||||
}
|
|
||||||
WorkerPool globalPool;
|
|
||||||
32
src/Util.h
32
src/Util.h
@@ -9,15 +9,9 @@
|
|||||||
#include "emscripten/console.h"
|
#include "emscripten/console.h"
|
||||||
|
|
||||||
namespace fs = std::filesystem;
|
namespace fs = std::filesystem;
|
||||||
enum Event {
|
|
||||||
// Shared
|
|
||||||
status,
|
|
||||||
|
|
||||||
// Recognizer
|
enum UntarStatus
|
||||||
partialResult,
|
{
|
||||||
result,
|
|
||||||
};
|
|
||||||
enum UntarStatus {
|
|
||||||
Successful,
|
Successful,
|
||||||
IncorrectFormat,
|
IncorrectFormat,
|
||||||
IncorrectFiletype,
|
IncorrectFiletype,
|
||||||
@@ -25,25 +19,7 @@ enum UntarStatus {
|
|||||||
FailedWrite,
|
FailedWrite,
|
||||||
FailedClose
|
FailedClose
|
||||||
};
|
};
|
||||||
struct AudioData {
|
|
||||||
float* data;
|
|
||||||
int len;
|
|
||||||
AudioData(int start, int len) : data{reinterpret_cast<float*>(start)}, len{len} {}
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifndef MAX_WORKERS
|
extern "C" void fireEv(int idx, const char *content = nullptr);
|
||||||
#define MAX_WORKERS 1
|
|
||||||
#endif
|
|
||||||
struct WorkerPool {
|
|
||||||
bool qLock{true}; // True is locked, false is unlocked
|
|
||||||
bool done{};
|
|
||||||
std::queue<std::function<void()>> taskQ;
|
|
||||||
WorkerPool();
|
|
||||||
~WorkerPool();
|
|
||||||
void exec(std::function<void()> fn);
|
|
||||||
};
|
|
||||||
extern "C" void fireEv(int idx, int typeIdx, const char* content = nullptr);
|
|
||||||
|
|
||||||
int untar(unsigned char* tar, int tarSize, const char* storepath);
|
int untar(unsigned char *tar, int tarSize, const char *storepath);
|
||||||
|
|
||||||
extern WorkerPool globalPool;
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
* @suppress {undefinedVars|checkTypes}
|
* @suppress {undefinedVars|checkTypes}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if(ENVIRONMENT_IS_WEB) {
|
if (ENVIRONMENT_IS_WEB) {
|
||||||
|
|
||||||
// 'var' to expose this outside the if
|
// 'var' to expose this outside the if
|
||||||
var objs = [];
|
var objs = [];
|
||||||
@@ -18,10 +18,10 @@ if(ENVIRONMENT_IS_WEB) {
|
|||||||
this.buf = new Float32Array(this.bufSize);
|
this.buf = new Float32Array(this.bufSize);
|
||||||
}
|
}
|
||||||
process(inputs) {
|
process(inputs) {
|
||||||
if(inputs[0][0]) {
|
if (inputs[0][0]) {
|
||||||
this.buf.set(inputs[0][0], this.filled);
|
this.buf.set(inputs[0][0], this.filled);
|
||||||
this.filled += 128;
|
this.filled += 128;
|
||||||
if(this.filled >= this.bufSize) {
|
if (this.filled >= this.bufSize) {
|
||||||
this.filled = 0;
|
this.filled = 0;
|
||||||
this.port.postMessage(this.buf, [this.buf.buffer]);
|
this.port.postMessage(this.buf, [this.buf.buffer]);
|
||||||
this.buf = new Float32Array(this.bufSize);
|
this.buf = new Float32Array(this.bufSize);
|
||||||
@@ -42,9 +42,9 @@ if(ENVIRONMENT_IS_WEB) {
|
|||||||
static async mk(url, storepath, id, normalMdl) {
|
static async mk(url, storepath, id, normalMdl) {
|
||||||
let mdl = new CommonModel();
|
let mdl = new CommonModel();
|
||||||
let result = new Promise((resolve, reject) => {
|
let result = new Promise((resolve, reject) => {
|
||||||
mdl.addEventListener('status', ev => {
|
mdl.addEventListener('', ev => {
|
||||||
if(!ev.detail) {
|
if (!ev.detail) {
|
||||||
if(normalMdl) mdl['findWord'] = word => mdl.obj['findWord'](word);
|
if (normalMdl) mdl['findWord'] = word => mdl.obj['findWord'](word);
|
||||||
resolve(mdl);
|
resolve(mdl);
|
||||||
}
|
}
|
||||||
else reject(ev.detail);
|
else reject(ev.detail);
|
||||||
@@ -54,7 +54,7 @@ if(ENVIRONMENT_IS_WEB) {
|
|||||||
let req = (await cache.keys(storepath, { ignoreSearch: true }))[0];
|
let req = (await cache.keys(storepath, { ignoreSearch: true }))[0];
|
||||||
let res;
|
let res;
|
||||||
if (typeof req == 'undefined' || req.url.split('?')[1] != id) {
|
if (typeof req == 'undefined' || req.url.split('?')[1] != id) {
|
||||||
|
|
||||||
// Caching already handled explicitly
|
// Caching already handled explicitly
|
||||||
res = await fetch(url, { cache: 'no-store' });
|
res = await fetch(url, { cache: 'no-store' });
|
||||||
if (!res.ok) throw 'Unable to fetch model, status: ' + res.status;
|
if (!res.ok) throw 'Unable to fetch model, status: ' + res.status;
|
||||||
@@ -72,46 +72,30 @@ if(ENVIRONMENT_IS_WEB) {
|
|||||||
class Recognizer extends EventTarget {
|
class Recognizer extends EventTarget {
|
||||||
constructor() {
|
constructor() {
|
||||||
super();
|
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);
|
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) {
|
acceptWaveform(audioData) {
|
||||||
let result = new Promise((resolve, _) => this.addEventListener('status', _ => {
|
let start = _malloc(audioData.length * 4);
|
||||||
this.obj.delete();
|
HEAPF32.set(audioData, start / 4);
|
||||||
resolve();
|
return UTF8ToString(this.obj['acceptWaveform'](start, audioData.length));
|
||||||
}, { once: true }));
|
}
|
||||||
this.obj['safeDelete'](processCurrent);
|
delete() {
|
||||||
return result;
|
this.obj.delete();
|
||||||
}
|
}
|
||||||
static async mk(model, sampleRate, mode, grammar, spkModel) {
|
static async mk(model, sampleRate, mode, grammar, spkModel) {
|
||||||
let rec = new Recognizer();
|
let rec = new Recognizer();
|
||||||
let result = new Promise((resolve, reject) => {
|
let result = new Promise((resolve, reject) => {
|
||||||
rec.addEventListener('status', ev => {
|
rec.addEventListener('', ev => {
|
||||||
if(!ev.detail) resolve(rec);
|
if (!ev.detail) resolve(rec);
|
||||||
else reject(ev.detail);
|
else reject(ev.detail);
|
||||||
}, { once: true });
|
}, { once: true });
|
||||||
})
|
})
|
||||||
switch(mode) {
|
switch (mode) {
|
||||||
case 1:
|
case 1:
|
||||||
rec.obj = new Module['Recognizer'](objs.length - 1, sampleRate, model);
|
rec.obj = new Module['Recognizer'](objs.length - 1, sampleRate, model);
|
||||||
break;
|
break;
|
||||||
case 2:
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
rec.obj = new Module['Recognizer'](objs.length - 1, sampleRate, model, grammar, 0);
|
rec.obj = new Module['Recognizer'](objs.length - 1, sampleRate, model, grammar, 0);
|
||||||
@@ -121,12 +105,12 @@ if(ENVIRONMENT_IS_WEB) {
|
|||||||
}
|
}
|
||||||
Module = {
|
Module = {
|
||||||
'getModelCache': () => _cache,
|
'getModelCache': () => _cache,
|
||||||
|
|
||||||
'cleanUp': async () => {
|
'cleanUp': async () => {
|
||||||
for(let obj of objs) await obj.delete();
|
for (let obj of objs) await obj.delete();
|
||||||
URL.revokeObjectURL(processorURL);
|
URL.revokeObjectURL(processorURL);
|
||||||
},
|
},
|
||||||
|
|
||||||
'createTransferer': async (ctx, bufSize) => {
|
'createTransferer': async (ctx, bufSize) => {
|
||||||
await ctx.audioWorklet.addModule(processorURL);
|
await ctx.audioWorklet.addModule(processorURL);
|
||||||
return new AudioWorkletNode(ctx, 'VoskletTransferer', {
|
return new AudioWorkletNode(ctx, 'VoskletTransferer', {
|
||||||
@@ -137,21 +121,21 @@ if(ENVIRONMENT_IS_WEB) {
|
|||||||
processorOptions: [bufSize]
|
processorOptions: [bufSize]
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
'createModel': (url, storepath, id) =>
|
'createModel': (url, storepath, id) =>
|
||||||
CommonModel.mk(url, storepath, id, true),
|
CommonModel.mk(url, storepath, id, true),
|
||||||
|
|
||||||
'createSpkModel': (url, storepath, id) =>
|
'createSpkModel': (url, storepath, id) =>
|
||||||
CommonModel.mk(url, storepath, id, false),
|
CommonModel.mk(url, storepath, id, false),
|
||||||
|
|
||||||
'createRecognizer': (model, sampleRate) =>
|
'createRecognizer': (model, sampleRate) =>
|
||||||
Recognizer.mk(model.obj, sampleRate, 1),
|
Recognizer.mk(model.obj, sampleRate, 1),
|
||||||
|
|
||||||
'createRecognizerWithGrm': (model, sampleRate, grammar) =>
|
'createRecognizerWithGrm': (model, sampleRate, grammar) =>
|
||||||
Recognizer.mk(model.obj, sampleRate, 3, grammar, null),
|
Recognizer.mk(model.obj, sampleRate, 3, grammar, null),
|
||||||
|
|
||||||
'createRecognizerWithSpkModel': (model, sampleRate, spkModel) =>
|
'createRecognizerWithSpkModel': (model, sampleRate, spkModel) =>
|
||||||
Recognizer.mk(model.obj, sampleRate, 2, null, spkModel.obj)
|
Recognizer.mk(model.obj, sampleRate, 2, null, spkModel.obj)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
12
src/make
12
src/make
@@ -24,8 +24,8 @@ if [ "$EMSDK" = ../emsdk ] && [ ! -f "$EMSDK" ]; then
|
|||||||
echo "Installing emsdk + Emscripten..."
|
echo "Installing emsdk + Emscripten..."
|
||||||
git clone --depth=1 https://github.com/emscripten-core/emsdk.git ../emsdk &&
|
git clone --depth=1 https://github.com/emscripten-core/emsdk.git ../emsdk &&
|
||||||
cd ../emsdk &&
|
cd ../emsdk &&
|
||||||
./emsdk install 4.0.6 &&
|
./emsdk install 4.0.13 &&
|
||||||
./emsdk activate 4.0.6
|
./emsdk activate 4.0.13
|
||||||
fi
|
fi
|
||||||
. $(realpath "$EMSDK")/emsdk_env.sh &&
|
. $(realpath "$EMSDK")/emsdk_env.sh &&
|
||||||
export PATH=:$PATH:$(realpath "$EMSDK")/upstream/bin &&
|
export PATH=:$PATH:$(realpath "$EMSDK")/upstream/bin &&
|
||||||
@@ -48,11 +48,10 @@ if [ ! -f "$OPENFST/lib/libfst.a" ]; then
|
|||||||
autoreconf -is &&
|
autoreconf -is &&
|
||||||
CXXFLAGS="$SHARED_FLAGS -O3 -fno-rtti" emconfigure ./configure --prefix="$OPENFST" --enable-static --disable-shared --enable-ngram-fsts --disable-bin &&
|
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 &&
|
emmake make -j"$JOBS" install > /dev/null &&
|
||||||
rm -rf /tmp/openfst
|
|
||||||
fi
|
fi
|
||||||
if [ ! -f "$OPENBLAS/lib/libopenblas.a" ]; then
|
if [ ! -f "$OPENBLAS/lib/libopenblas.a" ]; then
|
||||||
rm -rf /tmp/openblas &&
|
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 &&
|
cd /tmp/openblas &&
|
||||||
git apply "$SRC"/OpenBLAS.patch &&
|
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"
|
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" > /dev/null &&
|
||||||
make $openblasFlags CFLAGS="$openblasCFlags" PREFIX="$OPENBLAS" -j"$JOBS" install &&
|
make $openblasFlags CFLAGS="$openblasCFlags" PREFIX="$OPENBLAS" -j"$JOBS" install &&
|
||||||
rm -rf /tmp/openblas
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ ! -f "$KALDI/src/kaldi.mk" ]; then
|
if [ ! -f "$KALDI/src/kaldi.mk" ]; then
|
||||||
@@ -85,7 +83,7 @@ fi
|
|||||||
|
|
||||||
cd "$SRC" &&
|
cd "$SRC" &&
|
||||||
voskletFiles="Util.o CommonModel.o Recognizer.o Bindings.o"
|
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"
|
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
|
# 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
|
em++ $voskletFiles $voskletFlags $voskletLDFlags -o ../Vosklet.js
|
||||||
|
|
||||||
rm -f $voskletFiles
|
rm -f $voskletFiles
|
||||||
|
rm -rf /tmp/openblas
|
||||||
|
rm -rf /tmp/openfst
|
||||||
cd ..
|
cd ..
|
||||||
Reference in New Issue
Block a user