/** Convert word graph to phoneme graph */ private Graph buildPhonemeGraph(Graph wordGraph) { Graph phonemeGraph = new Graph(); phonemeGraph.copyGraph(wordGraph); for (Node node : phonemeGraph.nodeToArray()) { if (node.getType().equals(NodeType.WORD)) { String word = node.getID(); // "false" means graph won't have additional dummy // nodes surrounding the word Graph pronunciationGraph = dictionary.getWordGraph(word, false); phonemeGraph.insertGraph(pronunciationGraph, node); } } return phonemeGraph; }
/** * Convert the phoneme graph to an HMM. * * @param cdGraph a context dependent phoneme graph * @return an HMM graph for a context dependent phoneme graph */ public Graph buildHMMGraph(Graph cdGraph) { Graph hmmGraph = new Graph(); hmmGraph.copyGraph(cdGraph); for (Node node : hmmGraph.nodeToArray()) { Unit unit = null; if (node.getType().equals(NodeType.PHONE)) { unit = unitManager.getUnit(node.getID()); } else if (node.getType().equals(NodeType.SILENCE_WITH_LOOPBACK)) { unit = unitManager.getUnit("SIL"); } else { // if it's not a phone, and it's not silence, it's a // dummy node, and we don't care. continue; } HMM hmm = acousticModel.lookupNearestHMM(unit, HMMPosition.UNDEFINED, false); Graph modelGraph = buildModelGraph((SenoneHMM) hmm); modelGraph.validate(); hmmGraph.insertGraph(modelGraph, node); } return hmmGraph; }
/** * Convert phoneme graph to a context sensitive phoneme graph. This graph expands paths out to * have separate phoneme nodes for phonemes in different contexts. * * @param phonemeGraph the phoneme graph * @return a context dependendent phoneme graph */ public Graph buildContextDependentPhonemeGraph(Graph phonemeGraph) { // TODO: Dummy stub for now - return a copy of the original graph Graph cdGraph = new Graph(); cdGraph.copyGraph(phonemeGraph); return cdGraph; }