Как я могу вызвать функцию распознавания речи несколько раз в одной функции? - PullRequest
0 голосов
/ 14 октября 2018

Я относительно новичок в JavaScript и в настоящее время работаю над проектом, который новичку, вероятно, не стоит начинать.Я некоторое время программировал на python и решил попробовать.Я пытаюсь сделать личного помощника, или, как мне нравится называть, Джарвиса (от IRON MAN).В настоящее время он может прослушивать команды и выполнять их очень хорошо, однако я пытаюсь создать команду send email, которая требует многократного ввода от пользователя в одной функции.Эта функция отправки электронной почты технически находится в parseCommand(), где я передаю идентификатор, известный как i.Со временем я добавлю больше команд к parseCommand(), и идентификатор поможет узнать, какую команду выполнить.Когда я говорю, «Джарвис отправляет электронное письмо», parseCommand("email") вызывается.Это обещание, потому что, как только это будет сделано, я хочу снова вызвать annyang (слушатель команд).

Когда запускается «jarvis send a email» ->

"jarvis send an email" : async function(){
  annyang.abort(); // stop listening
  await parseCommand("email").then(annyang.start()); // Start listening for another command when done
}

parseCommand:

parseCommand(i){
    return new Promise(async (resolve) => {
        recognition.stop();



        if(i == "email"){
            var SUBJECT;
            var TEXT;
            var TO;

            console.log("Running: send an email")
            await this.promptListen("Who shall I send it to?").then( async (email) =>{
                TO = email;
                console.log("got TO", TO)

                await this.promptListen("What shall the subject be?").then( async (subject) => {
                    SUBJECT = subject;
                    console.log("got SUBJECT", SUBJECT)

                    await this.promptListen("What would you like to say?").then((text) => {
                        TEXT = text;
                        console.log("got TEXT", TEXT)
                        resolve()
                        })
                    })
                });
            }
        })
    }

Команда promptListen:

promptListen(prompt){
        return new Promise((resolve, reject) => {
            socket.emit("speak", prompt);
            setTimeout(1000);

            promptRecognition.stop(); // NOTE #1

            promptRecognition.start();

            promptRecognition.onresult = function(event){
                console.log(event)
                promptRecognition.stop();
                resolve(event.results[0][0].transcript);
            }
            promptRecognition.onnomatch = function() {
                promptRecognition.stop();
                reject(promptListen(prompt));
            }
        })

    }

Проблема с текущей функциональностью заключается в том, что она вообще не работает.Меня спрашивают: «Кому я отправлю это?»и Джарвис слушает.Я получаю вывод консоли TO, однако, после этого я получаю ошибку:

responses.js:63 Uncaught (in promise) DOMException: Failed to execute 'start' on 'SpeechRecognition': recognition has already started.
    at Promise (http://localhost:3000/scripts/responses.js:63:31)
    at new Promise (<anonymous>)
    at Respond.promptListen (http://localhost:3000/scripts/responses.js:57:16)
    at promptListen.then (http://localhost:3000/scripts/responses.js:41:28)

Ошибка предполагает, что я уже использую SpeechRecognition, однако я останавливаю его в начале promptListen() каждый раз, когда простов случае.Я не знаю, что происходит вообще.Желаемым результатом будет то, что каждый вызов promptListen() позволит мне подсказать пользователю, прослушать ответ, сохранить ответ в переменной: для каждой переменной, необходимой для отправки электронного письма (получатель, тема и тело),Я не знаком с JavaScript, обещаниями, асинхронностью или ожиданием.Я перепробовал все возможные варианты, а также просмотрел документацию безрезультатно.Если я не использую обещания, функция promptListen() вызывается одновременно для приглашений получателя, субъекта и тела.Вот почему я решил попытаться решить проблему с обещаниями.Любая помощь приветствуется - спасибо!

1 Ответ

0 голосов
/ 14 октября 2018

Мой код работает теоретически.Проблема, или, по крайней мере, я так думаю, в том, что когда я звоню then promptRecoginition.stop(), нужно время, чтобы остановиться.Я немедленно снова вызываю .start() для следующего приглашения, как только я решаю недавний promptListen(), поэтому promptRecognition не успевает .stop().Решение, которое я нашел для работы:

setTimeout( async () => {
    await this.promptListen("What shall the subject be").then( (subject) => {
        SUBJECT = subject;
        // Add another setTimeout here
    }
}, 1000);

Используя функцию setTimeout, я даю promptRecognition время .stop() и продолжаю без ошибок.

...