diff --git a/lib/utils/amd-utils.js b/lib/utils/amd-utils.js index 02083ad0..8eeedd63 100644 --- a/lib/utils/amd-utils.js +++ b/lib/utils/amd-utils.js @@ -247,6 +247,11 @@ module.exports = (logger) => { const frequency = Math.floor(fsEvent.getHeader('Frequency')); const variance = Math.floor(fsEvent.getHeader('Frequency-variance')); task.emit('amd', {type: AmdEvents.ToneDetected, frequency, variance}); + if (ep.amd?.awaitingTone) { + /* partial stop already tore down STT; finish cleanup now that the beep landed */ + stopAmd(ep, task); + return; + } if (ep.amd) { ep.amd.stopToneTimer(); ep.amd.beepDetected = true; @@ -387,7 +392,9 @@ module.exports = (logger) => { .on(AmdEvents.MachineStoppedSpeaking, () => { task.emit('amd', {type: AmdEvents.MachineStoppedSpeaking}); try { - stopAmd(ep, task); + /* if the beep already landed during the greeting, nothing left to wait for */ + const keepAvmd = !ep.amd?.beepDetected; + stopAmd(ep, task, {keepAvmd}); } catch (err) { logger.info({err}, 'Error stopping transcription'); } @@ -401,11 +408,19 @@ module.exports = (logger) => { ep.execute('avmd_start').catch((err) => this.logger.info(err, 'Error starting avmd')); }; - const stopAmd = (ep, task) => { + const stopAmd = (ep, task, {keepAvmd = false} = {}) => { let vendor; if (ep.amd) { vendor = ep.amd.vendor; - ep.amd.stopAllTimers(); + if (keepAvmd) { + /* tear down STT but leave avmd + Beep listener + toneTimer running */ + ep.amd.stopDecisionTimer(); + ep.amd.stopNoSpeechTimer(); + ep.amd.stopGreetingCompletionTimer(); + ep.amd.awaitingTone = true; + } else { + ep.amd.stopAllTimers(); + } try { ep.removeListener(GoogleTranscriptionEvents.Transcription, ep.amd.transcriptionHandler); ep.removeListener(GoogleTranscriptionEvents.EndOfUtterance, ep.amd.EndOfUtteranceHandler); @@ -421,7 +436,9 @@ module.exports = (logger) => { } catch (error) { logger.error('Unable to Remove AMD Listener', error); } - ep.amd = null; + if (!keepAvmd) { + ep.amd = null; + } } if (ep.connected) { @@ -431,10 +448,14 @@ module.exports = (logger) => { gracefulShutdown: false }) .catch((err) => logger.info(err, 'stopAmd: Error stopping transcription')); - task.emit('amd', {type: AmdEvents.Stopped}); - ep.execute('avmd_stop').catch((err) => this.logger.info(err, 'Error stopping avmd')); + if (!keepAvmd) { + task.emit('amd', {type: AmdEvents.Stopped}); + ep.execute('avmd_stop').catch((err) => this.logger.info(err, 'Error stopping avmd')); + } + } + if (!keepAvmd) { + ep.removeCustomEventListener(AvmdEvents.Beep); } - ep.removeCustomEventListener(AvmdEvents.Beep); }; return {startAmd, stopAmd};