All Downloads are FREE. Search and download functionalities are using the official Maven repository.

marytts.tools.emospeak.EmoTransformer Maven / Gradle / Ivy

The newest version!
/**
 * Copyright 2000-2006 DFKI GmbH.
 * All Rights Reserved.  Use is subject to license terms.
 *
 * This file is part of MARY TTS.
 *
 * MARY TTS is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, version 3 of the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see .
 *
 */
package marytts.tools.emospeak;

import java.util.Locale;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerConfigurationException;

import marytts.util.MaryUtils;

/**
 * 
 * @author Marc Schröder
 */
public class EmoTransformer extends Thread {
	private int r;
	private ProsodyXMLDisplayer emoSpeak;

	private javax.xml.transform.TransformerFactory tFactory = null;
	private javax.xml.transform.Templates stylesheet = null;
	private javax.xml.transform.Transformer transformer = null;
	private javax.xml.parsers.DocumentBuilderFactory dbFactory = null;
	private javax.xml.parsers.DocumentBuilder docBuilder = null;

	private org.w3c.dom.Document emotionDocument = null;

	private boolean inputAvailable = false;
	private int activation;
	private int evaluation;
	private int power;
	private String text;
	private String maryxmlString;
	private Locale locale;

	private boolean exitRequested = false;

	/**
	 * Creates new EmoTransformer
	 * 
	 * @param emoSpeak
	 *            emoSpeak
	 * @throws TransformerConfigurationException
	 *             TransformerConfigurationException
	 * @throws ParserConfigurationException
	 *             ParserConfigurationException
	 */
	public EmoTransformer(ProsodyXMLDisplayer emoSpeak) throws TransformerConfigurationException, ParserConfigurationException {
		this.emoSpeak = emoSpeak;
		// Try to find a suitable XSLT transformer
		tFactory = javax.xml.transform.TransformerFactory.newInstance();
		/*
		 * if (false && tFactory instanceof org.apache.xalan.processor.TransformerFactoryImpl) { Hashtable xalanEnv = (new
		 * org.apache.xalan.xslt.EnvironmentCheck()).getEnvironmentHash(); String xalan2Version = (String)
		 * xalanEnv.get("version.xalan2x"); if (xalan2Version == null || xalan2Version.equals("")) xalan2Version = (String)
		 * xalanEnv.get("version.xalan2"); if (xalan2Version != null && !xalan2Version.equals("")) System.err.println("Using " +
		 * xalan2Version); } else {
		 */
		System.err.println("Using XSL processor " + tFactory.getClass().getName());
		// }
		javax.xml.transform.stream.StreamSource stylesheetStream = new javax.xml.transform.stream.StreamSource(
				EmoTransformer.class.getResourceAsStream("emotion-to-mary.xsl"));
		stylesheet = tFactory.newTemplates(stylesheetStream);
		dbFactory = javax.xml.parsers.DocumentBuilderFactory.newInstance();
		dbFactory.setNamespaceAware(true);
		docBuilder = dbFactory.newDocumentBuilder();
		transformer = stylesheet.newTransformer();

	}

	/**
	 * Asynchronously set the latest emotion values. Overwrites any previous, unprocessed data.
	 * 
	 * @param activation
	 *            activation
	 * @param evaluation
	 *            evaluation
	 * @param power
	 *            power
	 * @param text
	 *            text
	 * @param locale
	 *            locale
	 * @param r
	 *            r
	 */
	public synchronized void setEmotionValues(int activation, int evaluation, int power, String text, Locale locale, int r) {
		this.activation = activation;
		this.evaluation = evaluation;
		this.power = power;
		this.text = text;
		this.locale = locale;
		inputAvailable = true;
		this.r = r;
		notifyAll();
	}

	public synchronized void requestExit() {
		exitRequested = true;
		notifyAll();
	}

	private void createEmotionDocument() {
		emotionDocument = docBuilder.getDOMImplementation().createDocument(null, "emotion", null);
		org.w3c.dom.Element e = emotionDocument.getDocumentElement();
		e.setAttributeNS("http://www.w3.org/XML/1998/namespace", "lang", MaryUtils.locale2xmllang(locale));
		e.setAttribute("activation", String.valueOf(activation));
		e.setAttribute("evaluation", String.valueOf(evaluation));
		e.setAttribute("power", String.valueOf(power));
		e.appendChild(emotionDocument.createTextNode(text));
	}

	private void transformToMaryXML() throws javax.xml.transform.TransformerException {
		javax.xml.transform.dom.DOMSource domSource = new javax.xml.transform.dom.DOMSource(emotionDocument);
		java.io.StringWriter sw = new java.io.StringWriter();
		javax.xml.transform.stream.StreamResult streamResult = new javax.xml.transform.stream.StreamResult(sw);
		transformer.transform(domSource, streamResult);
		maryxmlString = sw.toString();
	}

	private synchronized void doWait() {
		try {
			wait();
		} catch (InterruptedException e) {
		}
	}

	public void run() {
		while (!exitRequested) {
			if (inputAvailable) {
				inputAvailable = false;
				try {
					int r1 = r;
					System.err.println("EmoTransformer about to process request no. " + r1);
					createEmotionDocument();
					transformToMaryXML();
					System.err.println("EmoTransformer has processed.");
					emoSpeak.updateProsodyXML(maryxmlString, r1);
				} catch (javax.xml.transform.TransformerException e) {
					e.printStackTrace();
				}
			} else {
				doWait();
				System.err.println("EmoTransformer waking up from wait.");
			}
		}
		System.err.println("EmoTransformer exiting.");
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy