C# 从语音中获取用户输入?

C# 从语音中获取用户输入?,c#,.net,wpf,speech-recognition,speech-to-text,C#,.net,Wpf,Speech Recognition,Speech To Text,我刚刚开始在C#Net中试用Windows的语音到文本功能。我目前有基本的工作(即说点什么,它将提供基于您所说的输出)。然而,我正在努力弄清楚如何实际接收作为变量的用户输入 我的意思是,举个例子。如果用户说: "Call me John" 然后我希望能够将单词John作为变量,然后将其存储为persons用户名 我当前的speechrecogned活动如下: void zeusSpeechRecognised(object sender, SpeechRecognizedEventArgs e

我刚刚开始在C#Net中试用Windows的语音到文本功能。我目前有基本的工作(即说点什么,它将提供基于您所说的输出)。然而,我正在努力弄清楚如何实际接收作为变量的用户输入

我的意思是,举个例子。如果用户说:

"Call me John"
然后我希望能够将单词
John
作为变量,然后将其存储为persons用户名

我当前的
speechrecogned
活动如下:

void zeusSpeechRecognised(object sender, SpeechRecognizedEventArgs e)
    {
        writeConsolas(e.Result.Text, username);
        switch (e.Result.Grammar.RuleName)
        {
            case "settingsRules":
                switch (e.Result.Text)
                {
                    case "test":
                        writeConsolas("What do you want me to test?", me);
                        break;
                    case "change username":
                        writeConsolas("What do you want to be called?", me);
                        break;
                    case "exit":
                        writeConsolas("Do you wish me to exit?", me);
                        break;
                }
                break;
        }
    }
NB:
writeConsolas
只是
RichTextBox
的美化附加行

我想添加另一个
案例
,它执行以下操作:

case "call me"
    username = e.Result.GetWordFollowingCallMe() //Obv not a method, but thats the general idea.
    break;
显然,没有这样的方法,但这是我希望实现的总体想法。有没有一种方法可以搜索特定的短语(即:
callme
)并使用以下单词


编辑:我应该注意,e.Result.Text只返回它可以与字典中的文本匹配的单词。

它在您的情况下看起来不像
e.Result.Text
表示您可以枚举的内容:您正在检查开始文本的单词,而不是整个文本。在这种情况下,您不应使用
开关
,而应使用
链,如果
-
-
否则
s:

var text = e.Result.Text;
if (text.StartsWith("test")) {
    writeConsolas("What do you want me to test?", me);
} else if (text.StartsWith("change username")) {
    writeConsolas("What do you want to be called?", me);
} else if (text.StartsWith("exit")) {
    writeConsolas("Do you wish me to exit?", me);
} else if (text.StartsWith("call me")) {
    // Here you have the whole text. Chop off the "call me" part,
    // using Substring(), and do whatever you need to do with the rest of it
} else 
    ...

它不能用在
e.Result.Text
上的
开关中,因为它会测试整个值:
叫我John

默认情况下,或者在
开关之外,您应该有一个条件

但我真的会重构所有这些,试图避免
切换
或大规模
if..else if..else

const string Callme = "call me";
var text = e.Result.Text;

switch (text)
   {
   case "test":
       writeConsolas("What do you want me to test?", me);
   break;
   case "change username":
       writeConsolas("What do you want to be called?", me);
   break;
   case "exit":
       writeConsolas("Do you wish me to exit?", me);
   break;

   }
   if (text.StartsWith(CallMe)
       userName = text.Replace(CallMe, string.Empty).Trim();

我将考虑更新您的语法以使用它,这样您就可以直接提取结果,而不必通过识别结果进行解析。有一个简单的例子演示了
SemanticValues
semanticsultkeys
,和
semanticsultvalues
semanticsultvalues

+1这是一个智力上有趣的编程问题,但只需要我的2美分:如果一台计算机问我的名字,我的第一本能反应就是只回答我的名字,声音响亮而清晰。不是“叫我以实玛利”或“我叫泥”之类的。。。如果你走“给我打电话”的路,你可能会想测试一下:)@MiklosAubert谢谢你的建议。然而,我计划实现它,这样用户一开始就说“CallMeBlah”,而不是被提示