⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 diphoneunitselector.java

📁 FreeTTS is a speech synthesis system written entirely in the Java programming language. It is based
💻 JAVA
字号:
/** * Portions Copyright 2001 Sun Microsystems, Inc. * Portions Copyright 1999-2001 Language Technologies Institute,  * Carnegie Mellon University. * 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 com.sun.speech.freetts.diphone;import com.sun.speech.freetts.diphone.Diphone;import com.sun.speech.freetts.relp.Sample;import com.sun.speech.freetts.relp.SampleInfo;import com.sun.speech.freetts.FeatureSet;import com.sun.speech.freetts.Item;import com.sun.speech.freetts.relp.LPCResult;import com.sun.speech.freetts.UtteranceProcessor;import com.sun.speech.freetts.Utterance;import com.sun.speech.freetts.Relation;import com.sun.speech.freetts.ProcessException;import java.util.List;import java.util.Iterator;import java.net.URL;import java.io.IOException;/** * Generates the Unit Relation of an Utterance from the * Segment Relation. */public class DiphoneUnitSelector implements UtteranceProcessor {    // the UnitDatabase to use    private DiphoneUnitDatabase diphoneDatabase;            // The Utterance that this DiphoneUnitSelector works on    // private Utterance utterance;            /**     * Constructs a DiphoneUnitSelector.     *     * @param url the URL for the unit database. If the URL path ends     *     with a '.bin' it is assumed that the DB is a binary database,     *     otherwise, its assumed that its a text database1     *     * @throws IOException if an error occurs while loading the     *     database     *     */    public DiphoneUnitSelector(URL url) throws IOException {	if (url == null) {	    throw new IOException("Can't load unit database");	}	boolean binary = url.getPath().endsWith(".bin");	diphoneDatabase = new DiphoneUnitDatabase(url, binary);    }        /**     * Generates the Unit Relation from the Segment Relation.     *     * @param  utterance  the utterance to generate the Unit Relation     *     * @throws ProcessException if an IOException is thrown during the     *         processing of the utterance     */    public void processUtterance(Utterance utterance) throws ProcessException {	if (utterance.getRelation(Relation.SEGMENT) == null) {	    throw new IllegalStateException		("DiphoneUnitSelector: Segment relation does not exist");	}		utterance.setObject(SampleInfo.UTT_NAME,		diphoneDatabase.getSampleInfo());	createUnitRelation(utterance);    }    /**     * Creates the Unit Relation in the given utterance from     * the diphone units and their some associated information from     * the units database.     *     * @param utterance the utterance that gets the new unit relation     */    private void createUnitRelation(Utterance utterance) {	Item segmentItem0, segmentItem1;	float end0, end1;	int targetEnd;		Item unitItem0, unitItem1;			String diphoneName;	Diphone diphone;				Relation unitRelation = utterance.createRelation(Relation.UNIT);	Relation segmentRelation = utterance.getRelation(Relation.SEGMENT);	for (segmentItem0 = segmentRelation.getHead();		segmentItem0 != null && segmentItem0.getNext() != null;		segmentItem0 = segmentItem1) {	    segmentItem1 = segmentItem0.getNext();	    diphoneName = segmentItem0.getFeatures().getString("name") + "-" +		segmentItem1.getFeatures().getString("name");	    	    // First half of diphone	    end0 = segmentItem0.getFeatures().getFloat("end");	    targetEnd = (int) (end0 * 		    diphoneDatabase.getSampleInfo().getSampleRate());	    unitItem0 = createUnitItem(unitRelation, diphoneName, targetEnd, 1);	    segmentItem0.addDaughter(unitItem0);	    	    // Second half of diphone	    end1 = segmentItem1.getFeatures().getFloat("end");	    targetEnd = (int) (((end0 + end1)/2.0) * 		    	diphoneDatabase.getSampleInfo().getSampleRate());	    unitItem1 = createUnitItem(unitRelation, diphoneName, targetEnd, 2);	    segmentItem1.addDaughter(unitItem1);	}    }    /**     * Returns a new Item (a Unit) in the given Relation, and     * sets the new Item to the given diphone name, target end,     * unit entry (index in the database), and unit part (1 or 2).     *     * @param unitRelation the relation that gets the new item     * @param diphoneName the name of the dipohone     * @param targetEnd the time at the end of this unit     * @param unitPart the item can be in the first(1) or second part (2)     */    private Item createUnitItem(Relation unitRelation,				String diphoneName,				int targetEnd,				int unitPart) {	Diphone diphone = (Diphone) diphoneDatabase.getUnit(diphoneName);	if (diphone == null) {	    System.err.println		("FreeTTS: unit database failed to find entry for: " + 		 diphoneName);	}	Item unit = unitRelation.appendItem();	FeatureSet unitFeatureSet = unit.getFeatures();	unitFeatureSet.setString("name", diphoneName);	unitFeatureSet.setInt("target_end", targetEnd);	unitFeatureSet.setObject("unit", new DiphoneUnit(diphone, unitPart));	// unitFeatureSet.setInt("unit_part", unitPart);	return unit;    }    /**     * Returns a string representation of this object.     *     * @return a string representation of this object     */    public String toString() {	return "DiphoneUnitSelector";    }}/** * A wrapper around the Diphone class that turns the * diphone into a unit */class DiphoneUnit implements com.sun.speech.freetts.Unit {    private Diphone diphone;    private int unitPart;    /**     * Contructs a diphone unit given a diphone and unit part.     *     * @param diphone the diphone to wrap     * @param unitPart which half (1 or 2) does this unit represent     */    public DiphoneUnit(Diphone diphone, int unitPart) {	this.diphone = diphone;	this.unitPart = unitPart;    }    /**     * Returns the name of this Unit.     *     * @return the name of the unit     */    public String getName() {	return diphone.getName();    }    /**     * Returns the size of the unit.     *     * @return the size of the unit     */    public int getSize() {	return diphone.getUnitSize(unitPart);    }    /**     * Retrieves the nearest sample.     *     * @param index the ideal index     *     * @return the nearest Sample     */    public Sample getNearestSample(float index) {    	return diphone.nearestSample(index, unitPart);     }    /**     * Returns a string representation of this object.     *     * @return a string representation of this object     */    public String toString() {	return getName();    }    /**      * Dumps this unit.     */    public void dump()  {	diphone.dump();    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -