14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------* 24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * grxmldoc.h * 34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Copyright 2007, 2008 Nuance Communciations, Inc. * 54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the 'License'); * 74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * you may not use this file except in compliance with the License. * 84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * You may obtain a copy of the License at * 104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 * 114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Unless required by applicable law or agreed to in writing, software * 134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * distributed under the License is distributed on an 'AS IS' BASIS, * 144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * See the License for the specific language governing permissions and * 164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * limitations under the License. * 174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *---------------------------------------------------------------------------*/ 194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef __grxmldoc_h__ 224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define __grxmldoc_h__ 234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// #define MEMTRACE // Uses mtrace() to detect leaks 254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "hashmap.h" 274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "tinyxml.h" 284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <stack> 294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "vocab.h" 304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define SCRIPT_LABEL_PREFIX "_" 324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define SCRIPT_LABEL_PREFIX_LEN 1 334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass Node; 344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttemplate <typename T1, typename T2> class HashMap; 354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass Graph; 364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass SubGraph; 374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectclass GRXMLDoc 394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectpublic: 414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef TiXmlNode XMLNode; 424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Some convenience items for string comparison 4373018b4a1d088cdda0e7bd059fddf1f308a8195aIan Rogers enum KeywordValues {NodeTypeGrammar, NodeTypeRule, NodeTypeRuleReference, NodeTypeOneOf, NodeTypeItem, NodeTypeTag, NodeTypeCount, NodeTypeMeta, NodeTypeBadValue}; 444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef std::map<std::string, KeywordValues> KEYWDPAIR; 454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project typedef struct { 474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool hasRuleRef; 484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project std::string RuleRefName; 494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int tagID; 504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } ItemData; 514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project GRXMLDoc(); 534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ~GRXMLDoc(); 544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Optional use of voc and model files 564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // TODO: Rearrange access to voc and models 574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef OPENFSTSDK 584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void initialize_SR(char* parfile); 594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void shutdown_SR(); 604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project Vocabulary *getVocabulary() { return m_pVocab;} 614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project AcousticModel* getModel() { return m_pModel;} 624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int addPhonemeToList( std::string const& s ); 634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool findPhoneme( int i, std::string & s ); 644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool getHMMSequence (int centre, int left, int right, std::vector<int> & modelSequence); 654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Lookup functions 684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool findSubGraph(std::string & s, SubGraph *&p_SubGraph); 694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool findRule(int i, std::string &s ); 704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool findTag(int i, std::string &s ); 714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool findLabel(int i, std::string &s ); 724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool findSubGraphIndex( SubGraph *p_SubGraph, std::string &s ); 734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool findRuleIndex( std::string s, int &i ); 744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool findTagIndex( std::string s, int &i ); 754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool findLabelIndex( std::string s, int &i ); 764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool findSortedLabel(int i, std::string &s ); 774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool findSortedLabelIndex( int i, int &sortedIndex ); 784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool findMeta(const std::string & sn, std::string &s); 794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool setMeta(const std::string & sn, const std::string &s); 804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void sortLabels(); 814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void addOLabelToOList( std::string & s); 824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool WriteOLabels(const std::string& fileName); 834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Take DOM object and create word graph. Creates SubGraph, rule, tag and label lists. 854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool parseGrammar( XMLNode &node, std::string & xMLFileName ); 864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Generate output files 884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void writeMapFile( std::string & fileName ); 894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void writeScriptFile( std::string & fileName ); 904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void writeGraphFiles( std::string & fileName, bool bDoWriteRecogGraphs ); 914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void writeParamsFile( std::string & fileName ); 924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void printLists(); 934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void printSubgraphs(); 944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectprotected: 964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void initializeLists(); 974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool parseNode( XMLNode &node, SubGraph *&p_SubGraph, const unsigned int level ); 984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool beginNode( XMLNode &node, SubGraph *&p_SubGraph, const unsigned int level ); 994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool endNode( XMLNode &node, SubGraph *&p_SubGraph, const unsigned int level ); 1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool beginParseGrammarNode( XMLNode &node ); 1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool endParseGrammarNode( XMLNode &node ); 1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool beginParseMetaNode( XMLNode &node ); 1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool endParseMetaNode( XMLNode &node ); 1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool beginParseRuleNode( XMLNode &node, SubGraph *&p_SubGraph); 1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool endParseRuleNode( XMLNode &node, SubGraph *&p_SubGraph ); 1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool beginItem( XMLNode &node, SubGraph *&p_SubGraph ); 1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool endItem( XMLNode &node, SubGraph *&p_SubGraph ); 1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool processCDATA( XMLNode &node, SubGraph *&p_SubGraph ); 1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool beginOneOf( XMLNode &node, SubGraph *&p_SubGraph ); 1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool endOneOf( XMLNode &node, SubGraph *&p_SubGraph ); 1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool beginRuleRef( XMLNode &grmNode, SubGraph *&p_SubGraph ); 1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool endRuleRef(XMLNode &node, SubGraph *&p_SubGraph ); 1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool fixRuleRef( SubGraph *&p_SubGraph ); 1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool getRuleRefName(XMLNode &node, std::string &ruleName); 1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool extendAltExpression( XMLNode &node, int level ); 1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool beginTag( XMLNode &node, SubGraph *&p_SubGraph ); 1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool endTag( XMLNode &node, SubGraph *&p_SubGraph ); 1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool beginCount( XMLNode &node, SubGraph *&p_SubGraph ); 1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool endCount( XMLNode &node, SubGraph *&p_SubGraph ); 1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void printNode( XMLNode &node, int level ); 1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool addRuleToList(std::string const& ruleName, SubGraph *&p_SubGraph); 1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool deleteRules(); 1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool addTagToList( std::string const& s ); 1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool addLabelToList( std::string const& s ); 1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project void printSubgraph( SubGraph &p_SubGraph ); 1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectprivate: 1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project Graph *m_pGraph; // The top-level container object for the word graph; 1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project KEYWDPAIR m_NodeKeyWords; 1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // The unique attributes of the GRML doc 1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project std::string m_XMLMode; 1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project std::string m_XMLLanguage; 1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project std::string m_RootRule; 1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project std::string m_XMLTagFormat; 1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project std::string m_XMLVersion; 1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project std::string m_XMLBase; 1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project std::string m_XMLFileName; 1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // We store indices for all labels used in the word graph. 1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Store all these labels in the m_LabelList table, which is auto-indexed. 1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // We need a list of the rule names so that we can distinguish them from other labels. 1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Store these rule names in the m_RuleList table with an index equal to the label index for the rule. 1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Thus, when we need the index of a rule, we go straight to m_RuleList 1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // and when we need the label of a rule or any other item we use m_LabelList. 1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project HashMap<std::string,SubGraph*> m_SubgraphList; 1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project HashMap<int,std::string> m_TagList; // <item tag = ... 1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project HashMap<int,std::string> m_LabelList; // Stores all network label IDs, including rule names 1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project HashMap<int,std::string> m_SortedLabelList; // Used to sort the labels fo 1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project HashMap<int, std::string> m_PhonemeList; // Stores triphones 1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project HashMap<std::string,int> m_RuleList; // Stores rule name and index used in the LabelList. Use to distinguish which are rules. 1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project HashMap<int, std::string> m_RuleScope; 1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project HashMap<int, std::string> m_SlotList; 1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project HashMap<std::string, std::string> m_MetaKeyValPairs; //Store word-penalty value 1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project HashMap<std::string, int> m_OutputPtxtLabels; 1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project std::stack<ItemData*> m_ItemVarsStack; 1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project std::stack<std::string> m_RuleListStack; 1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int m_RuleAutoIndex; 1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int m_TagAutoIndex; 1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int m_LabelAutoIndex; 1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int m_PhonemeAutoIndex; 1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int m_ExpandedRulesAutoIndex; 1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int m_TagID; // Use to stash tag index for items. 1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Note the subgraph list does not have an auto-index as it is string-indexed. 1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // All these lists also have an internal numeric index which can be used. 1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef OPENFSTSDK 1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project Vocabulary *m_pVocab; 1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project AcousticModel *m_pModel; 1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}; 1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif // __grxmldoc_h__ 1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 181