dont' stop AMD on StoppedSpeaking, wait for tone

This commit is contained in:
Sam Machin
2026-04-23 12:30:28 +01:00
parent 570641fe07
commit d817d9fae9
+28 -7
View File
@@ -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};