UNPKG

web-wake-word

Version:

A web package for keyword detection

2 lines 13.9 kB
/*! For license information please see a78504425790fb1c7254.js.LICENSE.txt */ function _typeof(e){return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_typeof(e)}function _slicedToArray(e,r){return _arrayWithHoles(e)||_iterableToArrayLimit(e,r)||_unsupportedIterableToArray(e,r)||_nonIterableRest()}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(e,r){if(e){if("string"==typeof e)return _arrayLikeToArray(e,r);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(e,r):void 0}}function _arrayLikeToArray(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,n=Array(r);t<r;t++)n[t]=e[t];return n}function _iterableToArrayLimit(e,r){var t=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=t){var n,o,a,i,s=[],u=!0,c=!1;try{if(a=(t=t.call(e)).next,0===r){if(Object(t)!==t)return;u=!1}else for(;!(u=(n=a.call(t)).done)&&(s.push(n.value),s.length!==r);u=!0);}catch(e){c=!0,o=e}finally{try{if(!u&&null!=t.return&&(i=t.return(),Object(i)!==i))return}finally{if(c)throw o}}return s}}function _arrayWithHoles(e){if(Array.isArray(e))return e}function _defineProperty(e,r,t){return(r=_toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function _regenerator(){var e,r,t="function"==typeof Symbol?Symbol:{},n=t.iterator||"@@iterator",o=t.toStringTag||"@@toStringTag";function a(t,n,o,a){var u=n&&n.prototype instanceof s?n:s,c=Object.create(u.prototype);return _regeneratorDefine2(c,"_invoke",function(t,n,o){var a,s,u,c=0,f=o||[],l=!1,p={p:0,n:0,v:e,a:y,f:y.bind(e,4),d:function(r,t){return a=r,s=0,u=e,p.n=t,i}};function y(t,n){for(s=t,u=n,r=0;!l&&c&&!o&&r<f.length;r++){var o,a=f[r],y=p.p,m=a[2];t>3?(o=m===n)&&(s=a[4]||3,u=a[5]===e?a[3]:a[5],a[4]=3,a[5]=e):a[0]<=y&&((o=t<2&&y<a[1])?(s=0,p.v=n,p.n=a[1]):y<m&&(o=t<3||a[0]>n||n>m)&&(a[4]=t,a[5]=n,p.n=m,s=0))}if(o||t>1)return i;throw l=!0,n}return function(o,f,m){if(c>1)throw TypeError("Generator is already running");for(l&&1===f&&y(f,m),s=f,u=m;(r=s<2?e:u)||!l;){a||(s?s<3?(s>1&&(p.n=-1),y(s,u)):p.n=u:p.v=u);try{if(c=2,a){if(s||(o="next"),r=a[o]){if(!(r=r.call(a,u)))throw TypeError("iterator result is not an object");if(!r.done)return r;u=r.value,s<2&&(s=0)}else 1===s&&(r=a.return)&&r.call(a),s<2&&(u=TypeError("The iterator does not provide a '"+o+"' method"),s=1);a=e}else if((r=(l=p.n<0)?u:t.call(n,p))!==i)break}catch(r){a=e,s=1,u=r}finally{c=1}}return{value:r,done:l}}}(t,o,a),!0),c}var i={};function s(){}function u(){}function c(){}r=Object.getPrototypeOf;var f=[][n]?r(r([][n]())):(_regeneratorDefine2(r={},n,(function(){return this})),r),l=c.prototype=s.prototype=Object.create(f);function p(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,c):(e.__proto__=c,_regeneratorDefine2(e,o,"GeneratorFunction")),e.prototype=Object.create(l),e}return u.prototype=c,_regeneratorDefine2(l,"constructor",c),_regeneratorDefine2(c,"constructor",u),u.displayName="GeneratorFunction",_regeneratorDefine2(c,o,"GeneratorFunction"),_regeneratorDefine2(l),_regeneratorDefine2(l,o,"Generator"),_regeneratorDefine2(l,n,(function(){return this})),_regeneratorDefine2(l,"toString",(function(){return"[object Generator]"})),(_regenerator=function(){return{w:a,m:p}})()}function _regeneratorDefine2(e,r,t,n){var o=Object.defineProperty;try{o({},"",{})}catch(e){o=0}_regeneratorDefine2=function(e,r,t,n){if(r)o?o(e,r,{value:t,enumerable:!n,configurable:!n,writable:!n}):e[r]=t;else{var a=function(r,t){_regeneratorDefine2(e,r,(function(e){return this._invoke(r,t,e)}))};a("next",0),a("throw",1),a("return",2)}},_regeneratorDefine2(e,r,t,n)}function asyncGeneratorStep(e,r,t,n,o,a,i){try{var s=e[a](i),u=s.value}catch(e){return void t(e)}s.done?r(u):Promise.resolve(u).then(n,o)}function _asyncToGenerator(e){return function(){var r=this,t=arguments;return new Promise((function(n,o){var a=e.apply(r,t);function i(e){asyncGeneratorStep(a,n,o,i,s,"next",e)}function s(e){asyncGeneratorStep(a,n,o,i,s,"throw",e)}i(void 0)}))}}function _classCallCheck(e,r){if(!(e instanceof r))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,r){for(var t=0;t<r.length;t++){var n=r[t];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,_toPropertyKey(n.key),n)}}function _createClass(e,r,t){return r&&_defineProperties(e.prototype,r),t&&_defineProperties(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function _toPropertyKey(e){var r=_toPrimitive(e,"string");return"symbol"==_typeof(r)?r:r+""}function _toPrimitive(e,r){if("object"!=_typeof(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,r||"default");if("object"!=_typeof(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(e)}import{ort}from"./onnx-runtime-loader.js";import{generateMelSpectrogram,extractWindows,expandDims,flatten3D,flatten4D}from"./utils.js";import path from"path-browserify";import{getSessionOptions,getWasmPaths}from"./getSessionOptions.js";var logMemory=function(e){try{"undefined"!=typeof performance&&performance.memory&&"number"==typeof performance.memory.usedJSHeapSize&&(performance.memory.usedJSHeapSize/1024/1024).toFixed(1)}catch(e){}},modelSuffix=".onnx";export var ModelLoader=function(){return _createClass((function e(r,t){var n,o,a;_classCallCheck(this,e),"undefined"!=typeof process&&null!==(n=process.env)&&void 0!==n&&n.MODEL_FOLDER_PATH&&process.env.MODEL_FOLDER_PATH;var i="undefined"!=typeof process&&null!==(o=process.env)&&void 0!==o&&o.WASM_BASE_PATH?process.env.WASM_BASE_PATH:"./",s=("undefined"!=typeof process&&null!==(a=process.env)&&void 0!==a&&a.AUDIO_WORKLET_PATH&&process.env.AUDIO_WORKLET_PATH,!1);try{new URL("modelLoader.js",import.meta.url)}catch(e){s=!0}Array.isArray(r)?t&&(this.wasmPaths=s?i:getWasmPaths(t)):r&&(this.wasmPaths=s?i+"ort-wasm-simd.wasm":getWasmPaths(r)),this.keywordSessions=null,this.melSpecSession=null,this.embeddingSession=null}),[{key:"loadModels",value:(s=_asyncToGenerator(_regenerator().m((function e(r,t,n){var o,a,i;return _regenerator().w((function(e){for(;;)switch(e.n){case 0:return this.sampleRate=n,ort.env.wasm.proxy=!1,ort.env.wasm.simd=!0,ort.env.wasm.numThreads=1,ort.env.wasm.simd=!0,ort.env.wasm.numThreads=1,o={executionProviders:[],intraOpNumThreads:1,interOpNumThreads:1,enableMemPattern:!0,enableCpuMemArena:!0,graphOptimizationLevel:"all",executionMode:"sequential",logSeverityLevel:4},a=path.join(r,"/embedding_model"+modelSuffix),e.n=1,ort.InferenceSession.create(a,o);case 1:return this.embeddingSession=e.v,logMemory("After loading embedding Only !!!! "),logMemory("After loading embedding Only !!!! "),logMemory("After loading embedding Only !!!! "),logMemory("After loading embedding Only !!!! "),a=path.join(r,"/melspectrogram"+modelSuffix),e.n=2,ort.InferenceSession.create(a,o);case 2:if(this.melSpecSession=e.v,!Array.isArray(t)){e.n=4;break}return e.n=3,Promise.all(t.map(function(){var e=_asyncToGenerator(_regenerator().m((function e(t){var n,a;return _regenerator().w((function(e){for(;;)switch(e.n){case 0:return n=path.join(r,t.modelToUse),e.n=1,ort.InferenceSession.create(n,o);case 1:return a=e.v,e.a(2,{session:a,modelIdentifier:t.modelToUse})}}),e)})));return function(r){return e.apply(this,arguments)}}()));case 3:this.keywordSessions=e.v,e.n=6;break;case 4:return a=path.join(r+"/",t),e.n=5,ort.InferenceSession.create(a,{graphOptimizationLevel:"all"});case 5:i=e.v,this.keywordSessions=[{session:i,modelIdentifier:t}];case 6:if(!(this.keywordSessions.length>0)){e.n=8;break}return e.n=7,this.runModelWithDifferentFeatures(this.keywordSessions[0].session);case 7:this.nFeatureFrames=e.v;case 8:return e.a(2,this.nFeatureFrames)}}),e,this)}))),function(e,r,t){return s.apply(this,arguments)})},{key:"getMelspectrogram",value:(i=_asyncToGenerator(_regenerator().m((function e(r){var t,n,o,a,i,s,u,c,f,l,p,y,m,d,h,g,v;return _regenerator().w((function(e){for(;;)switch(e.n){case 0:return r instanceof Float32Array||(r=new Float32Array(r)),t=[1,r.length],n=new ort.Tensor("float32",r,t),o=_defineProperty({},this.melSpecSession.inputNames[0],n),e.p=1,e.n=2,this.melSpecSession.run(o);case 2:if(a=e.v,(i=Object.keys(a||{})).length){e.n=3;break}throw new Error("No outputs returned from ONNX session!");case 3:if((s=a[i[0]])&&s.data&&s.dims){e.n=4;break}throw console.error("ONNX output shape/data missing:",s),new Error("ONNX output object is malformed or missing expected fields");case 4:for(u=s.data,c=s.dims,f=_slicedToArray(c,4),l=f[0],p=f[1],y=f[2],m=f[3],1===l&&1===p||console.warn("Unexpected batch/channel dimension:",c),d=[],h=0;h<y;++h)d.push(u.slice(h*m,(h+1)*m));return g=this.transform(d,(function(e){return e/10+2})),e.a(2,g);case 5:return e.p=5,v=e.v,console.error("Failed to run MelSpectrogram ONNX session:",v),e.a(2,[])}}),e,this,[[1,5]])}))),function(e){return i.apply(this,arguments)})},{key:"reshapeTo2D",value:function(e,r){for(var t=_slicedToArray(r,4),n=(t[0],t[1],t[2]),o=t[3],a=[],i=0,s=0;s<n;s++){for(var u=[],c=0;c<o;c++)u.push(e[i++]);a.push(u)}return a}},{key:"squeeze4D",value:function(e){var r=[e.length,e[0].length,e[0][0].length,e[0][0][0].length],t=r[1];if(1===r[0]&&1===r[3]){for(var n=[],o=0;o<t;o++)n.push(e[0][o].map((function(e){return e[0]})));return n}return e}},{key:"transform",value:function(e,r){return e.map((function(e){return e.map(r)}))}},{key:"___getMelspectrogram",value:(a=_asyncToGenerator(_regenerator().m((function e(r){var t,n;return _regenerator().w((function(e){for(;;)if(0===e.n)return t=generateMelSpectrogram(r,this.sampleRate),n=t.map((function(e){return e.map((function(e){return e/10+2}))})),e.a(2,n)}),e,this)}))),function(e){return a.apply(this,arguments)})},{key:"getMelspectrogramShort",value:(o=_asyncToGenerator(_regenerator().m((function e(r){var t,n;return _regenerator().w((function(e){for(;;)switch(e.n){case 0:for(r instanceof Float32Array||(r=new Float32Array(r)),t=0;t<r.length;t++)("number"!=typeof r[t]||isNaN(r[t]))&&console.error("Invalid number at position [".concat(t,"]:"),r[t]);return e.n=1,this.getMelspectrogram(r);case 1:return n=e.v,e.a(2,n)}}),e,this)}))),function(e){return o.apply(this,arguments)})},{key:"getEmbeddings",value:(n=_asyncToGenerator(_regenerator().m((function e(r){var t,n,o,a,i,s,u,c,f,l,p,y,m,d;return _regenerator().w((function(e){for(;;)switch(e.n){case 0:return e.n=1,this.getMelspectrogramShort(r);case 1:return t=e.v,n=extractWindows(t,76),o=expandDims(n),a=flatten3D(o),i=[n.length,76,32,1],s=new ort.Tensor("float32",a,i),u={input_1:s},e.n=2,this.embeddingSession.run(u);case 2:return c=e.v,l=Object.keys(c)[0],p=c[l].data,(y=c[l].dims)[0],y[1],y[2],f=y[3],96!==(m=f)&&console.error("chunkSize!=96!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"),d=this.reshapeEmbeddings(p,m),e.a(2,d)}}),e,this)}))),function(e){return n.apply(this,arguments)})},{key:"reshapeEmbeddings",value:function(e,r){for(var t=[],n=Math.floor(e.length/r),o=0;o<n;o++){var a=o*r,i=a+r;t.push(e.slice(a,i))}return t}},{key:"runModelWithDifferentFeatures",value:(t=_asyncToGenerator(_regenerator().m((function e(r,t){var n,o,a,i,s,u,c,f,l,p,y;return _regenerator().w((function(e){for(;;)switch(e.n){case 0:n=null,o=new Float32Array(1536),a=new Float32Array(2688).fill(0),i=0,s=0,u=[{size:16,data:o},{size:28,data:a}];case 1:if(!(s<u.length)){e.n=6;break}return c=u[s],e.p=2,(f=c.data)instanceof Float32Array||(f=new Float32Array(f)),i=c.size,l=new ort.Tensor("float32",f,[1,i,96]),p=_defineProperty({},r.inputNames[0],l),e.n=3,r.run(p);case 3:return(y=e.v)[Object.keys(y)[0]],n=i,e.a(3,6);case 4:e.p=4,e.v;case 5:s++,e.n=1;break;case 6:if(null===n){e.n=7;break}return e.a(2,n);case 7:return e.a(2,null);case 8:return e.a(2)}}),e,null,[[2,4]])}))),function(e,r){return t.apply(this,arguments)})},{key:"hasUndefined",value:function(e){for(var r=0;r<e.length;r++)if("number"!=typeof e[r]||isNaN(e[r]))throw new Error("hasUndefined() flattenedFeatures[i] ".concat(e[r]))}},{key:"predictKeyword",value:(r=_asyncToGenerator(_regenerator().m((function e(r,t){var n,o,a,i,s,u;return _regenerator().w((function(e){for(;;)switch(e.n){case 0:if(this.hasUndefined(r),r.length===96*this.nFeatureFrames){e.n=1;break}throw new Error("Expected flattenedFeatures.length ".concat(96*this.nFeatureFrames,", got ").concat(r.length));case 1:if(o=null===(n=this.keywordSessions.find((function(e){return e.modelIdentifier===t})))||void 0===n?void 0:n.session){e.n=2;break}throw new Error('Model session for "'.concat(t,'" not found'));case 2:return a=new ort.Tensor("float32",r,[1,this.nFeatureFrames,96]),i=_defineProperty({},o.inputNames[0],a),e.n=3,o.run(i);case 3:return s=e.v,u=s[Object.keys(s)[0]],e.a(2,u.data[0])}}),e,this)}))),function(e,t){return r.apply(this,arguments)})},{key:"predictKeyword_org",value:(e=_asyncToGenerator(_regenerator().m((function e(r){var t,n,o,a,i;return _regenerator().w((function(e){for(;;)switch(e.n){case 0:if(this.hasUndefined(r),r.length===96*this.nFeatureFrames){e.n=1;break}throw new Error("Expected flattenedFeatures.length ".concat(96*this.nFeatureFrames," got ").concat(r.length));case 1:return t=new ort.Tensor("float32",r,[1,this.nFeatureFrames,96]),n=_defineProperty({},this.keywordSession.inputNames[0],t),this.nFeatureFrames,e.n=2,this.keywordSession.run(n);case 2:return o=e.v,a=o[Object.keys(o)[0]],i=a.data[0],e.a(2,i)}}),e,this)}))),function(r){return e.apply(this,arguments)})}]);var e,r,t,n,o,a,i,s}();