微软语音平台-如何在c#中更新srgs语法

本文关键字:更新 srgs 语法 语音 平台 微软 | 更新日期: 2023-09-27 17:51:24

我已经创建了用于语义识别的srgs文件,现在我想更新myGrammar文件,现在如何更新my_Grammar.xml文件并在文本框的项目标签中添加更多城市。关于这方面的帮助材料,我们将感激并提前感谢。

     <grammar version="1.0" xml:lang="en-US" mode="voice" root="destination" 
            xmlns="http://www.w3.org/2001/06/grammar" tag-format="semantics/1.0">
          <rule id="Source">
               <one-of>
              <item> Karachi </item>
              <item> Lahore </item>
              <item> Abbottabad </item>
 <item> Murree </item>
            </one-of>
          </rule>
 <rule id="destination">
               <one-of>
              <item> Karachi </item>
              <item> Lahore </item>
              <item> Islamabad </item>
            </one-of>
          </rule>
 <rule id="Article">
               <one-of>
              <item> to</item>
             </one-of>
          </rule>
        </grammar>
          SrgsRule SrcRule = new SrgsRule("id_Source");
          SrgsOneOf SrcList = new SrgsOneOf(new string[] { "Lahore","Karachi",Abbottabad ,"Murree"});
          SrcRule.Add(SrcList);
          SrgsRule ArticleRule = new SrgsRule("id_Article");
          SrgsOneOf ArticleList = new SrgsOneOf(new string[] { "to" });
          ArticleRule.Add(ArticleList);
          SrgsRule desRule = new SrgsRule("id_Destination");
          SrgsOneOf desList = new SrgsOneOf(new string[] { "Islamabad","Lahore","Karachi",Abbottabad ,"Murree"});
          desRule.Add(desList);
          SrgsRule rootRule = new SrgsRule("Src_Article_des");
          rootRule.Scope = SrgsRuleScope.Public;
          SrgsRuleRef SrcRef = new SrgsRuleRef(SrcRule, "theSource");
          rootRule.Add(SrcRef);
          SrgsRuleRef ArticleRef = new SrgsRuleRef(ArticleRule, "theArticle");
          rootRule.Add(ArticleRef);
          SrgsRuleRef desRef = new SrgsRuleRef(desRule, "theDestination");
          rootRule.Add(desRef);
          SrgsDocument document = new SrgsDocument();
          document.Rules.Add(new SrgsRule[] { rootRule, SrcRule, ArticleRule, desRule });        
          document.Root = rootRule;
          Grammar g = new Grammar(document, "Src_Article_des");
          sr.LoadGrammar(g);
          System.Xml.XmlWriter writer =
            System.Xml.XmlWriter.Create("c:''test''myGrammar.xml");
          document.WriteSrgs(writer);
          writer.Close();

微软语音平台-如何在c#中更新srgs语法

  public void AddItemToRule(string inFile, string outFile, string ruleId, string itemVal)
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(inFile); // loads xml file
            if (AddItemToRule(xmlDoc, ruleId, item))
            {
                xmlDoc.Save(outFile);
                MessageBox.Show(@"Inserted Successfully");
            }
        }
        public bool AddItemToRule(XmlDocument xmlDoc, string ruleId, string itemVal)
        {
            string ns = "http://www.w3.org/2001/06/grammar";
            XmlNamespaceManager nsMgr = new XmlNamespaceManager(xmlDoc.NameTable);
            nsMgr.AddNamespace("g", ns);
            System.Diagnostics.Debug.WriteLine(nsMgr.DefaultNamespace);
            XmlNode foundNode = xmlDoc.SelectSingleNode("//g:rule[@id='" + ruleId + "']/g:one-of", nsMgr);
            if (foundNode != null)
            {
                XmlElement eleItem = xmlDoc.CreateElement("item");

                var text = xmlDoc.CreateTextNode(item);
                eleItem.AppendChild(text);
                foundNode.AppendChild(eleItem);
                return true;
            }
            return false;
        }
     AddItemToRule(path, path, "id_Source", itemValue);
     AddItemToRule(path, path, "id_Article", itemValue);
     AddItemToRule(path, path, "id_Destination", itemValue);

试试这个。我使用的是XML Linq,但是你也可以直接使用XML来做同样的事情。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication32
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = 
              "<one-of>" +
                  "<item>" + 
        //add item dynamically. // i want to add item here
                  "</item>" +
                  "<item> " +
       //add new items.// i want to add item here
                  "</item>" +
              "</one-of>";
            XDocument doc = XDocument.Parse(input);
            List<XElement> items = doc.Descendants().Where(x => x.Name == "item").ToList();
            foreach (XElement item in items)
            {
                XElement newElement = new XElement("newItem", "i want to add item here");
                item.Add(newElement);
            }
        }
    }
}

也可以创建简单的grxml文件(不使用编程方式),然后通过添加新元素来更新文件

好吧,我知道这有点晚了,但由于我没有找到这个问题的任何正确答案,我想放弃我的解决方案,使用SrgsDocument类:

public void UpdateVoiceCommand(string ruleId, SrgsRule updatedRule, string grammarFileName)
{
    SrgsDocument grammarXmlDoc = new SrgsDocument(grammarFileName);
    SrgsRulesCollection rules;
    rules = grammarXmlDoc.Rules;
    if (rules.Contains(ruleId))
        rules.Remove(ruleId);   //Remove old grammar rule
    rules.Add(newRule);     //Add replacement rule
    saveSrgsDocument(GrammarFileName, grammarXmlDoc);
}

这将把新规则放在语法文件的末尾,但是通过使用Insert方法,您可以把它放在任何您想要的地方:

    if (rules.Contains(ruleId))          //First check if the rule exists
    {
        SrgsRule oldRule = rules[ruleId];    //Get the old rule
        int index = rules.IndexOf(oldRule);  //Find it's position
        rules.Remove(ruleId);                //Remove it
        rules.Insert(index, newRule);        //Insert new rule at the position of the old rule
    }
    else
        rules.Add(newRule);                  //Append a new rule at the end