/** * Copyright 2004-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 <http://www.gnu.org/licenses/>. * */ package marytts.signalproc.analysis; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.UnsupportedAudioFileException; import marytts.util.data.audio.AudioDoubleDataSource; import marytts.util.io.MaryRandomAccessFile; import marytts.util.signal.SignalProcUtils; /** * A class that extracts frame based root-mean-square (RMS) energy contour * * @author Oytun Türk */ public class EnergyContourRms { public EnergyFileHeader header; public double[] contour; public EnergyContourRms() throws IOException { this(null); } public EnergyContourRms(String wavFile) throws IOException { this(wavFile, null); } public EnergyContourRms(String wavFile, String energyFile) throws IOException { this(wavFile, energyFile, EnergyFileHeader.DEFAULT_WINDOW_SIZE, EnergyFileHeader.DEFAULT_SKIP_SIZE); } public EnergyContourRms(String wavFileIn, double windowSizeInSecondsIn, double skipSizeInSecondsIn) throws IOException { this(wavFileIn, null, windowSizeInSecondsIn, skipSizeInSecondsIn); } public EnergyContourRms(String wavFileIn, String energyFileOut, double windowSizeInSecondsIn, double skipSizeInSecondsIn) throws IOException { header = new EnergyFileHeader(); header.windowSizeInSeconds = windowSizeInSecondsIn; header.skipSizeInSeconds = skipSizeInSecondsIn; if (wavFileIn != null) { AudioInputStream inputAudio = null; try { inputAudio = AudioSystem.getAudioInputStream(new File(wavFileIn)); } catch (UnsupportedAudioFileException e) { throw new IOException("Unsupported audio file: " + wavFileIn); } if (inputAudio != null) { header.samplingRate = (int) inputAudio.getFormat().getSampleRate(); AudioDoubleDataSource signal = new AudioDoubleDataSource(inputAudio); contour = SignalProcUtils.getEnergyContourRms(signal.getAllData(), header.windowSizeInSeconds, header.skipSizeInSeconds, header.samplingRate); header.totalFrames = contour.length; if (energyFileOut != null && energyFileOut != null) { WriteEnergyFile(this, energyFileOut); } } } } public static void WriteEnergyFile(EnergyContourRms en, String energyFile) throws IOException { if (en.contour != null) { en.header.totalFrames = en.contour.length; MaryRandomAccessFile ler = null; try { ler = new MaryRandomAccessFile(energyFile, "rw"); } catch (FileNotFoundException e) { throw new IOException("File not found: " + energyFile); } en.header.write(ler); ler.writeDouble(en.contour); ler.close(); } } public static EnergyContourRms ReadEnergyFile(String energyFile) throws IOException { EnergyContourRms en = null; MaryRandomAccessFile ler = null; try { ler = new MaryRandomAccessFile(energyFile, "r"); } catch (FileNotFoundException e) { throw new IOException("File not found: " + energyFile); } en = new EnergyContourRms(); en.header.read(ler, true); en.contour = ler.readDouble(en.header.totalFrames); ler.close(); return en; } }