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; }