Цикл синтеза речи Visual Studio - PullRequest
0 голосов
/ 13 октября 2018

Я знаю, что сейчас пытаюсь сделать что-то выше моего уровня, но, тем не менее, я стараюсь изо всех сил.

До сих пор я был сосредоточен на c++ -> Code::Blocks,на уровне старшей школы, но теперь я пытался возиться в Visual Studio, пока не присоединился к проекту.

У меня есть некоторые проблемы с циклом (программа основана на системной речи, системном синтезе речи, распознавателе речи и запуске процесса).

У меня есть 2 случая:

1) При вводе голосовой команды "hi" -> она отвечает "hi".2) Ввод "hello" -> он отвечает "открывая Google" и открывает эту конкретную веб-страницу.

Хорошо, если он будет работать так, как он должен.Если я введу "привет", он ответит "привет" -> ["открытие Google" + открытие страницы] -> в цикле

Если я введу "hello", он идет прямо в цикл["открытие Google" + открытие страницы] Я попробовал несколько точек останова, чтобы увидеть, что я там делаю, но я безнадежен.

У вас есть код здесь:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Speech.Synthesis;
using System.Speech.Recognition;
using System.Diagnostics;

namespace Command
{
    public partial class Speech : Form
    {
        SpeechSynthesizer s = new SpeechSynthesizer();
        public Speech()
        {
            InitializeComponent();
            SpeechRecognitionEngine reco = new SpeechRecognitionEngine();
            Choices list = new Choices();
            list.Add(new string[] { "hi", "hello" });
            Grammar gm = new Grammar(new GrammarBuilder(list));

            try
            {
                reco.RequestRecognizerUpdate();
                reco.LoadGrammar(gm);
                reco.SpeechRecognized += Reco_SpeechRecognized;
                reco.SetInputToDefaultAudioDevice();
                reco.RecognizeAsync(RecognizeMode.Multiple);
            }
            catch { }
        }

        private void Reco_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
        {
            string a = e.Result.Text;

            switch (a)
            {
                case ("hello"):
                    {
                        s.SpeakAsync("opening google");
                        Process.Start("https://www.google.com");
                        break;
                    }
                case ("hi"):
                    {
                        s.SpeakAsync("hi");
                        break;
                    }
            }
        }
    }
}

Code

1 Ответ

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

Протестировав это, я обнаружил, что у вас похожее поведение.Сказав любую фразу, программа иногда повторяет один или другой из ответов.

Запустив несколько тестов, я считаю, что происходит то, что SpeechRecognitionEngine не только слушает то, что вы говорите, этотакже слушая, что играет SpeechSynthesizer.

Чтобы продемонстрировать, я изменил список слов, добавив cat и dog, и изменил обработчик событий следующим образом:

private void Reco_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
    string a = e.Result.Text;

    switch (a)
    {
        case ("cat"):
            {
                s.SpeakAsync("dog");
                break;
            }
        case ("dog"):
            {
                s.SpeakAsync("cat");
                break;
            }
    }
}

Когда я сказал «Кошка», система ответила «Собака».Затем он услышал, как говорил «Собака», и ответил «Кошка», на что ответил «Собака».Конечный результат - «Кошка», «Собака», «Кошка», «Собака» за несколько итераций (обычно три или четыре раза в моих тестах).И наоборот, когда я комментировал звонки на номер SpeakAsync(), я не чувствовал зацикливания.Я не уверен, что заставляет его перестать слышать себя и, следовательно, перестать зацикливаться, это может быть внутренним ограничением.Просто чтобы заметить, что я использовал гарнитуру с микрофоном, так что не мой микрофон улавливал то, что воспроизводили динамики, это был DefaultAudioDevice, улавливающий то, что играл SpeechSynthesizer.

Я бы вообразил этоМожно было настроить SpeechRecognitionEngine для прослушивания только устройства ввода по умолчанию (микрофон) или альтернативно настроить SpeechSynthesizer для вывода только через устройство вывода по умолчанию (динамики), чтобы оно не пересекало потоки.Тем не менее, документация о том, как вы конфигурируете аудиопотоки, в этом отношении отсутствует.

Как "привет" звучит как "привет" или как "открытие Google" звучит как "привет", я не совсем уверен, но с такой ограниченной грамматикой может оказаться, что механизм распознавания довольно щедрый на то, что соответствует.

Надеюсь, это поможет

...