in lex-web-ui/src/store/actions.js [302:352]
playAudioInterruptHandler(context) {
const { isSpeaking } = context.state.botAudio;
const {
enablePlaybackInterrupt,
playbackInterruptMinDuration,
playbackInterruptVolumeThreshold,
playbackInterruptLevelThreshold,
playbackInterruptNoiseThreshold,
} = context.state.config.lex;
const intervalTimeInMs = 200;
if (!enablePlaybackInterrupt &&
!isSpeaking &&
context.state.lex.isInterrupting &&
audio.duration < playbackInterruptMinDuration
) {
return;
}
const intervalId = setInterval(() => {
const { duration } = audio;
const end = audio.played.end(0);
const { canInterrupt } = context.state.botAudio;
if (!canInterrupt &&
// allow to be interrupt free in the beginning
end > playbackInterruptMinDuration &&
// don't interrupt towards the end
(duration - end) > 0.5 &&
// only interrupt if the volume seems to be low noise
recorder.volume.max < playbackInterruptNoiseThreshold
) {
context.commit('setCanInterruptBotPlayback', true);
} else if (canInterrupt && (duration - end) < 0.5) {
context.commit('setCanInterruptBotPlayback', false);
}
if (canInterrupt &&
recorder.volume.max > playbackInterruptVolumeThreshold &&
recorder.volume.slow > playbackInterruptLevelThreshold
) {
clearInterval(intervalId);
context.commit('setIsBotPlaybackInterrupting', true);
setTimeout(() => {
audio.pause();
}, 500);
}
}, intervalTimeInMs);
context.commit('setBotPlaybackInterruptIntervalId', intervalId);
},