#include "CommonModel.h" CommonModel::CommonModel(int index, bool normalMdl, int tarStart, int tarSize) : normalMdl{normalMdl}, index{index} { extractAndLoad(reinterpret_cast(tarStart), tarSize); } void CommonModel::extractAndLoad(unsigned char *tar, int tarSize) { // Map index onto [A-Z] const char storepath[3]{'/', static_cast(index % 26 + 'A')}; int res{untar(tar, tarSize, storepath)}; free(tar); const char *untarErr{}; switch (res) { case IncorrectFormat: untarErr = "Untar: Incorrect tar format, must be USTAR"; break; case IncorrectFiletype: untarErr = "Untar: Not a directory or regular file"; break; case FailedOpen: untarErr = "Untar: Unable to open file for write"; break; case FailedWrite: untarErr = "Untar: Unable to write file"; break; case FailedClose: untarErr = "Untar: Unable to close file after write"; }; if (untarErr != nullptr) { fireEv(index, untarErr); return; } if (normalMdl) mdl = vosk_model_new(storepath); else mdl = vosk_spk_model_new(storepath); if (normalMdl ? std::get(mdl) != nullptr : std::get(mdl) != nullptr) fireEv(index); else fireEv(index, "Unable to load model for recognition"); fs::remove_all(storepath); } int CommonModel::findWord(std::string word) { return vosk_model_find_word(std::get(mdl), word.c_str()); } CommonModel::~CommonModel() { if (normalMdl) vosk_model_free(std::get(mdl)); else vosk_spk_model_free(std::get(mdl)); }