/* * Copyright 1999-2009 Carnegie Mellon University. * Copyright 2009 PC-NG Inc. * All Rights Reserved. Use is subject to license terms. * * See the file "license.terms" for information on usage and * redistribution of this file, and for a DISCLAIMER OF ALL * WARRANTIES. * */ package edu.cmu.sphinx.linguist.dictionary; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.util.HashMap; import java.util.Map; import java.util.StringTokenizer; import java.util.List; import edu.cmu.sphinx.linguist.acoustic.Context; import edu.cmu.sphinx.linguist.acoustic.Unit; import edu.cmu.sphinx.linguist.acoustic.UnitManager; import edu.cmu.sphinx.util.props.ConfigurationManagerUtils; import edu.cmu.sphinx.util.props.PropertyException; import edu.cmu.sphinx.util.props.PropertySheet; import edu.cmu.sphinx.util.props.S4String; /** * Maps the phones from one phoneset to another to use dictionary from the one * acoustic mode with another one. The mapping file is specified with a mapList * property. The contents should look like * * <pre> * AX AH * IX IH * </pre> */ public class MappingDictionary extends TextDictionary implements Dictionary { @S4String(mandatory = true, defaultValue = "") public static final String PROP_MAP_FILE = "mapFile"; private URL mappingFile; private final Map<String, String> mapping = new HashMap<String, String>(); public MappingDictionary(URL mappingFile, URL wordDictionaryFile, URL fillerDictionaryFile, List<URL> addendaUrlList, String wordReplacement, UnitManager unitManager) { super(wordDictionaryFile, fillerDictionaryFile, addendaUrlList, wordReplacement, unitManager); this.mappingFile = mappingFile; } public MappingDictionary() { } @Override public void newProperties(PropertySheet ps) throws PropertyException { super.newProperties(ps); mappingFile = ConfigurationManagerUtils.getResource(PROP_MAP_FILE, ps); } /* * (non-Javadoc) * * @see edu.cmu.sphinx.linguist.dictionary.Dictionary#allocate() */ @Override public void allocate() throws IOException { super.allocate(); if (!mappingFile.getFile().equals("")) loadMapping(mappingFile.openStream()); } /** * Gets a context independent unit. There should only be one instance of any * CI unit * * * the name of the unit * * if true, the unit is a filler unit * * @return the unit */ @Override protected Unit getCIUnit(String name, boolean isFiller) { if (mapping.containsKey(name)) { name = mapping.get(name); } return unitManager.getUnit(name, isFiller, Context.EMPTY_CONTEXT); } protected void loadMapping(InputStream inputStream) throws IOException { InputStreamReader isr = new InputStreamReader(inputStream); BufferedReader br = new BufferedReader(isr); String line; while ((line = br.readLine()) != null) { StringTokenizer st = new StringTokenizer(line); if (st.countTokens() != 2) { throw new IOException("Wrong file format"); } mapping.put(st.nextToken(), st.nextToken()); } br.close(); isr.close(); inputStream.close(); } }