I have just started trying out the Windows Speech to Text capabilities in C# .Net. I currently have the basics working (IE - Say something, and it will provide output based on what you say). However, I am struggling to figure out how to actually recieve user input as a variable.
What I mean by this, is that for example. If the user says:
"Call me John"
Then I want to be able to take the word John
as a variable and then store that as say, the persons username.
My current SpeechRecognized
event is as follows:
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
is just a glorified append line to a RichTextBox
.
I would like to add another case
which does the following:
case "call me"
username = e.Result.GetWordFollowingCallMe() //Obv not a method, but thats the general idea.
break;
Obviously, there is no such method, but that is the general idea that I wish to implement. Is there a way to search for specific phrases (IE: Call me
) and take the following word?
EDIT: I should note, that the e.Result.Text only returns words that it can match to Text in the dictionary.
It does not look like in your situation e.Result.Text
represents something that you can enumerate: you are checking the words that start the text, not the text in its entirety. In cases like this, you should not use a switch
, and go for a chain of if
-then
-else
s instead:
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
...
Well it can't be used in a switch
on e.Result.Text
, as it will test on the entire value : Call Me John
.
You should have a condition in a default
case, or outside of your switch
But I would really refactor all that, trying to avoid switch
or massive 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();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With