Add findWord to model object, update docs and change test directory

This commit is contained in:
msqr1
2024-04-28 21:46:36 -07:00
parent b7df449ae0
commit 0342e66e74
15 changed files with 69 additions and 171 deletions

View File

@@ -15,7 +15,8 @@ EMSCRIPTEN_BINDINGS() {
class_<genericModel>("genericModel")
.constructor<int, bool, std::string, std::string>(allow_raw_pointers())
.function("extractAndLoad", &genericModel::extractAndLoad, allow_raw_pointers());
.function("extractAndLoad", &genericModel::extractAndLoad, allow_raw_pointers())
.function("findWord", &genericModel::findWord, allow_raw_pointers());
class_<recognizer>("recognizer")
.constructor<int, float, genericModel*>(allow_raw_pointers())

View File

@@ -54,6 +54,9 @@ void genericModel::extractAndLoad(int tarStart, int tarSize) {
}};
t.detach();
}
int genericModel::findWord(std::string word) {
return vosk_model_find_word(std::get<VoskModel*>(mdl), word.c_str());
}
genericModel::~genericModel() {
archive_entry_free(entry);
if(normalMdl) vosk_model_free(std::get<VoskModel*>(mdl));

View File

@@ -23,6 +23,7 @@ struct genericModel {
std::function<void()> func;
archive_entry* entry;
void extractAndLoad(int tarStart, int tarSize);
int findWord(std::string word);
genericModel(int index, bool normalMdl, std::string storepath, std::string id);
~genericModel();
};

View File

@@ -19,28 +19,30 @@ let processorURL = URL.createObjectURL(new Blob(['(', (() => {
}
})
}).toString(), ')()'], { type : "text/javascript" }))
Module.cleanUp = () => {
objs.forEach(obj => obj.obj.delete())
URL.revokeObjectURL(processorURL)
}
Module.createTransferer = async (ctx, bufferSize) => {
await ctx.audioWorklet.addModule(processorURL)
return new AudioWorkletNode(ctx, "VoskletTransferer", {
channelCountMode : "explicit",
numberOfInputs : 1,
numberOfOutputs : 1,
numberOfOutputs : 0,
channelCount : 1,
processorOptions : { maxCount: bufferSize / 128 }
})
}
async function getFileHandle(path, create = false) {
let components = path.split("/")
let prevDir = await navigator.storage.getDirectory()
for(let component of components.slice(0, -1)) {
prevDir = await prevDir.getDirectoryHandle(component, { create : create })
}
for(let component of components.slice(0, -1)) prevDir = await prevDir.getDirectoryHandle(component, { create : create })
return prevDir.getFileHandle(components[components.length - 1], { create : create })
}
class genericModel extends EventTarget {
constructor() {
super()
@@ -50,7 +52,10 @@ class genericModel extends EventTarget {
let mdl = new genericModel()
let result = new Promise((resolve, reject) => {
mdl.addEventListener("0", ev => {
if(ev.detail === "0") return resolve(mdl)
if(ev.detail == "0") {
if(normalMdl) mdl.findWord = (word) => mdl.obj.findWord(word)
return resolve(mdl)
}
mdl.delete()
reject(ev.detail)
}, { once : true })
@@ -60,15 +65,13 @@ class genericModel extends EventTarget {
try {
let dataFile = await (await getFileHandle(storepath + "/model.tgz")).getFile()
let idFile = await (await getFileHandle(storepath + "/id")).getFile()
if(await idFile.text() !== id) throw ""
if(await idFile.text() != id) throw ""
tar = dataFile.stream()
}
catch {
try {
let res = await fetch(url)
if(!res.ok) {
throw "Unable to download model"
}
if(!res.ok) throw "Unable to download model"
let teedBody = res.body.tee()
let newDataFile = await (await getFileHandle(storepath + "/model.tgz", true)).createWritable()
await newDataFile.write(await new Response(teedBody[0]).arrayBuffer())
@@ -79,7 +82,7 @@ class genericModel extends EventTarget {
tar = teedBody[1]
}
catch(e) {
mdl.obj.delete()
mdl.delete()
throw e
}
}
@@ -93,12 +96,15 @@ class genericModel extends EventTarget {
this.obj.delete()
}
}
Module.createModel = async (url, storepath, id) => {
return genericModel.create(url, storepath, id, true)
}
Module.createSpkModel = async (url, storepath, id) => {
return genericModel.create(url, storepath, id, false)
}
class recognizer extends EventTarget {
constructor() {
super()
@@ -113,7 +119,7 @@ class recognizer extends EventTarget {
let rec = new recognizer()
let result = new Promise((resolve, reject) => {
rec.addEventListener("0", ev => {
if(ev.detail === "0") return resolve(rec)
if(ev.detail == "0") return resolve(rec)
rec.delete()
reject(ev.detail)
}, { once : true })
@@ -136,12 +142,15 @@ class recognizer extends EventTarget {
this.obj.pushData(start, audioData.length)
}
}
Module.createRecognizer = (model, sampleRate) => {
return recognizer.create(model.obj, sampleRate, 1)
}
Module.createRecognizerWithSpkModel = (model, sampleRate, spkModel) => {
return recognizer.create(model.obj, sampleRate, 2, null, spkModel)
}
}
Module.createRecognizerWithGrm = (model, sampleRate, grammar) => {
return recognizer.create(model.obj, sampleRate, 3, grammar, null)
}
}