我刚开始在C#.Net中尝试使用Windows Speech to Text功能。我目前已经掌握了基础知识(IE - 说些什么,它会根据你说的提供输出)。但是,我正在努力弄清楚如何将用户输入实际接收为变量。
我的意思是,例如。如果用户说:
"Call me John"
然后我希望能够将单词John
作为变量,然后将其存储为人员用户名。
我当前的SpeechRecognized
事件如下:
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;
}
}
注意: writeConsolas
只是RichTextBox
的美化附加行。
我想添加另一个case
执行以下操作:
case "call me"
username = e.Result.GetWordFollowingCallMe() //Obv not a method, but thats the general idea.
break;
显然,没有这样的方法,但这是我希望实施的一般想法。有没有办法搜索特定的短语(IE:Call me
)并采取以下单词?
编辑:我应该注意,e.Result.Text只返回它可以与字典中的Text匹配的单词。
答案 0 :(得分:4)
在您的情况下看起来不像e.Result.Text
代表您可以枚举的内容:您正在检查启动文本的单词,而不是整个文本。在这种情况下,您不应使用switch
,而是转而使用if
- then
- else
链:
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
...
答案 1 :(得分:4)
好吧,它不能在switch
e.Result.Text
上使用,因为它会测试整个值:Call Me John
。
您应该在default
案例或switch
但我会重构所有这些,试图避免switch
或大量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();
答案 2 :(得分:2)
我会考虑更新你的语法以使用SemanticValues,这样你就可以直接提取结果而不必解析识别结果。有一个快速示例here,演示SemanticValues
,SemanticResultKeys
和SemanticResultValues
。