统一语音识别C#字典问题

统一语音识别C#字典问题,c#,dictionary,unity3d,speech-recognition,C#,Dictionary,Unity3d,Speech Recognition,我想成功地实现一个高级语音识别系统,它可以知道如果你说一个由2或3个动作组成的短语,比如“前进,将颜色变为绿色,然后向左拐”,该怎么办。我实现了一个字典: private Dictionary<string, Action[]> actions = new Dictionary<string, Action[]>(); 但后来我想 我想拥有高级语音识别,所以我认为(我希望如此!)有一种比在这本词典中添加大量单词组合更好的方法 你能帮我吗?你知道有没有更好的办法吗?因为这

我想成功地实现一个高级语音识别系统,它可以知道如果你说一个由2或3个动作组成的短语,比如“前进,将颜色变为绿色,然后向左拐”,该怎么办。我实现了一个字典:

private Dictionary<string, Action[]> actions = new Dictionary<string, Action[]>();
但后来我想

我想拥有高级语音识别,所以我认为(我希望如此!)有一种比在这本词典中添加大量单词组合更好的方法


你能帮我吗?你知道有没有更好的办法吗?因为这将是非常不愉快和无聊的,而且需要很长时间才能在字典里找到你想要的。即使对于更改颜色,我现在也可以考虑:将颜色更改为绿色、更改为绿色、将颜色更改为绿色、将绿色设置为颜色、将绿色设置为新颜色等等。

为了帮助您更轻松地编写代码,您可以使用以下方法:

因此,使用enum列出您的命令并自动注入到识别器中。这种方法的优点是:如果您添加了新命令,代码中没有大的修改,只需添加新的功能即可。。所以我觉得这个程序更可读

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;
        }
    }
} 
公共类TestPrg:monobhavior
{
私有枚举命令
{
向上=0,向前,左,右,//第一组
绿色,蓝色,红色,//第二组
其他,其他1//第三组。。。。
}
专用关键字识别器kr;
void Start()
{
//将枚举命令转换为字符串[]
kr=新的关键字识别器(Enum.GetNames(typeof(Commands));
kr.onphrasecognized+=已识别的语音;
kr.Start();
}
私人void RecognizedSpeech(短语recognizedEventArgs语音)
{
命令cmd;
if(Enum.TryParse(speech.text,true,out cmd))
{
ActionCmd(cmd);
}
}
私有void ActionCmd(命令cmd)
{

如果(cmd>=Commands.Up&&cmd=Commands.Green&&cmd它不是短语,而是关键字识别…它有点不同..它是为了理解small command关键字,Okayyy…这是怎么可能的?我需要看什么?给我指个方向:)unity中只存在这个功能。但是我有一个解决方案,可以帮助您以最好的方式和更简单的方式编写代码。在回答之前,请稍等片刻。是的,非常感谢,它比我的代码好得多。我会立即使用它:)谢谢,Frenchy:)嘿,如果你不介意的话,我忘了问你一些问题。如果我想组合例如两种颜色。我是ay“黄色和红色”,我的目标应该将颜色更改为橙色。更一般地说,我如何记住cmd之前的单词?你可以尝试使用关键字“yellowsandred”或“yellowsred”避免使用空格,反正enum不喜欢名称中的空格…在你可以尝试在关键字中添加空格之后..不知道识别器是否擅长这一点..但这需要使用enum以外的其他东西来调整解决方案好的,谢谢你的回复。我真的非常感谢!我会考虑一下,如果需要调整代码或不需要,我会找到一个解决方案.再次感谢!
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;
        }
    }
}