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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,3 +1,8 @@
/**
* @fileoverview
* @suppress {undefinedVars|checkTypes}
*/
let objs = []; let objs = [];
let events = ["status", "partialResult", "result"]; let events = ["status", "partialResult", "result"];
let storageWorkerURL = URL.createObjectURL(new Blob(['(', (() => { let storageWorkerURL = URL.createObjectURL(new Blob(['(', (() => {
@@ -61,14 +66,15 @@ let processorURL = URL.createObjectURL(new Blob(['(', (() => {
} }
}) })
}).toString(), ')()'], { type: "text/javascript" })); }).toString(), ')()'], { type: "text/javascript" }));
Module.cleanUp = async () => {
Module['cleanUp'] = async () => {
for(let obj of objs) await obj.delete(); for(let obj of objs) await obj.delete();
URL.revokeObjectURL(processorURL); URL.revokeObjectURL(processorURL);
URL.revokeObjectURL(storageWorkerURL); URL.revokeObjectURL(storageWorkerURL);
storageWorker.terminate(); storageWorker.terminate();
} }
Module.createTransferer = async (ctx, bufferSize) => { Module['createTransferer'] = async (ctx, bufferSize) => {
await ctx.audioWorklet.addModule(processorURL); await ctx.audioWorklet.addModule(processorURL);
return new AudioWorkletNode(ctx, "VoskletTransferer", { return new AudioWorkletNode(ctx, "VoskletTransferer", {
channelCountMode: "explicit", channelCountMode: "explicit",
@@ -92,7 +98,7 @@ class CommonModel extends EventTarget {
let result = new Promise((resolve, reject) => { let result = new Promise((resolve, reject) => {
mdl.addEventListener("status", ev => { mdl.addEventListener("status", 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)
@@ -102,7 +108,7 @@ class CommonModel extends EventTarget {
tar = tar.data; tar = tar.data;
let tarStart = _malloc(tar.byteLength); let tarStart = _malloc(tar.byteLength);
HEAPU8.set(new Uint8Array(tar), tarStart); 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 }); }, { once: true });
storageWorker.postMessage({ storageWorker.postMessage({
url: url, 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); CommonModel.mk(url, storepath, id, true);
Module.createSpkModel = async (url, storepath, id) => Module['createSpkModel'] = async (url, storepath, id) =>
CommonModel.mk(url, storepath, id, false); CommonModel.mk(url, storepath, id, false);
class Recognizer extends EventTarget { class Recognizer extends EventTarget {
constructor() { constructor() {
super(); 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); objs.push(this);
return new Proxy(this, { return new Proxy(this, {
get(self, prop, _) { 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) { async delete(processCurrent = false) {
let result = new Promise((resolve, _) => this.addEventListener("status", _ => { let result = new Promise((resolve, _) => this.addEventListener("status", _ => {
this.obj.delete(); this.obj.delete();
@@ -156,22 +163,25 @@ class Recognizer extends EventTarget {
}) })
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);
} }
return result; return result;
} }
} }
Module.createRecognizer = (model, sampleRate) =>
Module['createRecognizer'] = (model, sampleRate) =>
Recognizer.mk(model.obj, sampleRate, 1); 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); 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); Recognizer.mk(model.obj, sampleRate, 3, grammar, null);

View File

@@ -72,7 +72,7 @@ if [ ! -d "$VOSK" ]; then
fi fi
cd "$SRC" && 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 .. && cd .. &&
rm -f Vosklet.worker.js rm -f Vosklet.worker.js
@@ -80,6 +80,6 @@ cp Vosklet.js Examples/Vosklet.js &&
cp Vosklet.wasm Examples/Vosklet.wasm && 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. # 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 rm -rf /tmp/openfst

4
test
View File

@@ -41,8 +41,8 @@ echo "Mode = $MODE" &&
if [ "$MODE" = 0 ]; then if [ "$MODE" = 0 ]; then
em++ Util.cc CommonModel.cc Recognizer.cc Bindings.cc -O0 -g3 -Wall -Werror -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 -sSTACK_OVERFLOW_CHECK=2 -sASSERTIONS=2 -sINITIAL_MEMORY="$INITIAL_MEMORY" -sALLOW_MEMORY_GROWTH -sRUNTIME_DEBUG -sPOLYFILL=0 -sEXIT_RUNTIME=0 -sINVOKE_RUN=0 -sDISABLE_EXCEPTION_CATCHING=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 -msimd128 -matomics -mbulk-memory -mreference-types -mnontrapping-fptoint -mextended-const -msign-ext -mmutable-globals --pre-js Wrapper.js -o ../test.js em++ Util.cc CommonModel.cc Recognizer.cc Bindings.cc -O0 -g3 -Wall -Werror -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 -sSTACK_OVERFLOW_CHECK=2 -sASSERTIONS=2 -sINITIAL_MEMORY="$INITIAL_MEMORY" -sALLOW_MEMORY_GROWTH -sRUNTIME_DEBUG -sPOLYFILL=0 -sEXIT_RUNTIME=0 -sINVOKE_RUN=0 -sDISABLE_EXCEPTION_CATCHING=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 -msimd128 -matomics -mbulk-memory -mreference-types -mnontrapping-fptoint -mextended-const -msign-ext -mmutable-globals --pre-js Wrapper.js -o ../test.js
elif [ "$MODE" = 1 ]; then elif [ "$MODE" = 1 ]; then
em++ Util.cc CommonModel.cc Recognizer.cc Bindings.cc -O3 -Wall -Werror -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 ../test.js em++ Util.cc CommonModel.cc Recognizer.cc Bindings.cc -O3 -Wall -Werror -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 ../test.js
fi fi
cd .. && cd .. &&
sed -i 's/.pipeThrough(new CompressionStream("gzip"))//;s/teed\[1\]/teed[1].pipeThrough(new DecompressionStream("gzip"))/' test.js && sed -i 's/.pipeThrough(new CompressionStream("gzip"))//;s/\[1\])/[1]).pipeThrough(new DecompressionStream("gzip"))/' test.js &&
rm -f test.worker.js rm -f test.worker.js