Протестировав это, я обнаружил, что у вас похожее поведение.Сказав любую фразу, программа иногда повторяет один или другой из ответов.
Запустив несколько тестов, я считаю, что происходит то, что 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" звучит как "привет", я не совсем уверен, но с такой ограниченной грамматикой может оказаться, что механизм распознавания довольно щедрый на то, что соответствует.
Надеюсь, это поможет