【问题标题】:How can I change the value inside this array? C#如何更改此数组中的值? C#
【发布时间】:2018-07-17 09:51:49
【问题描述】:

所以我想用一些可以更改的命令列表制作一些语音识别(使用 system.speech.recognition)软件。例如,起初你有两种命令列表:“左,右”,当你说左或右时,它会做一些功能。但是我希望在这个软件中,我可以随时更改命令列表,例如在上面的命令列表中,我想将单词“Left”更改为“Up”,当我说“Up”时,它会执行功能之前按“左”字做。这是我的代码:

Choices commands = new Choices();
GrammarBuilder gBuilder = new GrammarBuilder();

public void Masokey_Load(object sender, EventArgs e)
    {

        // Choices commands = new Choices();
        commands.Add(new string[] { Atext.Text, Dtext.Text});
        // GrammarBuilder gBuilder = new GrammarBuilder();
        gBuilder.Append(commands);
        Grammar grammar = new Grammar(gBuilder);

        recEngine.LoadGrammarAsync(grammar);
        recEngine.SetInputToDefaultAudioDevice();
        recEngine.SpeechRecognized += RecEngine_SpeechRecognized;
    }

    //save_btn
    public void Savebtn_Click(object sender, EventArgs e)
    {
        commands.Add(new string[] { Atext.Text, Dtext.Text});
        gBuilder.Append(commands);
    }

    public void RecEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
    {

        if(e.Result.Text == Atext.Text)
        {
          PressKey(0x1E);
         }
        else if (e.Result.Text == Dtext.Text)
        {
            PressKey(0x20);
        }
    }

我想改变“command.Add(new string[] {Atext.Text, Dtext.Text)”里面的值

我把命令列表放到一个文本框中,所以当我运行软件时,当我想更改命令列表时,我只需要更改文本框中的单词,当我点击保存按钮时,命令列表就会改变。问题是当我点击保存按钮时,命令列表不会改变。

是否可以更改 Choices 对象和 GrammarBuilder 对象的值?

【问题讨论】:

  • 您只执行添加操作,不执行删除操作。因此,您的程序可能会获得第一个元素,即旧元素
  • button35_Click - 避免这种情况,每次你这样做,未来的程序员都会死去......命名你的按钮,命名链接函数,命名所有内容。 (除非这实际上是一个按钮,上面写着一个大的35
  • @ThierryV 你说得对,但是可以改变 Choices 对象和 GrammarBuilder 对象的值吗?
  • @Rafalon 啊,谢谢,我已经重命名了。在我只是在上面发表一些评论但我忘记重命名它之前。
  • SpeechRecognizer.RequestRecognizerUpdate。还有一个你可以效仿的例子。每次要更新识别器语法时都应使用此命令。即使是第一次添加,也最好调用它。

标签: c# arrays winforms speech-recognition


【解决方案1】:

您不应该在填充后修改该数组(可能是列表)。 我假设gBuilder 包含语音识别接受的所有命令。如果是这样,请添加您将使用的所有命令,并在 RecEngine_SpeechRecognized 事件中检查它们是否已启用,然后再实际触发基于它们的操作。

给你一个基本的例子:

public void RecEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
    //mode could be a string or an enum variable
    if(mode.Equals("LEFT_RIGHT") && e.Result.Text == Atext.Text)
    {
      PressKey(0x1E);
     }
    else if (mode.Equals("LEFT_RIGHT") && e.Result.Text == Dtext.Text)
    {
        PressKey(0x20);
    }else if (mode.Equals("UP_DOWN") && e.Result.Text == Stext.Text)
    {
        PressKey(...);
    }else if(mode.Equals("UP_DOWN") && e.Result.Text == Wtext.Text)
    {
        PressKey(....);
    }
}

如果您的程序要变得更复杂,一个更好的方法是创建一个启用的命令列表。检查该实现的示例:

public void RecEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
    //enabledCommands is a list of strings (or whatever can store Atext.Text and the others)
    if(enabledCommands.Contains(e.Result.Text){ //First check if whatever command you received is enabled
      if(e.Result.Text == Atext.Text) //then check what command it is and execute it
      {
         PressKey(0x1E);
      }
    }
}

如果您的程序要求您可以更进一步并实现一个对象列表,其中每个对象都包含一个命令和一个指示该命令是否启用的布尔值,但这需要更多代码并且可能比您需要的更复杂是。

【讨论】:

  • 我认为它应该是 mode == "LEFT_RIGHT" 等...? :)
  • 啊,是的,谢谢。我有一段时间没有接触 C#。 :D 编辑:在进行更正时,我意识到应该是 equals...
  • @Zero 谢谢你的回答。我试试看:D
猜你喜欢
  • 2014-05-09
  • 1970-01-01
  • 1970-01-01
  • 2011-11-03
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-08
相关资源
最近更新 更多