Unity语音识别C#字典问题
Unity Speech Recognition C# dictionary problem
我想成功实现一个高级语音识别系统,如果您说出包含 2 或 3 个动作的短语,例如 "GO FORWARD and CHANGE COLOR TO GREEN and then TURN TO THE LEFT",它可以知道要做什么。我实现了一个字典:
private Dictionary<string, Action[]> actions = new Dictionary<string, Action[]>();
现在我在其中添加了一些词:
actions.Add("up", new Action[] { Up });
actions.Add("down", new Action[] { Down });
actions.Add("left", new Action[] { Left });
actions.Add("right", new Action[] { Right });
actions.Add("green", new Action[] { () => ChangeColor(this.word) });
actions.Add("red", new Action[] { () => ChangeColor(this.word) });
actions.Add("white", new Action[] { () => ChangeColor(this.word) });
actions.Add("blue", new Action[] { () => ChangeColor(this.word) });
actions.Add("yellow", new Action[] { () => ChangeColor(this.word) });
但后来我想...
我想要高级语音识别,所以我认为(我希望!)有比在这本词典中添加很多很多单词组合更好的方法。
那你能帮帮我吗?你知道有没有更好的方法?因为这将是非常不愉快和无聊的,而且要花很长时间才能在字典中找到你想要的东西。即使是改变颜色,我现在可以想到:将颜色更改为绿色,更改为绿色,将颜色更改为绿色,将绿色变为绿色,将绿色变为新颜色等
为了帮助您更轻松地编写代码,您可以使用以下方法:
所以使用枚举来列出您的命令并在识别器中自动注入。这种方法的优点:如果您添加新命令,无需对代码进行大的修改,只需添加新的功能。所以我认为该程序更具可读性。
public class TestPrg : MonoBehaviour
{
private enum Commands
{
Up = 0, Forward, Left, Right,//first group
Green, Blue, Red, //second group
Other, Other1 //third group....
}
private KeywordRecognizer kr;
void Start()
{
//Transform Enum Commands to string[]
kr = new KeywordRecognizer(Enum.GetNames(typeof(Commands)));
kr.OnPhraseRecognized += RecognizedSpeech;
kr.Start();
}
private void RecognizedSpeech(PhraseRecognizedEventArgs speech)
{
Commands cmd;
if (Enum.TryParse(speech.text, true, out cmd))
{
ActionCmd(cmd);
}
}
private void ActionCmd(Commands cmd)
{
if (cmd >= Commands.Up && cmd <= Commands.Right)
{
Move(cmd);
}
else if (cmd >= Commands.Green && cmd <= Commands.Red)
{
ChangeColor(cmd);
}
else
{
//Othercommand();
}
}
void Move(Commands cmd)
{
switch (cmd)
{
case Commands.Up:
//action
break;
case Commands.Forward:
//action
break;
default:
break;
}
}
private void ChangeColor(Commands cmd)
{
switch (cmd)
{
case Commands.Green:
//action
break;
case Commands.Blue:
//action
break;
default:
break;
}
}
}
我想成功实现一个高级语音识别系统,如果您说出包含 2 或 3 个动作的短语,例如 "GO FORWARD and CHANGE COLOR TO GREEN and then TURN TO THE LEFT",它可以知道要做什么。我实现了一个字典:
private Dictionary<string, Action[]> actions = new Dictionary<string, Action[]>();
现在我在其中添加了一些词:
actions.Add("up", new Action[] { Up });
actions.Add("down", new Action[] { Down });
actions.Add("left", new Action[] { Left });
actions.Add("right", new Action[] { Right });
actions.Add("green", new Action[] { () => ChangeColor(this.word) });
actions.Add("red", new Action[] { () => ChangeColor(this.word) });
actions.Add("white", new Action[] { () => ChangeColor(this.word) });
actions.Add("blue", new Action[] { () => ChangeColor(this.word) });
actions.Add("yellow", new Action[] { () => ChangeColor(this.word) });
但后来我想...
我想要高级语音识别,所以我认为(我希望!)有比在这本词典中添加很多很多单词组合更好的方法。
那你能帮帮我吗?你知道有没有更好的方法?因为这将是非常不愉快和无聊的,而且要花很长时间才能在字典中找到你想要的东西。即使是改变颜色,我现在可以想到:将颜色更改为绿色,更改为绿色,将颜色更改为绿色,将绿色变为绿色,将绿色变为新颜色等
为了帮助您更轻松地编写代码,您可以使用以下方法:
所以使用枚举来列出您的命令并在识别器中自动注入。这种方法的优点:如果您添加新命令,无需对代码进行大的修改,只需添加新的功能。所以我认为该程序更具可读性。
public class TestPrg : MonoBehaviour
{
private enum Commands
{
Up = 0, Forward, Left, Right,//first group
Green, Blue, Red, //second group
Other, Other1 //third group....
}
private KeywordRecognizer kr;
void Start()
{
//Transform Enum Commands to string[]
kr = new KeywordRecognizer(Enum.GetNames(typeof(Commands)));
kr.OnPhraseRecognized += RecognizedSpeech;
kr.Start();
}
private void RecognizedSpeech(PhraseRecognizedEventArgs speech)
{
Commands cmd;
if (Enum.TryParse(speech.text, true, out cmd))
{
ActionCmd(cmd);
}
}
private void ActionCmd(Commands cmd)
{
if (cmd >= Commands.Up && cmd <= Commands.Right)
{
Move(cmd);
}
else if (cmd >= Commands.Green && cmd <= Commands.Red)
{
ChangeColor(cmd);
}
else
{
//Othercommand();
}
}
void Move(Commands cmd)
{
switch (cmd)
{
case Commands.Up:
//action
break;
case Commands.Forward:
//action
break;
default:
break;
}
}
private void ChangeColor(Commands cmd)
{
switch (cmd)
{
case Commands.Green:
//action
break;
case Commands.Blue:
//action
break;
default:
break;
}
}
}