如何使annyang在3秒或更长时间内检测到没有声音,然后开始下一个音频?

到目前为止,我得到了一个人的帮助。 但我的目标是在第一个音频文件之后,程序仍会听到用户说的话,直到用户完成说话。 然后,如果程序在3秒(或更长时间)内没有检测到任何内容,它将播放下一个音频。 该程序将一遍又一遍地执行此操作,直到播放完所有音频文件。

但是,还有一个案例。 如果用户是2岁的孩子,这意味着孩子可能需要在两句话之间花费2秒或更长时间。 在这种情况下,annyang可能会认为用户已完成句子并播放下一个音频。 这样程序会中断用户语音。 我该怎么处理?

那个给我想法使用setInverval并创建一些日期对象然后减去日期对象以获得大于3秒的时间,然后播放下一个音频的人。 但它不起作用。 我的代码逻辑是错误还是有更好的方法?

任何帮助,我会很感激。 先感谢您。

 audio = new Audio(); if (annyang) { annyang.addCallback('start', function() {console.log('started listening!');}); annyang.addCallback('soundstart', function(){onSoundDetected();}); function monitorSound() { if(monitorId && monitorId > 0) return; var monitorId = window.setInterval(function(){trackSound() }, 1000); } var lastSound= new Date(); function trackSound() { var now = new Date(); if ((now - lastSound) > 3000) { playNextAudio(); return; } } function stopListening() { var monitorId = 0; window.clearInterval(monitorId); annyang.removeCallback('soundstart', onSoundHeard); annyang.addCallback('result', function() {playNextAudio(); }); } function onSoundHeard() { lastSound = new Date(); console.log(lastSound); } function playNextAudio() { if(audioIndex === playList.length - 1) { console.log("Played all audios"); return; // we have played all audio } else { annyang.addCallback('result', function() { audio.src = dir + playList[audioIndex++] + extention; audio.load(); //audio.ended = audio.play(); //audio.ended = setTimeout(function(){audio.play();}, 1500); setTimeout(function(){audio.play();}, 1000); }); } } function playFirstAudio() { audio.src = dir + playList[audioIndex] + extention; audio.load(); audio.ended = setTimeout(function(){audio.play();}, 1000); console.log('First audio is playing'); } function onSoundDetected() { console.log('sound was detected'); playFirstAudio(); monitorSound(); } // Start from here var playList = ["1_hello", "2_how_old", "3_what_did_you_make"]; var dir = "sound/"; var extention = ".wav"; var audioIndex = 0; annyang.debug(true); };  

您的代码中存在逻辑错误。 停止和启动计时器时,需要引用全局变量。

此代码不会停止您的计时器:

 function stopListening() { var monitorId = 0; window.clearInterval(monitorId); } 

您的代码也只会启动播放循环。 它永远不会启动监听计时器。

你的逻辑也会播放第一首歌两次。

为了演示控制流程,我annyangaudioannyang对象。 音频模拟模拟播放3个10秒的音频文件。 当窗口加载时,将播放第一个音频模拟。 之后,annyang和听力计时器将启动。

为了模拟annyang的声音检测,有一个“模拟声音”按钮。 如果单击它将延长声音检测另外3秒。 一旦3秒钟,annyang将暂停并播放下一个音频。

     Annyang Mock       
Annyang State:
Audio State:
Playlist: