C# ненужный ввод при использовании распознавания голоса - PullRequest
0 голосов
/ 08 марта 2020
class Program
{
    static void Main(string[] args)
    {
        Brain b = new Brain();
        b.start();
    }
}
public class Map
{
    public string key;
    public string value;
    public Map(string key, string value)
    {
        this.key = key;
        this.value = value;
    }
}
public class Ears
{
    private SpeechRecognitionEngine ears;
    public Ears(List<Map> knowledge, EventHandler<SpeechRecognizedEventArgs> onRecognise, EventHandler<SpeechRecognitionRejectedEventArgs> onReject)
    {

        this.ears = new SpeechRecognitionEngine();

        Choices commands = new Choices();
        foreach (var item in knowledge)
        {
            commands.Add(item.key);
        }
        GrammarBuilder gBuilder = new GrammarBuilder();
        gBuilder.Append(commands);
        Grammar grammar = new Grammar(gBuilder);

        ears.LoadGrammar(grammar);
        ears.SetInputToDefaultAudioDevice();

        ears.RecognizeAsync(RecognizeMode.Multiple);
        ears.SpeechRecognized += onRecognise;
        ears.SpeechRecognitionRejected += onReject;

    }
    public void stop()
    {
        ears.RecognizeAsyncCancel();
    }
    public void start()
    {
        ears.RecognizeAsync(RecognizeMode.Multiple);
    }
}
public class Brain
{
    protected List<Map> commands;
    protected List<Map> answers;

    private readonly Ears ears;
    public Brain()
    {
        commands = new List<Map>();
        commands.Add(new Map("list",""));
        commands.Add(new Map("somethingElse","someValue"));
        ears = new Ears(commands, onRecognized, onRejected);
    }
    private void onRecognized(object sender, SpeechRecognizedEventArgs e)
    {
        Console.WriteLine(e.Result.Text);
        terminateCommands(new Map(e.Result.Text.Trim().ToLower(), null));
    }
    public void start() {
        while (true) {
            string answer = Console.ReadLine();
            if (answer!="")
            {
                terminateCommands(new Map(answer, null));
            }
        }
    }
    private void onRejected(object sender, SpeechRecognitionRejectedEventArgs e)
    {
    }
    private void terminateCommands(Map cmd) {
        Console.WriteLine("need user input");
        var answer = Console.ReadLine();
        Console.WriteLine("need user input again");
        var answer2 = Console.ReadLine();

    }
}

Метод 'list' работает очень хорошо (вызывается terminateCommands), если я использую свою клавиатуру. Поэтому terminateCommands вызывается из метода start. Однако, если я использую VoiceRecognition (basi c Mycrosoft.Speech), и terminateCommands вызывается из eventHandler, каждый раз, когда метод списка требует ввода данных пользователем, я должен нажать Enter, написать sg и затем снова нажать Enter , Похоже, что есть еще одна Console.ReadLine () перед каждым Console.ReadLine () в методе list. ear.stop () просто останавливает распознавание голоса. Карта - это класс, содержащий 2 строки (значение, ключ). Я немного растерялся. Есть идеи?

...