예제 #1
0
파일: World.cs 프로젝트: kingtut666/holly
        public CMUSphinx_GrammarDict CreateGrammarDoc_JSGF()
        {
            if (currentCMUDoc != null) return currentCMUDoc;
            caps_rules_jsgf = new Dictionary<EDeviceCapabilities, string>();
            CMUSphinx_GrammarDict ret = new CMUSphinx_GrammarDict();
            ret.GrammarName = GetName();
            StringBuilder bld = new StringBuilder();
            StringBuilder actionItemLocs = new StringBuilder();

            ret.JSGFRuleStart("<ACTIONITEMLOCS>", actionItemLocs);
            List<string> actionItemLocation_choices = new List<string>();
            foreach (Room rm in ListRooms())
            {
                if (rm.Name == "") continue;
                Dictionary<string, string> actionsPerDevice = new Dictionary<string, string>();
                foreach (Device d in rm.ListDevices())
                {
                    string caps_ruleref = JSGFActionsFromCapabilities(d.Capabilities, ret);
                    if (caps_ruleref == null) continue;
                    string cl = SoundsLike.Get(d.Class, false);
                    if (cl != "" && !actionsPerDevice.ContainsKey(cl))
                    {
                        actionsPerDevice.Add(cl, caps_ruleref);
                    }
                    if (d.FriendlyName != "")
                    {
                        if (!actionsPerDevice.ContainsKey(d.FriendlyName))
                            actionsPerDevice.Add(d.FriendlyName, caps_ruleref);
                    }
                }
                //actionsperdevice.Value + actionsperdevice.Key+room
                if (actionsPerDevice.Count == 0) continue; //nothing in the room
                StringBuilder bld_ail_gb = new StringBuilder();
                string name_ail_gb = "<"+AudioRecog_SAPI.SrgsCleanupID(rm.Name + "__ail")+">";
                ret.JSGFRuleStart(name_ail_gb, bld_ail_gb);

                List<string> action_items = new List<string>();
                bool action_items_valid = false;
                foreach (string item in actionsPerDevice.Keys)
                {
                    if (item == "") continue;
                    StringBuilder bld_ai_gb = new StringBuilder();
                    string name_ai_gb = "<" + AudioRecog_SAPI.SrgsCleanupID(rm.Name + "_" + item) + ">";

                    ret.JSGFRuleStart(name_ai_gb, bld_ai_gb);
                    ret.JSGFRuleAddToken(bld_ai_gb, actionsPerDevice[item]);
                    ret.JSGFRuleAddToken(bld_ai_gb, item);
                    ret.JSGFRuleEnd(name_ai_gb, bld_ai_gb);

                    action_items.Add(name_ai_gb);
                    action_items_valid = true;
                }
                if (!action_items_valid)
                {
                    ret.JSGFRuleCancel(name_ail_gb, bld_ail_gb);
                    continue;
                }
                ret.JSGFRuleAddChoicesStart(bld_ail_gb, action_items);
                ret.JSGFRuleAddChoicesEnd(bld_ail_gb);
                if (rm != CurrentLocation)
                {
                    ret.JSGFRuleAddToken(bld_ail_gb, "in the " + rm.Name);
                    ret.JSGFRuleUnaryOp(bld_ail_gb, true, false);
                }
                else
                {
                    ret.JSGFRuleAddChoicesStart(bld_ail_gb, new List<string>(new string[] { "in the " + rm.Name, "here" }));
                    ret.JSGFRuleAddChoicesEnd(bld_ail_gb);
                    ret.JSGFRuleUnaryOp(bld_ail_gb, true, false);
                }
                ret.JSGFRuleEnd(name_ail_gb, bld_ail_gb);
                actionItemLocation_choices.Add(name_ail_gb);
            }
            ret.JSGFRuleAddChoicesStart(actionItemLocs, actionItemLocation_choices);
            ret.JSGFRuleAddChoicesEnd(actionItemLocs);
            ret.JSGFRuleEnd("<ACTIONITEMLOCS>", actionItemLocs);

            ret.JSGFRuleStart("<ROOT>", bld);
            ret.JSGFRuleAddToken(bld, "Holly");
            ret.JSGFRuleAddToken(bld, "<ACTIONITEMLOCS>");
            ret.JSGFRuleAddToken(bld, "please");
            ret.JSGFRuleEnd("<ROOT>", bld);

            ret.JSGFSetRootRule("<ROOT>");

            ret.BuildJSGFGrammarAndDict();

            currentCMUDoc = ret;
            return ret;
        }