move static thread declaration, recompile test and test --> worked.
This commit is contained in:
@@ -38,8 +38,8 @@ if [ $(realpath $EMSDK) == $(realpath emsdk) ]; then
|
|||||||
echo "EMSDK is current directory, installing emsdk and Emscripten..." &&
|
echo "EMSDK is current directory, installing emsdk and Emscripten..." &&
|
||||||
git clone --depth=1 https://github.com/emscripten-core/emsdk.git &&
|
git clone --depth=1 https://github.com/emscripten-core/emsdk.git &&
|
||||||
cd emsdk &&
|
cd emsdk &&
|
||||||
./emsdk install 3.1.51 &&
|
./emsdk install 3.1.53 &&
|
||||||
./emsdk activate 3.1.51
|
./emsdk activate 3.1.53
|
||||||
fi
|
fi
|
||||||
|
|
||||||
. $EMSDK/emsdk_env.sh &&
|
. $EMSDK/emsdk_env.sh &&
|
||||||
@@ -88,4 +88,4 @@ em++ -pthread -O3 -flto -Wno-deprecated -I. -I$KALDI/src -I$OPENFST/include $VOS
|
|||||||
emar -rcs vosk.a ${VOSK_FILES//.cc/.o} &&
|
emar -rcs vosk.a ${VOSK_FILES//.cc/.o} &&
|
||||||
|
|
||||||
cd $SRC &&
|
cd $SRC &&
|
||||||
em++ -O3 genericModel.cc model.cc spkModel.cc recognizer.cc bindings.cc -sWASMFS -sWASM_BIGINT -sSINGLE_FILE -sEMBIND_STD_STRING_IS_UTF8 -sSUPPORT_LONGJMP=0 -sMODULARIZE -sEXPORT_NAME=loadBR -sENVIRONMENT=web,worker -sINITIAL_MEMORY=32pf -sASYNCIFY -sPTHREAD_POOL_SIZE=$MAX_THREADS -sPTHREAD_POOL_SIZE_STRICT -sPTHREAD_POOL_DELAY_LOAD -sASYNCIFY_ONLY=['emscripten_wget'] -sALLOW_BLOCKING_ON_MAIN_THREAD=0 -sPOLYFILL=0 --pre-js pre.js -I. -I$LIBARCHIVE/include -I$VOSK/src -L$LIBARCHIVE/lib -larchive -L$ZSTD/lib -lzstd -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 -lopfs.js -lembind -pthread -flto -o BrowserRecognizer.js
|
em++ -O3 global.cc genericModel.cc model.cc spkModel.cc recognizer.cc bindings.cc -sWASMFS -sWASM_BIGINT -sSINGLE_FILE -sEMBIND_STD_STRING_IS_UTF8 -sEXPORTED_RUNTIME_METHODS=UTF8ToString,stringToUTF8OnStack -sMODULARIZE -sEXPORTED_FUNCTIONS=_malloc,_free,_main -sSUPPORT_LONGJMP=0 -sTRUSTED_TYPES -sEXPORT_NAME=loadBR -sENVIRONMENT=web,worker -sINITIAL_MEMORY=$MAX_MEMORY -sPTHREAD_POOL_SIZE=$MAX_THREADS -sPTHREAD_POOL_SIZE_STRICT=0 -sALLOW_BLOCKING_ON_MAIN_THREAD=1 -sPOLYFILL=0 -sPTHREAD_POOL_DELAY_LOAD --pre-js pre.js -I. -I$LIBARCHIVE/include -I$VOSK/src -L$LIBARCHIVE/lib -larchive -L$ZSTD/lib -lzstd -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 -lopfs.js -lembind -pthread -flto -o ../test/BrowserRecognizer.js
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#include "global.h"
|
#include "global.h"
|
||||||
|
static pthread_t selfTID{pthread_self()};
|
||||||
void throwJS(const char* msg, bool err) {
|
void throwJS(const char* msg, bool err) {
|
||||||
EM_ASM({
|
EM_ASM({
|
||||||
if($1) {
|
if($1) {
|
||||||
@@ -11,24 +11,25 @@ void throwJS(const char* msg, bool err) {
|
|||||||
}
|
}
|
||||||
void fireEv(const char *type, const char *content, int index) {
|
void fireEv(const char *type, const char *content, int index) {
|
||||||
static ProxyingQueue pq{};
|
static ProxyingQueue pq{};
|
||||||
static pthread_t selfTID{pthread_self()};
|
auto proxy{[index, type, content](){
|
||||||
static auto proxy{[index, type, content](){
|
|
||||||
EM_ASM({
|
EM_ASM({
|
||||||
console.log(objs[$0]);
|
console.log("Event type ", UTF8ToString($1), ", content " , UTF8ToString($2), ", sending to ", objs[$0]);
|
||||||
objs[$0].dispatchEvent(new CustomEvent(UTF8ToString($1), {"detail" : UTF8ToString($2)}))
|
objs[$0].dispatchEvent(new CustomEvent(UTF8ToString($1), {"detail" : UTF8ToString($2)}));
|
||||||
},index, type, content);
|
},index, type, content);
|
||||||
}};
|
}};
|
||||||
if(selfTID == pthread_self()) {
|
if(selfTID == pthread_self()) {
|
||||||
|
emscripten_console_log("Self dispatch");
|
||||||
proxy();
|
proxy();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
emscripten_console_log("Thread dispatch");
|
||||||
pq.proxySync(selfTID, proxy);
|
pq.proxySync(selfTID, proxy);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
//vosk_set_log_level(-1);
|
//vosk_set_log_level(-1);
|
||||||
std::thread t{[](){
|
std::thread t{[](){
|
||||||
wasmfs_create_directory("/opfs",0777,wasmfs_create_opfs_backend());
|
wasmfs_create_directory("/opfs", 0777, wasmfs_create_opfs_backend());
|
||||||
}};
|
}};
|
||||||
t.detach();
|
t.detach();
|
||||||
emscripten_exit_with_live_runtime();
|
emscripten_exit_with_live_runtime();
|
||||||
|
|||||||
@@ -11,9 +11,12 @@ bool model::checkModel() {
|
|||||||
return genericModel::checkModel();
|
return genericModel::checkModel();
|
||||||
}
|
}
|
||||||
void model::load(bool newThrd) {
|
void model::load(bool newThrd) {
|
||||||
static auto main{[this](){
|
auto main{[this](){
|
||||||
mdl = vosk_model_new(".");
|
mdl = vosk_model_new(".");
|
||||||
if(mdl == nullptr) fireEv("_continue", "Unable to load model for recognition", index);
|
if(mdl == nullptr) {
|
||||||
|
fireEv("_continue", "Unable to load model for recognition", index);
|
||||||
|
return;
|
||||||
|
}
|
||||||
fireEv("_continue", ".", index);
|
fireEv("_continue", ".", index);
|
||||||
}};
|
}};
|
||||||
if(!newThrd) {
|
if(!newThrd) {
|
||||||
|
|||||||
10
src/pre.js
10
src/pre.js
@@ -1,4 +1,4 @@
|
|||||||
let objs = [new EventTarget()]
|
let objs = []
|
||||||
class Recognizer extends EventTarget {
|
class Recognizer extends EventTarget {
|
||||||
constructor() {
|
constructor() {
|
||||||
super()
|
super()
|
||||||
@@ -11,7 +11,7 @@ class Recognizer extends EventTarget {
|
|||||||
async getNode(ctx, channelIndex = 0) {
|
async getNode(ctx, channelIndex = 0) {
|
||||||
if(typeof this.node === "undefined") {
|
if(typeof this.node === "undefined") {
|
||||||
let msgChannel = new MessageChannel()
|
let msgChannel = new MessageChannel()
|
||||||
ctx.AudioWorklet.addModule("src/processor.js")
|
ctx.AudioWorklet.addModule("../src/processor.js")
|
||||||
this.node = new AudioWorkletNode(ctx, 'BRProcessor', { channelCountMode: "max", numberOfInputs: 1, numberOfOutputs: 1 })
|
this.node = new AudioWorkletNode(ctx, 'BRProcessor', { channelCountMode: "max", numberOfInputs: 1, numberOfOutputs: 1 })
|
||||||
this.node.port.postMessage({cmd : "init", ptr: this.ptr, channel: channelIndex}, [msgChannel.port1])
|
this.node.port.postMessage({cmd : "init", ptr: this.ptr, channel: channelIndex}, [msgChannel.port1])
|
||||||
msgChannel.port1.onmessage = (ev) => {
|
msgChannel.port1.onmessage = (ev) => {
|
||||||
@@ -84,7 +84,7 @@ Module.makeModel = async (url, storepath, id) => {
|
|||||||
}, {once : true})
|
}, {once : true})
|
||||||
if(mdl.obj.checkModel()) {
|
if(mdl.obj.checkModel()) {
|
||||||
mdl.obj.load(true)
|
mdl.obj.load(true)
|
||||||
return resolve(mdl)
|
return;
|
||||||
}
|
}
|
||||||
(async () => {
|
(async () => {
|
||||||
let res = await fetch(url)
|
let res = await fetch(url)
|
||||||
@@ -110,7 +110,7 @@ Module.makeSpkModel = async (url, storepath, id) => {
|
|||||||
}, {once : true})
|
}, {once : true})
|
||||||
if(mdl.obj.checkModel()) {
|
if(mdl.obj.checkModel()) {
|
||||||
mdl.obj.load(true)
|
mdl.obj.load(true)
|
||||||
return resolve(mdl)
|
return
|
||||||
}
|
}
|
||||||
(async () => {
|
(async () => {
|
||||||
let res = await fetch(url)
|
let res = await fetch(url)
|
||||||
@@ -130,7 +130,7 @@ Module.makeRecognizer = (model, sampleRate) => {
|
|||||||
rec.addEventListener("_continue", (ev) => {
|
rec.addEventListener("_continue", (ev) => {
|
||||||
if(ev.detail == ".") {
|
if(ev.detail == ".") {
|
||||||
objs.push(rec)
|
objs.push(rec)
|
||||||
resolve(rec)
|
return resolve(rec)
|
||||||
}
|
}
|
||||||
rec.delete()
|
rec.delete()
|
||||||
reject(ev.detail)
|
reject(ev.detail)
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ recognizer::recognizer(model* mdl, float sampleRate, int index) : index(index) {
|
|||||||
fireEv("_continue", "Unable to initialize recognizer", this->index);
|
fireEv("_continue", "Unable to initialize recognizer", this->index);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
while(!done.test()) {
|
|
||||||
fireEv("_continue", "." ,this->index);
|
fireEv("_continue", "." ,this->index);
|
||||||
|
while(!done.test()) {
|
||||||
controller1.wait(false, std::memory_order_relaxed);
|
controller1.wait(false, std::memory_order_relaxed);
|
||||||
controller2.wait(false, std::memory_order_relaxed);
|
controller2.wait(false, std::memory_order_relaxed);
|
||||||
if(!done.test()) {
|
if(!done.test()) {
|
||||||
|
|||||||
@@ -15,9 +15,12 @@ void spkModel::afterFetch(int addr, size_t size) {
|
|||||||
genericModel::afterFetch(addr,size);
|
genericModel::afterFetch(addr,size);
|
||||||
}
|
}
|
||||||
void spkModel::load(bool newThrd) {
|
void spkModel::load(bool newThrd) {
|
||||||
static auto main{[this](){
|
auto main{[this](){
|
||||||
mdl = vosk_spk_model_new(".");
|
mdl = vosk_spk_model_new(".");
|
||||||
if(mdl == nullptr) fireEv("_continue", "Unable to load model for recognition", index);
|
if(mdl == nullptr) {
|
||||||
|
fireEv("_continue", "Unable to load model for recognition", index);
|
||||||
|
return;
|
||||||
|
}
|
||||||
fireEv("_continue", ".", index);
|
fireEv("_continue", ".", index);
|
||||||
}};
|
}};
|
||||||
if(!newThrd) {
|
if(!newThrd) {
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -95,9 +95,17 @@ function handleMessage(e) {
|
|||||||
Module['ENVIRONMENT_IS_PTHREAD'] = true;
|
Module['ENVIRONMENT_IS_PTHREAD'] = true;
|
||||||
|
|
||||||
if (typeof e.data.urlOrBlob == 'string') {
|
if (typeof e.data.urlOrBlob == 'string') {
|
||||||
|
if (typeof self.trustedTypes != 'undefined' && self.trustedTypes.createPolicy) {
|
||||||
|
var p = self.trustedTypes.createPolicy('emscripten#workerPolicy3', { createScriptURL: (ignored) => e.data.urlOrBlob });
|
||||||
|
importScripts(p.createScriptURL('ignored'));
|
||||||
|
} else
|
||||||
importScripts(e.data.urlOrBlob);
|
importScripts(e.data.urlOrBlob);
|
||||||
} else {
|
} else {
|
||||||
var objectUrl = URL.createObjectURL(e.data.urlOrBlob);
|
var objectUrl = URL.createObjectURL(e.data.urlOrBlob);
|
||||||
|
if (typeof self.trustedTypes != 'undefined' && self.trustedTypes.createPolicy) {
|
||||||
|
var p = self.trustedTypes.createPolicy('emscripten#workerPolicy3', { createScriptURL: (ignored) => objectUrl });
|
||||||
|
importScripts(p.createScriptURL('ignored'));
|
||||||
|
} else
|
||||||
importScripts(objectUrl);
|
importScripts(objectUrl);
|
||||||
URL.revokeObjectURL(objectUrl);
|
URL.revokeObjectURL(objectUrl);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,12 +27,12 @@ if [ $(realpath $EMSDK) == $(realpath emsdk) ]; then
|
|||||||
echo "EMSDK is current directory, installing emsdk and Emscripten..." &&
|
echo "EMSDK is current directory, installing emsdk and Emscripten..." &&
|
||||||
git clone --depth=1 https://github.com/emscripten-core/emsdk.git &&
|
git clone --depth=1 https://github.com/emscripten-core/emsdk.git &&
|
||||||
cd emsdk &&
|
cd emsdk &&
|
||||||
./emsdk install 3.1.51 &&
|
./emsdk install 3.1.53 &&
|
||||||
./emsdk activate 3.1.51
|
./emsdk activate 3.1.53
|
||||||
fi
|
fi
|
||||||
|
|
||||||
. $EMSDK/emsdk_env.sh &&
|
. $EMSDK/emsdk_env.sh &&
|
||||||
export PATH=:$PATH:$EMSDK/upstream/bin &&
|
export PATH=:$PATH:$EMSDK/upstream/bin &&
|
||||||
|
|
||||||
cd $SRC &&
|
cd $SRC &&
|
||||||
em++ -O0 global.cc genericModel.cc model.cc spkModel.cc recognizer.cc bindings.cc -sWASMFS -sWASM_BIGINT -sSINGLE_FILE -sEMBIND_STD_STRING_IS_UTF8 -sEXPORTED_RUNTIME_METHODS=UTF8ToString,stringToUTF8OnStack -sMODULARIZE -sEXPORTED_FUNCTIONS=_malloc,_free,_main -sSUPPORT_LONGJMP=0 -sEXPORT_NAME=loadBR -sENVIRONMENT=web,worker -sINITIAL_MEMORY=$MAX_MEMORY -sPTHREAD_POOL_SIZE=$MAX_THREADS -sPTHREAD_POOL_SIZE_STRICT=2 -sALLOW_BLOCKING_ON_MAIN_THREAD=1 -sPOLYFILL=0 -sPTHREAD_POOL_DELAY_LOAD --pre-js pre.js -I. -I$LIBARCHIVE/include -I$VOSK/src -L$LIBARCHIVE/lib -larchive -L$ZSTD/lib -lzstd -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 -lopfs.js -lembind -pthread -flto -o ../test/BrowserRecognizer.js
|
em++ -O0 global.cc genericModel.cc model.cc spkModel.cc recognizer.cc bindings.cc -sWASMFS -sWASM_BIGINT -sSINGLE_FILE -sEMBIND_STD_STRING_IS_UTF8 -sEXPORTED_RUNTIME_METHODS=UTF8ToString,stringToUTF8OnStack -sMODULARIZE -sEXPORTED_FUNCTIONS=_malloc,_free,_main -sSUPPORT_LONGJMP=0 -sTRUSTED_TYPES -sEXPORT_NAME=loadBR -sENVIRONMENT=web,worker -sINITIAL_MEMORY=$MAX_MEMORY -sPTHREAD_POOL_SIZE=$MAX_THREADS -sPTHREAD_POOL_SIZE_STRICT=0 -sEXIT_RUNTIME -sALLOW_BLOCKING_ON_MAIN_THREAD=1 -sPOLYFILL=0 -sPTHREAD_POOL_DELAY_LOAD --pre-js pre.js -I. -I$LIBARCHIVE/include -I$VOSK/src -L$LIBARCHIVE/lib -larchive -L$ZSTD/lib -lzstd -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 -lopfs.js -lembind -pthread -flto -o ../test/BrowserRecognizer.js
|
||||||
Reference in New Issue
Block a user