marytts.tools.voiceimport.HMMVoiceFeatureSelection Maven / Gradle / Ivy
The newest version!
/**
* Copyright 2009 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.voiceimport;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;
import java.util.SortedMap;
import java.util.TreeMap;
import javax.swing.JButton;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class HMMVoiceFeatureSelection extends VoiceImportComponent {
// protected File hmmFeatureFile11;
protected String features;
protected String locale;
protected boolean success = true;
protected DatabaseLayout db = null;
public String HMMFEATUREFILE = "HMMVoiceFeatureSelection.hmmFeatureFile";
public String FEATUREFILE = "HMMVoiceFeatureSelection.featureFile";
public String getName() {
return "HMMVoiceFeatureSelection";
}
@Override
protected void initialiseComp() {
locale = db.getProp(db.LOCALE);
}
public SortedMap getDefaultProps(DatabaseLayout theDb) {
this.db = theDb;
if (props == null) {
props = new TreeMap();
props.put(HMMFEATUREFILE, db.getProp(DatabaseLayout.CONFIGDIR) + "hmmFeatures.txt");
props.put(FEATUREFILE, db.getProp(DatabaseLayout.CONFIGDIR) + "features.txt");
}
return props;
}
protected void setupHelp() {
props2Help = new TreeMap();
props2Help
.put(HMMFEATUREFILE,
"file containing the extra features, appart from phone and phonological, that will be used to train the HMMs."
+ " The file will be created by reading mary/features.txt, normally hmmFeatures.txt is a subset of features.txt. "
+ " Delete the features that will no be used to train the HMMs. When running this program "
+ " a small set will be presented on top, (pos_in_syl, syl_break, prev_syl_break, position_type) separated by an empty line, "
+ " if you are not sure about using other features, use just these and delete the others.");
props2Help.put(FEATUREFILE,
"file containing the list of features used to create the phonefeatures, this file should had been created "
+ "with the FeatureSelection component.");
}
protected void saveFeatures(String newFeatures) {
File hmmFeatureFile = new File(getProp(HMMFEATUREFILE));
System.out.println("Saving extra features for training HMMs to " + hmmFeatureFile.getAbsolutePath());
features = newFeatures;
/*
* if (!features.contains(PhoneUnitFeatureComputer.PHONEFEATURE)) { JOptionPane.showMessageDialog(null,
* "The features '"+PhoneUnitFeatureComputer.PHONEFEATURE
* +"' is not present.\nThis will lead to problems in the further processing.", "Important feature missing",
* JOptionPane.WARNING_MESSAGE); }
*/
try {
PrintWriter pw = new PrintWriter(hmmFeatureFile, "UTF-8");
pw.println(features);
pw.close();
} catch (IOException e) {
System.err.println("Cannot save features:");
e.printStackTrace();
success = false;
}
}
protected void setSuccess(boolean val) {
success = val;
}
public boolean compute() throws IOException {
features = loadFeatureList();
if (!features.contentEquals("")) {
features = features.replaceAll(" ", "\n");
features = features.replaceFirst("unit_duration", "");
features = features.replaceFirst("unit_logf0delta", "");
features = features.replaceFirst("unit_logf0", "");
}
final JFrame frame = new JFrame("Extra features for training HMMs");
GridBagLayout gridBagLayout = new GridBagLayout();
GridBagConstraints gridC = new GridBagConstraints();
frame.getContentPane().setLayout(gridBagLayout);
final JEditorPane editPane = new JEditorPane();
editPane.setPreferredSize(new Dimension(500, 500));
editPane.setText(features);
JButton saveButton = new JButton("Save");
saveButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setSuccess(true);
frame.setVisible(false);
}
});
JButton cancelButton = new JButton("Cancel");
cancelButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setSuccess(false);
frame.setVisible(false);
}
});
gridC.gridx = 0;
gridC.gridy = 0;
// resize scroll pane:
gridC.weightx = 1;
gridC.weighty = 1;
gridC.fill = GridBagConstraints.HORIZONTAL;
JScrollPane scrollPane = new JScrollPane(editPane);
scrollPane.setPreferredSize(editPane.getPreferredSize());
gridBagLayout.setConstraints(scrollPane, gridC);
frame.getContentPane().add(scrollPane);
gridC.gridy = 1;
// do not resize buttons:
gridC.weightx = 0;
gridC.weighty = 0;
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new FlowLayout());
buttonPanel.add(saveButton);
buttonPanel.add(cancelButton);
gridBagLayout.setConstraints(buttonPanel, gridC);
frame.getContentPane().add(buttonPanel);
frame.pack();
frame.setVisible(true);
do {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
}
} while (frame.isVisible());
frame.dispose();
if (success) {
try {
saveFeatures(editPane.getText());
} catch (Exception ex) {
ex.printStackTrace();
throw new Error("Error defining replacements");
}
}
return success;
}
private String loadFeatureList() throws IOException {
String featureList = "";
String recommendedFeatureList = "";
Scanner feaList = null;
try {
feaList = new Scanner(new BufferedReader(new FileReader(getProp(FEATUREFILE))));
String line;
while (feaList.hasNext()) {
line = feaList.nextLine();
// Exclude phone and phonological, those are by default used in makeLabes and makeQuestions
// Also exclude the halfphone features not used in HMM voices
if (!(line.contains("_vc") || line.contains("_vlng") || line.contains("_vheight") || line.contains("_vfront")
|| line.contains("_vrnd") || line.contains("_ctype") || line.contains("_cplace")
|| line.contains("_cvox") || line.contains("_phone") || line.contains("ph_")
|| line.contains("halfphone_") || line.contentEquals("phone"))) {
featureList += line + " ";
}
}
if (feaList != null) {
feaList.close();
}
} catch (FileNotFoundException e) {
throw new FileNotFoundException();
}
return featureList;
}
/**
* Provide the progress of computation, in percent, or -1 if that feature is not implemented.
*
* @return -1 if not implemented, or an integer between 0 and 100.
*/
public int getProgress() {
return -1;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy