Use closure compiler in build for JS size reduction

This commit is contained in:
msqr1
2024-09-24 20:23:18 -07:00
parent 14c913d44c
commit fa3f6cd174
5 changed files with 170 additions and 24 deletions

View File

@@ -1,3 +1,8 @@
/**
* @fileoverview
* @suppress {undefinedVars|checkTypes}
*/
let objs = [];
let events = ["status", "partialResult", "result"];
let storageWorkerURL = URL.createObjectURL(new Blob(['(', (() => {
@@ -61,14 +66,15 @@ let processorURL = URL.createObjectURL(new Blob(['(', (() => {
}
})
}).toString(), ')()'], { type: "text/javascript" }));
Module.cleanUp = async () => {
Module['cleanUp'] = async () => {
for(let obj of objs) await obj.delete();
URL.revokeObjectURL(processorURL);
URL.revokeObjectURL(storageWorkerURL);
storageWorker.terminate();
}
Module.createTransferer = async (ctx, bufferSize) => {
Module['createTransferer'] = async (ctx, bufferSize) => {
await ctx.audioWorklet.addModule(processorURL);
return new AudioWorkletNode(ctx, "VoskletTransferer", {
channelCountMode: "explicit",
@@ -92,7 +98,7 @@ class CommonModel extends EventTarget {
let result = new Promise((resolve, reject) => {
mdl.addEventListener("status", ev => {
if(!ev.detail) {
if(normalMdl) mdl.findWord = word => mdl.obj.findWord(word)
if(normalMdl) mdl['findWord'] = word => mdl.obj['findWord'](word)
resolve(mdl)
}
else reject(ev.detail)
@@ -102,7 +108,7 @@ class CommonModel extends EventTarget {
tar = tar.data;
let tarStart = _malloc(tar.byteLength);
HEAPU8.set(new Uint8Array(tar), tarStart);
mdl.obj = new Module.CommonModel(objs.length - 1, normalMdl, "/" + storepath, id, tarStart, tar.byteLength);
mdl.obj = new Module['CommonModel'](objs.length - 1, normalMdl, "/" + storepath, id, tarStart, tar.byteLength);
}, { once: true });
storageWorker.postMessage({
url: url,
@@ -113,15 +119,21 @@ class CommonModel extends EventTarget {
}
}
Module.createModel = async (url, storepath, id) =>
Module['createModel'] = async (url, storepath, id) =>
CommonModel.mk(url, storepath, id, true);
Module.createSpkModel = async (url, storepath, id) =>
Module['createSpkModel'] = async (url, storepath, id) =>
CommonModel.mk(url, storepath, id, false);
class Recognizer extends EventTarget {
constructor() {
constructor() {
super();
// Closure workaround, this is removed if I put it as a regular class function. For some reason delete() doesn't
this['acceptWaveform'] = audioData => {
let start = _malloc(audioData.length * 4);
HEAPF32.set(audioData, start / 4);
this.obj['acceptWaveform'](start, audioData.length);
}
objs.push(this);
return new Proxy(this, {
get(self, prop, _) {
@@ -133,11 +145,6 @@ class Recognizer extends EventTarget {
}
})
}
acceptWaveform(audioData) {
let start = _malloc(audioData.length * 4);
HEAPF32.set(audioData, start / 4);
this.obj.acceptWaveform(start, audioData.length);
}
async delete(processCurrent = false) {
let result = new Promise((resolve, _) => this.addEventListener("status", _ => {
this.obj.delete();
@@ -156,22 +163,25 @@ class Recognizer extends EventTarget {
})
switch(mode) {
case 1:
rec.obj = new Module.Recognizer(objs.length - 1, sampleRate, model);
rec.obj = new Module['Recognizer'](objs.length - 1, sampleRate, model);
break;
case 2:
rec.obj = new Module.Recognizer(objs.length -1, sampleRate, model, spkModel);
rec.obj = new Module['Recognizer'](objs.length -1, sampleRate, model, spkModel);
break;
default:
rec.obj = new Module.Recognizer(objs.length - 1, sampleRate, model, grammar, 0);
rec.obj = new Module['Recognizer'](objs.length - 1, sampleRate, model, grammar, 0);
}
return result;
}
}
Module.createRecognizer = (model, sampleRate) =>
Module['createRecognizer'] = (model, sampleRate) =>
Recognizer.mk(model.obj, sampleRate, 1);
Module.createRecognizerWithSpkModel = (model, sampleRate, spkModel) =>
Module['createRecognizerWithSpkModel'] = (model, sampleRate, spkModel) =>
Recognizer.mk(model.obj, sampleRate, 2, null, spkModel.obj);
Module.createRecognizerWithGrm = (model, sampleRate, grammar) =>
Module['createRecognizerWithGrm'] = (model, sampleRate, grammar) =>
Recognizer.mk(model.obj, sampleRate, 3, grammar, null);

View File

@@ -72,7 +72,7 @@ if [ ! -d "$VOSK" ]; then
fi
cd "$SRC" &&
em++ Util.cc CommonModel.cc Recognizer.cc Bindings.cc -O3 -DEMSCRIPTEN_HAS_UNBOUND_TYPE_NAMES=0 -fno-rtti -DMAX_WORKERS="$MAX_THREADS" -sWASMFS -sWASM_BIGINT -sMODULARIZE -sWASM_EXNREF -sTEXTDECODER=2 -sWASM_WORKERS=2 -sEVAL_CTORS=2 -sINITIAL_MEMORY="$INITIAL_MEMORY" -sALLOW_MEMORY_GROWTH -sPOLYFILL=0 -sEXIT_RUNTIME=0 -sINVOKE_RUN=0 -sSUPPORT_LONGJMP=0 -sEXPORTED_FUNCTIONS=_malloc -sEXPORT_NAME=loadVosklet -sMALLOC=emmalloc -sEXPORTED_RUNTIME_METHODS=UTF8ToString -sENVIRONMENT=web,worker -I. -I"$VOSK"/src -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"$CLAPACK_WASM" -l:CBLAS/lib/cblas.a -l:CLAPACK-3.2.1/lapack.a -l:CLAPACK-3.2.1/libcblaswr.a -l:f2c_BLAS-3.8.0/blas.a -l:libf2c/libf2c.a -L"$VOSK"/src -l:vosk.a -lembind -flto -msimd128 -matomics -mbulk-memory -mreference-types -mnontrapping-fptoint -mextended-const -msign-ext -mmutable-globals --pre-js Wrapper.js -o ../Vosklet.js
em++ Util.cc CommonModel.cc Recognizer.cc Bindings.cc -O3 -DEMSCRIPTEN_HAS_UNBOUND_TYPE_NAMES=0 -fno-rtti -DMAX_WORKERS="$MAX_THREADS" -sWASMFS -sWASM_BIGINT -sMODULARIZE -sWASM_EXNREF -sTEXTDECODER=2 -sWASM_WORKERS=2 -sEVAL_CTORS=2 -sINITIAL_MEMORY="$INITIAL_MEMORY" -sALLOW_MEMORY_GROWTH -sPOLYFILL=0 -sEXIT_RUNTIME=0 -sINVOKE_RUN=0 -sSUPPORT_LONGJMP=0 -sEXPORTED_FUNCTIONS=_malloc -sEXPORT_NAME=loadVosklet -sMALLOC=emmalloc -sEXPORTED_RUNTIME_METHODS=UTF8ToString -sENVIRONMENT=web,worker -I. -I"$VOSK"/src -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"$CLAPACK_WASM" -l:CBLAS/lib/cblas.a -l:CLAPACK-3.2.1/lapack.a -l:CLAPACK-3.2.1/libcblaswr.a -l:f2c_BLAS-3.8.0/blas.a -l:libf2c/libf2c.a -L"$VOSK"/src -l:vosk.a -lembind -flto -msimd128 -matomics -mbulk-memory -mreference-types -mnontrapping-fptoint -mextended-const -msign-ext -mmutable-globals --pre-js Wrapper.js --closure 1 -o ../Vosklet.js
cd .. &&
rm -f Vosklet.worker.js
@@ -80,6 +80,6 @@ cp Vosklet.js Examples/Vosklet.js &&
cp Vosklet.wasm Examples/Vosklet.wasm &&
# Can't serve files from raw.githubusercontent with Content-Encoding: gzip header so the browser won't decompress automatically. Manually decompressing instead.
sed -i 's/.pipeThrough(new CompressionStream("gzip"))//;s/teed\[1\]/teed[1].pipeThrough(new DecompressionStream("gzip"))/' Examples/Vosklet.js &&
sed -i 's/.pipeThrough(new CompressionStream("gzip"))//;s/\[1\])/[1]).pipeThrough(new DecompressionStream("gzip"))/' Examples/Vosklet.js &&
rm -rf /tmp/openfst