Я не уверен, что это ошибка. Я стараюсь сделать ровный щелчок в начале и начать слушать любое слово, чтобы запустить программу. Но прямо сейчас первый звук воспроизводится автоматически каждый раз, когда я обновляю страницу через 3 секунды. Я сделал что-то не так? Любая помощь будет полезна. Заранее спасибо.

<script>                          
    if (annyang) 
    {
        function playFirstAudio()
        {
            audio.src = dir + playList[audioIndex] + extention;
            audio.load();
            setTimeout(function(){audio.play();}, 3000);
        }

        var playList = ["1_hello", "2_how_old", "3_what_did_you_make"];
        var dir = "sound/";
        var extention = ".wav";

        var audioIndex = 0;
        audio = new Audio();

        //annyang.addCallback('start', playFirstAudio);

        audio.onended = playFirstAudio();

        annyang.debug(true);
    };
</script>

<div class="container">
    <button id="runProgram" onclick='annyang.start();' class="runProgrambutton">Start</button>
</div>
1
Johnny 11 Июл 2017 в 08:39

1 ответ

Лучший ответ

Вы вызываете playFirstAudio(), когда пытаетесь установить обратный вызов audio.ended. Примечание. Аудио. закончено, а не аудио.

audio.onended = playFirstAudio(); //<-- this is calling playFirstAudio();

Вы назначаете функцию обратного вызова, указывая имя метода без (), например:

 audio.onended = playFirstAudio;

В противном случае оберните его анонимной функцией следующим образом:

 audio.onended = function() { playFirstAudio(); };

При нажатии кнопки запускается распознавание голоса.

Но вам также необходимо зарегистрировать обратный вызов, чтобы он запускался, когда механизм распознавания голоса слышит звук:

<script>  
    var audio = new Audio();                        
    if (annyang) 
    {
        annyang.addCallback('start', function() {console.log('started listening');});
        annyang.addCallback('soundstart', function {onSoundDetected();});            

        function onSoundDetected() {
            console.log('sound was detected');
            playNextAudio();
        }
        var playList = ["sound/1_hello.wav", "sound/2_how_old.wav", "sound/3_what_did_you_make.wav"];
        var audioIndex = 0;

        function playNextAudio()
        {
            audio.src = playList[audioIndex++];
            audio.load();
            audioIndex= audioIndex % playList.Length;// start at zero when we reach the end.

        }
        audio.ended = function() {playNextAudio()};
        audio.oncanplay = function() {audio.play();}
        annyang.debug(true);
    };
</script>

<div class="container">
    <button id="runProgram" onclick='annyang.start();' class="runProgrambutton">Start</button>
</div>
0
Alexander Higgins 12 Июл 2017 в 01:36
Спасибо за ответ. Но если я сделаю audio.onended = playFirstAudio; он пытается прослушать, но не воспроизводит аудиофайл. И если я выполняю анонимную функцию, он также будет пытаться слушать, но не воспроизводит аудиофайл.
 – 
Johnny
11 Июл 2017 в 23:59
Основанный на W3school, он показывает пример, В JavaScript: object.onended = function () {myScript};
 – 
Johnny
12 Июл 2017 в 00:09
Существуют различные семантики, но это ничего не дает: var myScript = function() {console.log('hello world');}; var d=[]; d.onended = function(){myScript}; d.onended(); Однако, если вы используете эту var myScript = function() {console.log('hello world');}; var d=[]; d.onended = function(){myScript()}; d.onended();, она выводит hello world. Вы можете провести небольшое исследование, чтобы понять разницу.
 – 
Alexander Higgins
12 Июл 2017 в 00:26
Ты прав. Я только что это проверил. Итак, в чем проблема моего кода, даже если я использую audio.onended = function () {playFirstAudio (); }; , он начал слушать звук, но после того, как я говорю один, он все еще не воспроизводит звук?
 – 
Johnny
12 Июл 2017 в 00:35
Вы не подключаетесь к событиям API, чтобы запустить воспроизведение звука. Также onended - неправильная функция. Посмотреть обновления
 – 
Alexander Higgins
12 Июл 2017 в 01:00