Socket
Socket
Sign inDemoInstall

@accentdotai/speech-events

Package Overview
Dependencies
0
Maintainers
1
Versions
15
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 0.1.1 to 0.2.0

2

dist/speech-events.min.js

@@ -1,1 +0,1 @@

(function(e,a){for(var i in a)e[i]=a[i]})(window,function(modules){var installedModules={};function __webpack_require__(moduleId){if(installedModules[moduleId]){return installedModules[moduleId].exports}var module=installedModules[moduleId]={i:moduleId,l:false,exports:{}};modules[moduleId].call(module.exports,module,module.exports,__webpack_require__);module.l=true;return module.exports}__webpack_require__.m=modules;__webpack_require__.c=installedModules;__webpack_require__.i=function(value){return value};__webpack_require__.d=function(exports,name,getter){if(!__webpack_require__.o(exports,name)){Object.defineProperty(exports,name,{configurable:false,enumerable:true,get:getter})}};__webpack_require__.n=function(module){var getter=module&&module.__esModule?function getDefault(){return module["default"]}:function getModuleExports(){return module};__webpack_require__.d(getter,"a",getter);return getter};__webpack_require__.o=function(object,property){return Object.prototype.hasOwnProperty.call(object,property)};__webpack_require__.p="";return __webpack_require__(__webpack_require__.s=0)}([function(module,exports,__webpack_require__){"use strict";Object.defineProperty(exports,"__esModule",{value:true});var _createClass=function(){function defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor)}}return function(Constructor,protoProps,staticProps){if(protoProps)defineProperties(Constructor.prototype,protoProps);if(staticProps)defineProperties(Constructor,staticProps);return Constructor}}();function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}var DEFAULT=exports.DEFAULT={DETECT_ONLY:false,CONCATENATE_MAX_CHUNKS:1,SPEECH_DETECTION_ALLOWED_DELAY:400,SPEECH_DETECTION_MIN_LENGTH:500,SPEECH_DETECTION_MAX_LENGTH:1e4,BUFFER_SIZE:16384,SPEECH_DETECTION_ANALYSIS_CHUNK_LENGTH:100,SAMPLERATE:16e3,SPEECH_DETECTION_THRESHOLD:15,SPEECH_DETECTION_COMPRESS_PAUSES:false};var STATUS=exports.STATUS={SPEECH_STARTED:1,SPEECH_STOPPED:2,SPEECH_ERROR:3,CAPTURE_STARTED:4,CAPTURE_STOPPED:5,SPEECH_MAX_LENGTH:6};if(!Float32Array.prototype.concat){Float32Array.prototype.concat=function concat(){var bytesPerIndex=4;for(var _len=arguments.length,args=Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}var buffers=Array.prototype.slice.call(args);buffers.unshift(this);buffers=buffers.map(function(item){if(item instanceof Float32Array){return item.buffer}else if(item instanceof ArrayBuffer){if(item.byteLength/bytesPerIndex%1!==0){throw new Error("One of the ArrayBuffers is not from a Float32Array")}return item}throw new Error("You can only concat Float32Array, or ArrayBuffers")});var concatenatedByteLength=buffers.map(function(a){return a.byteLength}).reduce(function(a,b){return a+b},0);var concatenatedArray=new Float32Array(concatenatedByteLength/bytesPerIndex);var offset=0;buffers.forEach(function(buffer){concatenatedArray.set(new Float32Array(buffer),offset);offset+=buffer.byteLength/bytesPerIndex});return concatenatedArray}}var SpeechEvents=exports.SpeechEvents=function(){function SpeechEvents(config){_classCallCheck(this,SpeechEvents);this.currentSpeechHistory=[];this.currentSpeechLength=0;this.noOfEventsStart=0;this.noOfEventsStop=0;this.noSpeechPeriod=0;this.noOfEventsContinue=0;this.streamSourceProcessor=null;this.audioInputEvents=0;this.audioDataQueue=[];this.audioContext=null;this.mediaStream=null;this.audioInputDataTotal=0;this.noOfAnalysisBuffersPerIteration=0;this.analysisBufferSize=0;this.analysisBufferLengthInS=0;this.speechAllowedDelayChunks=0;this.speechMinimumLengthChunks=0;this.speechMaximumLengthChunks=0;this.getNextBufferDuration=50;this.audioInputFrequency=0;this.bufferLengthInSeconds=0;this.getNextBufferIterations=0;this.speakingRightNow=false;this.noOfEventsMax=0;this.analyzeIterations=0;this.lastAudioLevel=-50;this.currentThreshold=0;this.totalNumOfSpeechChunks=0;this.silentIterations=0;this.ambientTotal=0;this.ambientAverageLevel=0;this.status=STATUS.CAPTURE_STOPPED;this.config={speechStatusCB:config.speechStatusCB||null,errorCB:config.errorCB||null,detectOnly:config.detectOnly||DEFAULT.DETECT_ONLY,concatenateMaxChunks:DEFAULT.CONCATENATE_MAX_CHUNKS,speechDetectionAllowedDelay:config.speechDetectionAllowedDelay||DEFAULT.SPEECH_DETECTION_ALLOWED_DELAY,speechDetectionMinimum:config.speechDetectionMinimum||DEFAULT.SPEECH_DETECTION_MIN_LENGTH,speechDetectionMaximum:config.speechDetectionMaximum||DEFAULT.SPEECH_DETECTION_MAX_LENGTH,bufferSize:config.bufferSize||DEFAULT.BUFFER_SIZE,analysisChunkLength:config.analysisChunkLength||DEFAULT.SPEECH_DETECTION_ANALYSIS_CHUNK_LENGTH,inputSampleRate:config.inputSampleRate||config.sampleRate||DEFAULT.SAMPLERATE,speechDetectionThreshold:config.speechDetectionThreshold||DEFAULT.SPEECH_DETECTION_THRESHOLD,compressPauses:config.compressPauses||DEFAULT.SPEECH_DETECTION_COMPRESS_PAUSES}}_createClass(SpeechEvents,[{key:"callSpeechStatusCB",value:function callSpeechStatusCB(){this.config.speechStatusCB(this.status)}},{key:"captureRunning",value:function captureRunning(){return this.status!==STATUS.CAPTURE_STOPPED}},{key:"captureStarted",value:function captureStarted(){this.status=STATUS.CAPTURE_STARTED;this.callSpeechStatusCB()}},{key:"captureStopped",value:function captureStopped(){this.status=STATUS.CAPTURE_STOPPED;this.callSpeechStatusCB()}},{key:"startSpeech",value:function startSpeech(){this.speakingRightNow=true;this.status=STATUS.SPEECH_STARTED;this.callSpeechStatusCB()}},{key:"stopSpeech",value:function stopSpeech(){this.speakingRightNow=false;this.status=STATUS.SPEECH_STOPPED;this.callSpeechStatusCB()}},{key:"appendSpeechToHistory",value:function appendSpeechToHistory(speechData){if(!this.config.detectOnly){this.currentSpeechHistory=this.currentSpeechHistory.concat(speechData)}this.currentSpeechLength+=1}},{key:"startSpeechEvent",value:function startSpeechEvent(speechData){this.noOfEventsStart+=1;this.startSpeech();this.resetSpeechDetection();this.continueSpeechEvent(speechData,false)}},{key:"stopSpeechEvent",value:function stopSpeechEvent(){this.noOfEventsStop+=1;this.stopSpeech();this.resetSpeechDetection()}},{key:"resetSpeechDetection",value:function resetSpeechDetection(){this.currentSpeechHistory=new Float32Array(0);this.currentSpeechLength=0;this.noSpeechPeriod=0}},{key:"resetAmbientLevels",value:function resetAmbientLevels(){this.ambientTotal=0;this.ambientAverageLevel=0;this.silentIterations=0}},{key:"resetAudioInputQueue",value:function resetAudioInputQueue(){this.audioDataQueue=[]}},{key:"resetAll",value:function resetAll(){this.speakingRightNow=false;this.resetAudioInputQueue();this.resetSpeechDetection();this.resetAmbientLevels();this.noOfEventsContinue=0;this.noOfEventsStart=0;this.noOfEventsStop=0;this.noOfEventsMax=0;this.noOfEventsMin=0;this.totalNumOfSpeechChunks=0;this.audioInputEvents=0;this.analyzeIterations=0;this.getNextBufferIterations=0;this.lastAudioLevel=-50;this.currentThreshold=0;this.audioInputDataTotal=0}},{key:"continueSpeechEvent",value:function continueSpeechEvent(speechData,silent){this.noOfEventsContinue+=1;this.appendSpeechToHistory(speechData);if(!silent){this.noSpeechPeriod=0}}},{key:"consumeFromAudioInputQueue",value:function consumeFromAudioInputQueue(){var audioInputData=new Float32Array(0);var chunk=null;if(this.audioDataQueue.length>0){for(var i=0;i<this.config.concatenateMaxChunks;i+=1){if(this.audioDataQueue.length===0){break}chunk=this.audioDataQueue.shift();audioInputData=audioInputData.concat(chunk);this.audioInputDataTotal+=chunk.length}}return audioInputData}},{key:"callErrorCB",value:function callErrorCB(error){var errorObj={};if(error){if(error.message){errorObj.message=error.message}else{errorObj.message=error}}else{errorObj.message="An unhandled error has occurred."}if(this.config.errorCB){this.config.errorCB(errorObj)}}},{key:"calculateAnalysisBuffers",value:function calculateAnalysisBuffers(bufferSize,bufferLengthInSeconds,analysisChunkLength){try{var inputBufferSizeInMs=bufferLengthInSeconds*1e3;this.noOfAnalysisBuffersPerIteration=Math.ceil(inputBufferSizeInMs/analysisChunkLength);this.analysisBufferSize=Math.ceil(bufferSize/this.noOfAnalysisBuffersPerIteration);this.analysisBufferLengthInS=bufferLengthInSeconds/this.noOfAnalysisBuffersPerIteration;this.speechAllowedDelayChunks=Math.round(this.config.speechDetectionAllowedDelay/analysisChunkLength);this.speechMinimumLengthChunks=Math.round(this.config.speechDetectionMinimum/analysisChunkLength);this.speechMaximumLengthChunks=Math.round(this.config.speechDetectionMaximum/analysisChunkLength);this.getNextBufferDuration=analysisChunkLength}catch(err){this.callErrorCB("calculateAnalysisBuffers exception: "+err)}}},{key:"calculateTimePeriods",value:function calculateTimePeriods(sampleRate,bufferSize){try{this.config.bufferSize=bufferSize;this.audioInputFrequency=sampleRate/bufferSize;this.bufferLengthInSeconds=1/this.audioInputFrequency;this.calculateAnalysisBuffers(bufferSize,this.bufferLengthInSeconds,this.config.analysisChunkLength)}catch(err){this.callErrorCB("calculateTimePeriods exception: "+err)}}},{key:"iteratedAndMonitorInputBuffer",value:function iteratedAndMonitorInputBuffer(audioInputBuffer){try{var len=audioInputBuffer.length;if(len!==this.config.bufferSize){this.calculateTimePeriods(this.config.inputSampleRate,len)}for(var i=0;i<this.noOfAnalysisBuffersPerIteration;i+=1){var startIdx=i*this.analysisBufferSize;var endIdx=startIdx+this.analysisBufferSize;if(endIdx>len){endIdx=len}var buf=audioInputBuffer.slice(startIdx,endIdx);if(!this.monitor(buf)){return}}}catch(err){this.callErrorCB("iteratedAndMonitorInputBuffer exception: "+err);this.callSpeechStatusCB(STATUS.SPEECH_ERROR)}}},{key:"getNextBuffer",value:function getNextBuffer(){var _this=this;try{this.getNextBufferIterations+=1;if(this.captureRunning()){var audioInputData=this.consumeFromAudioInputQueue();if(audioInputData&&audioInputData.length>0){this.iteratedAndMonitorInputBuffer(audioInputData)}setTimeout(function(){return _this.getNextBuffer()},this.getNextBufferDuration)}else if(this.speakingRightNow){this.stopSpeechEvent(this.currentSpeechHistory)}}catch(err){this.callErrorCB("getNextBuffer exception: "+err);this.callSpeechStatusCB(STATUS.SPEECH_ERROR);this.resetAll()}}},{key:"maximumLengthSpeechEvent",value:function maximumLengthSpeechEvent(speechData){this.noOfEventsMax+=1;this.stopSpeechEvent(speechData);this.callSpeechStatusCB(STATUS.SPEECH_MAX_LENGTH)}},{key:"getAudioLevels",value:function getAudioLevels(audioBuffer){try{var total=0;var length=audioBuffer.length;var absFreq=void 0;for(var i=0;i<length;i+=1){absFreq=Math.abs(audioBuffer[i]);total+=absFreq*absFreq}var rms=Math.sqrt(total/length);return this.constructor.getDecibelFromAmplitude(rms)}catch(err){this.callErrorCB("getAudioLevels exception: "+err);this.callSpeechStatusCB(STATUS.SPEECH_ERROR)}return null}},{key:"identifySpeech",value:function identifySpeech(audioBuffer){try{if(audioBuffer&&audioBuffer.length>0){this.analyzeIterations+=1;var currentLevel=this.getAudioLevels(audioBuffer);if(currentLevel!==-Infinity){this.lastAudioLevel=currentLevel;if(this.lastAudioLevel>this.currentThreshold){this.totalNumOfSpeechChunks+=1;return true}}}}catch(err){this.callErrorCB("identifySpeech exception: "+err);this.callSpeechStatusCB(STATUS.SPEECH_ERROR)}return false}},{key:"calculateAmbientAverageLevel",value:function calculateAmbientAverageLevel(audioLevel){this.silentIterations+=1;this.ambientTotal=this.ambientTotal+audioLevel;this.ambientAverageLevel=this.ambientTotal/this.silentIterations;this.currentThreshold=this.ambientAverageLevel+this.config.speechDetectionThreshold;this.currentThreshold=this.currentThreshold>0?0:this.currentThreshold}},{key:"monitor",value:function monitor(audioBuffer){try{if(this.currentSpeechLength+1>this.speechMaximumLengthChunks){this.maximumLengthSpeechEvent(this.currentSpeechHistory);return false}if(this.identifySpeech(audioBuffer)){if(!this.speakingRightNow){this.startSpeechEvent(audioBuffer)}else{this.continueSpeechEvent(audioBuffer,false)}}else{if(this.speakingRightNow){this.noSpeechPeriod+=1;if(this.noSpeechPeriod>this.speechAllowedDelayChunks){this.stopSpeechEvent(this.currentSpeechHistory)}else if(!this.config.compressPauses){this.continueSpeechEvent(audioBuffer,true)}}this.calculateAmbientAverageLevel(this.lastAudioLevel)}return true}catch(err){this.callErrorCB("monitor exception: "+err);this.callSpeechStatusCB(STATUS.SPEECH_ERROR);this.resetAll();return false}}},{key:"getMonitoringData",value:function getMonitoringData(){return{RealTime:{AmbientAverageLevel:parseFloat(this.ambientAverageLevel).toFixed(0),CurrentLevel:parseFloat(this.lastAudioLevel).toFixed(0),CurrentThreshold:parseFloat(this.currentThreshold).toFixed(0),CurrentSpeechChunks:this.currentSpeechLength,CurrentSpeechBufferSize:this.currentSpeechHistory.length,CurrentSpeechLength:this.noSpeechPeriod,TotalNumOfSpeechChunks:this.totalNumOfSpeechChunks,InputQueueLength:this.audioDataQueue.length,InputDataTotal:this.audioInputDataTotal},Events:{NumOfStart:this.noOfEventsStart,NumOfContinue:this.noOfEventsContinue,NumOfStop:this.noOfEventsStop,NumOfMin:this.noOfEventsMin,NumOfMax:this.noOfEventsMax},GetUserMedia:{SampleRate:this.config.inputSampleRate},AudioInput:{Events:this.audioInputEvents,SampleRate:this.config.inputSampleRate},Config:this.config,Internals:{AnalysisBufferSize:this.analysisBufferSize,AnalysisIterations:this.analyzeIterations,AnalysisBuffersPerIteration:this.noOfAnalysisBuffersPerIteration,AnalysisBufferLengthInS:parseFloat(this.analysisBufferLengthInS).toFixed(3),AudioInputFrequency:this.audioInputFrequency,InputBufferLenInS:parseFloat(this.bufferLengthInSeconds).toFixed(3),MinLengthChunks:this.speechMinimumLengthChunks,MaxLengthChunks:this.speechMaximumLengthChunks,AllowedDelayChunks:this.speechAllowedDelayChunks,GetNextBufferIterations:this.getNextBufferIterations,SampleRate:this.config.sampleRate}}}},{key:"connectStreamSourceProcessor",value:function connectStreamSourceProcessor(audioContext,realAudioInput){var _this2=this;this.calculateTimePeriods(this.config.inputSampleRate,this.config.bufferSize);this.resetAll();this.audioContext=audioContext;this.mediaStream=realAudioInput;this.streamSourceProcessor=this.audioContext.createScriptProcessor(this.config.bufferSize,1,1);this.streamSourceProcessor.onaudioprocess=function(audioProcessingEvent){try{_this2.audioInputEvents+=1;_this2.audioDataQueue.push(audioProcessingEvent.inputBuffer.getChannelData(0))}catch(err){_this2.captureStopped();_this2.callErrorCB("startMediaStreamSource.onaudioprocess exception: "+err)}};this.mediaStream.connect(this.streamSourceProcessor);this.streamSourceProcessor.connect(this.audioContext.destination);this.captureStarted();this.getNextBuffer()}}],[{key:"getDecibelFromAmplitude",value:function getDecibelFromAmplitude(amplitudeLevel){return 20*(Math.log(amplitudeLevel)/Math.log(10))}}]);return SpeechEvents}();exports.default=SpeechEvents}]));
(function(e,a){for(var i in a)e[i]=a[i]})(window,function(modules){var installedModules={};function __webpack_require__(moduleId){if(installedModules[moduleId]){return installedModules[moduleId].exports}var module=installedModules[moduleId]={i:moduleId,l:false,exports:{}};modules[moduleId].call(module.exports,module,module.exports,__webpack_require__);module.l=true;return module.exports}__webpack_require__.m=modules;__webpack_require__.c=installedModules;__webpack_require__.i=function(value){return value};__webpack_require__.d=function(exports,name,getter){if(!__webpack_require__.o(exports,name)){Object.defineProperty(exports,name,{configurable:false,enumerable:true,get:getter})}};__webpack_require__.n=function(module){var getter=module&&module.__esModule?function getDefault(){return module["default"]}:function getModuleExports(){return module};__webpack_require__.d(getter,"a",getter);return getter};__webpack_require__.o=function(object,property){return Object.prototype.hasOwnProperty.call(object,property)};__webpack_require__.p="";return __webpack_require__(__webpack_require__.s=0)}([function(module,exports,__webpack_require__){"use strict";Object.defineProperty(exports,"__esModule",{value:true});var _createClass=function(){function defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor)}}return function(Constructor,protoProps,staticProps){if(protoProps)defineProperties(Constructor.prototype,protoProps);if(staticProps)defineProperties(Constructor,staticProps);return Constructor}}();function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function")}}var DEFAULT=exports.DEFAULT={DETECT_ONLY:false,CONCATENATE_MAX_CHUNKS:1,SPEECH_DETECTION_ALLOWED_DELAY:400,SPEECH_DETECTION_MIN_LENGTH:500,SPEECH_DETECTION_MAX_LENGTH:1e4,BUFFER_SIZE:16384,SPEECH_DETECTION_ANALYSIS_CHUNK_LENGTH:100,SAMPLERATE:16e3,SPEECH_DETECTION_THRESHOLD:15,SPEECH_DETECTION_COMPRESS_PAUSES:false};var STATUS=exports.STATUS={SPEECH_STARTED:1,SPEECH_STOPPED:2,SPEECH_ERROR:3,CAPTURE_STARTED:4,CAPTURE_STOPPED:5,SPEECH_MAX_LENGTH:6};if(!Float32Array.prototype.concat){Float32Array.prototype.concat=function concat(){var bytesPerIndex=4;for(var _len=arguments.length,args=Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}var buffers=Array.prototype.slice.call(args);buffers.unshift(this);buffers=buffers.map(function(item){if(item instanceof Float32Array){return item.buffer}else if(item instanceof ArrayBuffer){if(item.byteLength/bytesPerIndex%1!==0){throw new Error("One of the ArrayBuffers is not from a Float32Array")}return item}throw new Error("You can only concat Float32Array, or ArrayBuffers")});var concatenatedByteLength=buffers.map(function(a){return a.byteLength}).reduce(function(a,b){return a+b},0);var concatenatedArray=new Float32Array(concatenatedByteLength/bytesPerIndex);var offset=0;buffers.forEach(function(buffer){concatenatedArray.set(new Float32Array(buffer),offset);offset+=buffer.byteLength/bytesPerIndex});return concatenatedArray}}var SpeechEvents=exports.SpeechEvents=function(){function SpeechEvents(config){_classCallCheck(this,SpeechEvents);this.currentSpeechHistory=[];this.currentSpeechLength=0;this.noOfEventsStart=0;this.noOfEventsStop=0;this.noSpeechPeriod=0;this.noOfEventsContinue=0;this.streamSourceProcessor=null;this.audioInputEvents=0;this.audioDataQueue=[];this.audioContext=null;this.mediaStream=null;this.audioInputDataTotal=0;this.noOfAnalysisBuffersPerIteration=0;this.analysisBufferSize=0;this.analysisBufferLengthInS=0;this.speechAllowedDelayChunks=0;this.speechMinimumLengthChunks=0;this.speechMaximumLengthChunks=0;this.getNextBufferDuration=50;this.audioInputFrequency=0;this.bufferLengthInSeconds=0;this.getNextBufferIterations=0;this.speakingRightNow=false;this.noOfEventsMax=0;this.analyzeIterations=0;this.lastAudioLevel=-50;this.currentThreshold=0;this.totalNumOfSpeechChunks=0;this.silentIterations=0;this.ambientTotal=0;this.ambientAverageLevel=0;this.status=STATUS.CAPTURE_STOPPED;this.config={speechStatusCB:config.speechStatusCB||null,errorCB:config.errorCB||null,detectOnly:config.detectOnly||DEFAULT.DETECT_ONLY,concatenateMaxChunks:DEFAULT.CONCATENATE_MAX_CHUNKS,speechDetectionAllowedDelay:config.speechDetectionAllowedDelay||DEFAULT.SPEECH_DETECTION_ALLOWED_DELAY,speechDetectionMinimum:config.speechDetectionMinimum||DEFAULT.SPEECH_DETECTION_MIN_LENGTH,speechDetectionMaximum:config.speechDetectionMaximum||DEFAULT.SPEECH_DETECTION_MAX_LENGTH,bufferSize:config.bufferSize||DEFAULT.BUFFER_SIZE,analysisChunkLength:config.analysisChunkLength||DEFAULT.SPEECH_DETECTION_ANALYSIS_CHUNK_LENGTH,inputSampleRate:config.inputSampleRate||config.sampleRate||DEFAULT.SAMPLERATE,speechDetectionThreshold:config.speechDetectionThreshold||DEFAULT.SPEECH_DETECTION_THRESHOLD,compressPauses:config.compressPauses||DEFAULT.SPEECH_DETECTION_COMPRESS_PAUSES}}_createClass(SpeechEvents,[{key:"callSpeechStatusCB",value:function callSpeechStatusCB(){this.config.speechStatusCB(this.status)}},{key:"captureRunning",value:function captureRunning(){return this.status!==STATUS.CAPTURE_STOPPED}},{key:"captureStarted",value:function captureStarted(){this.status=STATUS.CAPTURE_STARTED;this.callSpeechStatusCB()}},{key:"captureStopped",value:function captureStopped(){this.status=STATUS.CAPTURE_STOPPED;this.callSpeechStatusCB()}},{key:"startSpeech",value:function startSpeech(){this.speakingRightNow=true;this.status=STATUS.SPEECH_STARTED;this.callSpeechStatusCB()}},{key:"stopSpeech",value:function stopSpeech(){this.speakingRightNow=false;this.status=STATUS.SPEECH_STOPPED;this.callSpeechStatusCB()}},{key:"appendSpeechToHistory",value:function appendSpeechToHistory(speechData){if(!this.config.detectOnly){this.currentSpeechHistory=this.currentSpeechHistory.concat(speechData)}this.currentSpeechLength+=1}},{key:"startSpeechEvent",value:function startSpeechEvent(speechData){this.noOfEventsStart+=1;this.startSpeech();this.resetSpeechDetection();this.continueSpeechEvent(speechData,false)}},{key:"stopSpeechEvent",value:function stopSpeechEvent(){this.noOfEventsStop+=1;this.stopSpeech();this.resetSpeechDetection()}},{key:"resetSpeechDetection",value:function resetSpeechDetection(){this.currentSpeechHistory=new Float32Array(0);this.currentSpeechLength=0;this.noSpeechPeriod=0}},{key:"resetAmbientLevels",value:function resetAmbientLevels(){this.ambientTotal=0;this.ambientAverageLevel=0;this.silentIterations=0}},{key:"resetAudioInputQueue",value:function resetAudioInputQueue(){this.audioDataQueue=[]}},{key:"resetAll",value:function resetAll(){this.speakingRightNow=false;this.resetAudioInputQueue();this.resetSpeechDetection();this.resetAmbientLevels();this.noOfEventsContinue=0;this.noOfEventsStart=0;this.noOfEventsStop=0;this.noOfEventsMax=0;this.noOfEventsMin=0;this.totalNumOfSpeechChunks=0;this.audioInputEvents=0;this.analyzeIterations=0;this.getNextBufferIterations=0;this.lastAudioLevel=-50;this.currentThreshold=0;this.audioInputDataTotal=0}},{key:"continueSpeechEvent",value:function continueSpeechEvent(speechData,silent){this.noOfEventsContinue+=1;this.appendSpeechToHistory(speechData);if(!silent){this.noSpeechPeriod=0}}},{key:"consumeFromAudioInputQueue",value:function consumeFromAudioInputQueue(){var audioInputData=new Float32Array(0);var chunk=null;if(this.audioDataQueue.length>0){for(var i=0;i<this.config.concatenateMaxChunks;i+=1){if(this.audioDataQueue.length===0){break}chunk=this.audioDataQueue.shift();audioInputData=audioInputData.concat(chunk);this.audioInputDataTotal+=chunk.length}}return audioInputData}},{key:"callErrorCB",value:function callErrorCB(error){var errorObj={};if(error){if(error.message){errorObj.message=error.message}else{errorObj.message=error}}else{errorObj.message="An unhandled error has occurred."}if(this.config.errorCB){this.config.errorCB(errorObj)}}},{key:"calculateAnalysisBuffers",value:function calculateAnalysisBuffers(bufferSize,bufferLengthInSeconds,analysisChunkLength){try{var inputBufferSizeInMs=bufferLengthInSeconds*1e3;this.noOfAnalysisBuffersPerIteration=Math.ceil(inputBufferSizeInMs/analysisChunkLength);this.analysisBufferSize=Math.ceil(bufferSize/this.noOfAnalysisBuffersPerIteration);this.analysisBufferLengthInS=bufferLengthInSeconds/this.noOfAnalysisBuffersPerIteration;this.speechAllowedDelayChunks=Math.round(this.config.speechDetectionAllowedDelay/analysisChunkLength);this.speechMinimumLengthChunks=Math.round(this.config.speechDetectionMinimum/analysisChunkLength);this.speechMaximumLengthChunks=Math.round(this.config.speechDetectionMaximum/analysisChunkLength);this.getNextBufferDuration=analysisChunkLength}catch(err){this.callErrorCB("calculateAnalysisBuffers exception: "+err)}}},{key:"calculateTimePeriods",value:function calculateTimePeriods(sampleRate,bufferSize){try{this.config.bufferSize=bufferSize;this.audioInputFrequency=sampleRate/bufferSize;this.bufferLengthInSeconds=1/this.audioInputFrequency;this.calculateAnalysisBuffers(bufferSize,this.bufferLengthInSeconds,this.config.analysisChunkLength)}catch(err){this.callErrorCB("calculateTimePeriods exception: "+err)}}},{key:"iteratedAndMonitorInputBuffer",value:function iteratedAndMonitorInputBuffer(audioInputBuffer){try{var len=audioInputBuffer.length;if(len!==this.config.bufferSize){this.calculateTimePeriods(this.config.inputSampleRate,len)}for(var i=0;i<this.noOfAnalysisBuffersPerIteration;i+=1){var startIdx=i*this.analysisBufferSize;var endIdx=startIdx+this.analysisBufferSize;if(endIdx>len){endIdx=len}var buf=audioInputBuffer.slice(startIdx,endIdx);if(!this.monitor(buf)){return}}}catch(err){this.callErrorCB("iteratedAndMonitorInputBuffer exception: "+err);this.callSpeechStatusCB(STATUS.SPEECH_ERROR)}}},{key:"getNextBuffer",value:function getNextBuffer(){var _this=this;try{this.getNextBufferIterations+=1;if(this.captureRunning()){var audioInputData=this.consumeFromAudioInputQueue();if(audioInputData&&audioInputData.length>0){this.iteratedAndMonitorInputBuffer(audioInputData)}setTimeout(function(){return _this.getNextBuffer()},this.getNextBufferDuration)}else if(this.speakingRightNow){this.stopSpeechEvent(this.currentSpeechHistory)}}catch(err){this.callErrorCB("getNextBuffer exception: "+err);this.callSpeechStatusCB(STATUS.SPEECH_ERROR);this.resetAll()}}},{key:"maximumLengthSpeechEvent",value:function maximumLengthSpeechEvent(speechData){this.noOfEventsMax+=1;this.stopSpeechEvent(speechData);this.callSpeechStatusCB(STATUS.SPEECH_MAX_LENGTH)}},{key:"getAudioLevels",value:function getAudioLevels(audioBuffer){try{var total=0;var length=audioBuffer.length;var absFreq=void 0;for(var i=0;i<length;i+=1){absFreq=Math.abs(audioBuffer[i]);total+=absFreq*absFreq}var rms=Math.sqrt(total/length);return this.constructor.getDecibelFromAmplitude(rms)}catch(err){this.callErrorCB("getAudioLevels exception: "+err);this.callSpeechStatusCB(STATUS.SPEECH_ERROR)}return null}},{key:"identifySpeech",value:function identifySpeech(audioBuffer){try{if(audioBuffer&&audioBuffer.length>0){this.analyzeIterations+=1;var currentLevel=this.getAudioLevels(audioBuffer);if(currentLevel!==-Infinity){this.lastAudioLevel=currentLevel;if(this.lastAudioLevel>this.currentThreshold){this.totalNumOfSpeechChunks+=1;return true}}}}catch(err){this.callErrorCB("identifySpeech exception: "+err);this.callSpeechStatusCB(STATUS.SPEECH_ERROR)}return false}},{key:"calculateAmbientAverageLevel",value:function calculateAmbientAverageLevel(audioLevel){this.silentIterations+=1;this.ambientTotal=this.ambientTotal+audioLevel;this.ambientAverageLevel=this.ambientTotal/this.silentIterations;this.currentThreshold=this.ambientAverageLevel+this.config.speechDetectionThreshold;this.currentThreshold=this.currentThreshold>0?0:this.currentThreshold}},{key:"monitor",value:function monitor(audioBuffer){try{if(this.currentSpeechLength+1>this.speechMaximumLengthChunks){this.maximumLengthSpeechEvent(this.currentSpeechHistory);return false}if(this.identifySpeech(audioBuffer)){if(!this.speakingRightNow){this.startSpeechEvent(audioBuffer)}else{this.continueSpeechEvent(audioBuffer,false)}}else{if(this.speakingRightNow){this.noSpeechPeriod+=1;if(this.noSpeechPeriod>this.speechAllowedDelayChunks){this.stopSpeechEvent(this.currentSpeechHistory)}else if(!this.config.compressPauses){this.continueSpeechEvent(audioBuffer,true)}}this.calculateAmbientAverageLevel(this.lastAudioLevel)}return true}catch(err){this.callErrorCB("monitor exception: "+err);this.callSpeechStatusCB(STATUS.SPEECH_ERROR);this.resetAll();return false}}},{key:"getMonitoringData",value:function getMonitoringData(){return{RealTime:{AmbientAverageLevel:parseFloat(this.ambientAverageLevel).toFixed(0),CurrentLevel:parseFloat(this.lastAudioLevel).toFixed(0),CurrentThreshold:parseFloat(this.currentThreshold).toFixed(0),CurrentSpeechChunks:this.currentSpeechLength,CurrentSpeechBufferSize:this.currentSpeechHistory.length,CurrentSpeechLength:this.noSpeechPeriod,TotalNumOfSpeechChunks:this.totalNumOfSpeechChunks,InputQueueLength:this.audioDataQueue.length,InputDataTotal:this.audioInputDataTotal},Events:{NumOfStart:this.noOfEventsStart,NumOfContinue:this.noOfEventsContinue,NumOfStop:this.noOfEventsStop,NumOfMin:this.noOfEventsMin,NumOfMax:this.noOfEventsMax},GetUserMedia:{SampleRate:this.config.inputSampleRate},AudioInput:{Events:this.audioInputEvents,SampleRate:this.config.inputSampleRate},Config:this.config,Internals:{AnalysisBufferSize:this.analysisBufferSize,AnalysisIterations:this.analyzeIterations,AnalysisBuffersPerIteration:this.noOfAnalysisBuffersPerIteration,AnalysisBufferLengthInS:parseFloat(this.analysisBufferLengthInS).toFixed(3),AudioInputFrequency:this.audioInputFrequency,InputBufferLenInS:parseFloat(this.bufferLengthInSeconds).toFixed(3),MinLengthChunks:this.speechMinimumLengthChunks,MaxLengthChunks:this.speechMaximumLengthChunks,AllowedDelayChunks:this.speechAllowedDelayChunks,GetNextBufferIterations:this.getNextBufferIterations,SampleRate:this.config.sampleRate}}}},{key:"startCapture",value:function startCapture(){this.mediaStream.connect(this.streamSourceProcessor);this.streamSourceProcessor.connect(this.audioContext.destination);this.resetAll();this.captureStarted();this.getNextBuffer()}},{key:"stopCapture",value:function stopCapture(){this.mediaStream.connect(this.streamSourceProcessor);this.streamSourceProcessor.connect(this.audioContext.destination);this.captureStopped()}},{key:"connectStreamSourceProcessor",value:function connectStreamSourceProcessor(audioContext,realAudioInput){var _this2=this;this.calculateTimePeriods(this.config.inputSampleRate,this.config.bufferSize);this.audioContext=audioContext;this.mediaStream=realAudioInput;this.streamSourceProcessor=this.audioContext.createScriptProcessor(this.config.bufferSize,1,1);this.streamSourceProcessor.onaudioprocess=function(audioProcessingEvent){try{_this2.audioInputEvents+=1;_this2.audioDataQueue.push(audioProcessingEvent.inputBuffer.getChannelData(0))}catch(err){_this2.captureStopped();_this2.callErrorCB("startMediaStreamSource.onaudioprocess exception: "+err)}}}}],[{key:"getDecibelFromAmplitude",value:function getDecibelFromAmplitude(amplitudeLevel){return 20*(Math.log(amplitudeLevel)/Math.log(10))}}]);return SpeechEvents}();exports.default=SpeechEvents}]));

@@ -605,2 +605,21 @@ (function(e, a) { for(var i in a) e[i] = a[i]; }(window, /******/ (function(modules) { // webpackBootstrap

}, {
key: 'startCapture',
value: function startCapture() {
this.mediaStream.connect(this.streamSourceProcessor);
this.streamSourceProcessor.connect(this.audioContext.destination);
this.resetAll();
this.captureStarted();
this.getNextBuffer();
}
}, {
key: 'stopCapture',
value: function stopCapture() {
this.mediaStream.connect(this.streamSourceProcessor);
this.streamSourceProcessor.connect(this.audioContext.destination);
this.captureStopped();
}
}, {
key: 'connectStreamSourceProcessor',

@@ -611,3 +630,2 @@ value: function connectStreamSourceProcessor(audioContext, realAudioInput) {

this.calculateTimePeriods(this.config.inputSampleRate, this.config.bufferSize);
this.resetAll();

@@ -628,8 +646,2 @@ this.audioContext = audioContext;

};
this.mediaStream.connect(this.streamSourceProcessor);
this.streamSourceProcessor.connect(this.audioContext.destination);
this.captureStarted();
this.getNextBuffer();
}

@@ -636,0 +648,0 @@ }], [{

{
"name": "@accentdotai/speech-events",
"version": "0.1.1",
"version": "0.2.0",
"description": "A plugin for detecting speech events in audioContext instances",

@@ -5,0 +5,0 @@ "main": "./src/speech-events.js",

@@ -503,5 +503,21 @@ export const DEFAULT = {

startCapture() {
this.mediaStream.connect(this.streamSourceProcessor);
this.streamSourceProcessor.connect(this.audioContext.destination);
this.resetAll();
this.captureStarted();
this.getNextBuffer();
}
stopCapture() {
this.mediaStream.connect(this.streamSourceProcessor);
this.streamSourceProcessor.connect(this.audioContext.destination);
this.captureStopped();
}
connectStreamSourceProcessor(audioContext, realAudioInput) {
this.calculateTimePeriods(this.config.inputSampleRate, this.config.bufferSize);
this.resetAll();

@@ -526,8 +542,2 @@ this.audioContext = audioContext;

};
this.mediaStream.connect(this.streamSourceProcessor);
this.streamSourceProcessor.connect(this.audioContext.destination);
this.captureStarted();
this.getNextBuffer();
}

@@ -534,0 +544,0 @@ }

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc