检测特定短语以开始识别命令

时间:2017-06-12 22:09:28

标签: c# speech-recognition speech-synthesis

我目前正忙着使用System.Speech来制作一个亚马逊Alexa类型的程序,你可以在其中询问一个命令并回复一个答案。

现在我将它设置为我点击按钮的位置,以便它开始检测来自麦克风的音频输入,但我想要做Alexa风格或Google风格(“Alexa”或“Hey Google”)。

这是我到目前为止所做的:

public partial class SpeechRecognition : Form
{

    SpeechRecognitionEngine recEngine = new SpeechRecognitionEngine();
    SpeechSynthesizer synth = new SpeechSynthesizer();




    public SpeechRecognition()
    {
        InitializeComponent();
    }

    private void SpeechRecognition_Load(object sender, EventArgs e)
    {
        Choices command = new Choices();
        command.Add(new string[] { "Say Hello", "Print my name", "speak selected text", "time", "current weather", "humidity"});

        GrammarBuilder gBuilder = new GrammarBuilder();
        gBuilder.Append(command);

        Grammar grammar = new Grammar(gBuilder);

        recEngine.LoadGrammarAsync(grammar);
        recEngine.SetInputToDefaultAudioDevice();

        recEngine.SpeechRecognized += recEngine_SpeechRecognized;

    }

    void recEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
    {
        synth.SelectVoiceByHints(VoiceGender.Neutral);
        var request = new ForecastIORequest("...", 38.47382f, -76.50636f, DateTime.Now, Unit.us);
        var response = request.Get();
        switch (e.Result.Text)
        {
            case "Say Hello":
                PromptBuilder builder = new PromptBuilder();

                builder.StartSentence();
                builder.AppendText("Hello Zack");
                builder.EndSentence();

                builder.AppendBreak(new TimeSpan(0, 0, 0, 0,50));

                builder.StartSentence();
                builder.AppendText("How are you?");
                builder.EndSentence();

                synth.SpeakAsync(builder);
                break;

            case "Print my name":
                richTextBox1.Text += "\nZack";
                break;

            case "speak selected text":
                synth.SpeakAsync(richTextBox1.SelectedText);
                break;
            case "time":
                DateTime time = DateTime.Now;
                synth.SpeakAsync(time.ToShortTimeString());
                break;
            case "current weather":
                response = request.Get();

                synth.SpeakAsync("The weather in St. Leonard is " + response.currently.summary + "with a temperature of " + Math.Round((decimal)response.currently.temperature, 0) + " degrees farenheit");
                break;
            case "humidity":
                response = request.Get();
                synth.SpeakAsync("Current humidity is " + 100 * response.currently.humidity + "percent");
                break;
            default:
                synth.SpeakAsync("I did not recognize a command");
                break;
        }
    }

    private void enableBtn_Click(object sender, EventArgs e)
    {
        recEngine.RecognizeAsync(RecognizeMode.Multiple);
        disableBtn.Enabled = true;

    }

    private void disableBtn_Click(object sender, EventArgs e)
    {
        recEngine.RecognizeAsyncStop();
        disableBtn.Enabled = false;
    }

我如何改变它以便它不断地听一个短语然后它会在那之后听一个命令?我猜我需要创建另一个识别引擎实例?任何帮助都会很棒。

0 个答案:

没有答案