/** * Copyright 2007 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 marytts.util.io.BasenameList; import marytts.util.io.FileUtils; import marytts.util.io.MaryRandomAccessFile; import marytts.util.string.StringUtils; /** * Converts binary MFCC files in raw SPTK format into Mary MFCC file format with header * * @author Oytun Türk */ public class MfccRaw2MfccConverter { public static void convertFolder(String folder, String rawMfccFileExtension, String outputMfccFileExtension, int dimension, int samplingRateInHz, float windowSizeInSeconds, float skipSizeInSeconds) { folder = StringUtils.checkLastSlash(folder); BasenameList b = new BasenameList(folder, rawMfccFileExtension); String rawMfccFile; String outputMfccFile; int numFiles = b.getListAsVector().size(); for (int i = 0; i < numFiles; i++) { rawMfccFile = folder + b.getName(i) + rawMfccFileExtension; outputMfccFile = StringUtils.modifyExtension(rawMfccFile, outputMfccFileExtension); rawFile2mfccFile(rawMfccFile, outputMfccFile, dimension, samplingRateInHz, windowSizeInSeconds, skipSizeInSeconds); System.out.println("Converted MFCC file " + String.valueOf(i + 1) + " of " + String.valueOf(numFiles)); } } public static void rawFile2mfccFile(String rawFile, String mfccFile, int dimension, int samplingRateInHz, float windowSizeInSeconds, float skipSizeInSeconds) { Mfccs m = readRawMfccFile(rawFile, dimension); m.params.samplingRate = samplingRateInHz; m.params.skipsize = skipSizeInSeconds; m.params.winsize = windowSizeInSeconds; m.writeMfccFile(mfccFile); } // This version is for reading SPTK files that have no header // The header is created from user specified information public static Mfccs readRawMfccFile(String rawMfccFile, int dimension) { MfccFileHeader params = new MfccFileHeader(); File f = new File(rawMfccFile); long fileSize = f.length(); int numfrm = (int) (fileSize / (4.0 * dimension)); Mfccs m = new Mfccs(numfrm, dimension); params.numfrm = numfrm; params.dimension = dimension; if (rawMfccFile != "" && FileUtils.exists(rawMfccFile)) { MaryRandomAccessFile stream = null; try { stream = new MaryRandomAccessFile(rawMfccFile, "rw"); } catch (FileNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } if (stream != null) { try { Mfccs.readMfccsFromFloat(stream, params, m.mfccs); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { stream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return m; } /** * @param args * args */ public static void main(String[] args) { String folder; String rawMfccFileExtension = ".mgc"; String outputMfccFileExtension = ".mfc"; int dimension = 25; int samplingRateInHz = 16000; float windowSizeInSeconds = 0.040f; // 400 samples float skipSizeInSeconds = 0.005f; // 80 samples String baseFolder; /* * baseFolder = "D:/Oytun/DFKI/voices/hmmVoiceConversionTest/hsmmMfccRaw_25Dimensional/"; folder = baseFolder + * "hmm_gen_parameters"; MfccRaw2MfccConverter.convertFolder(folder, rawMfccFileExtension, outputMfccFileExtension, * dimension, samplingRateInHz, windowSizeInSeconds, skipSizeInSeconds); * * folder = baseFolder + "original_parameters"; MfccRaw2MfccConverter.convertFolder(folder, rawMfccFileExtension, * outputMfccFileExtension, dimension, samplingRateInHz, windowSizeInSeconds, skipSizeInSeconds); * * folder = baseFolder + "test/hmm_gen_parameters"; MfccRaw2MfccConverter.convertFolder(folder, rawMfccFileExtension, * outputMfccFileExtension, dimension, samplingRateInHz, windowSizeInSeconds, skipSizeInSeconds); * * folder = baseFolder + "test/original_parameters"; MfccRaw2MfccConverter.convertFolder(folder, rawMfccFileExtension, * outputMfccFileExtension, dimension, samplingRateInHz, windowSizeInSeconds, skipSizeInSeconds); */ dimension = 21; baseFolder = "D:/Oytun/DFKI/voices/hmmVoiceConversionTest/lspRaw_21Dimensional/"; folder = baseFolder + "hmm_gen_parameters"; MfccRaw2MfccConverter.convertFolder(folder, rawMfccFileExtension, outputMfccFileExtension, dimension, samplingRateInHz, windowSizeInSeconds, skipSizeInSeconds); folder = baseFolder + "original_parameters"; MfccRaw2MfccConverter.convertFolder(folder, rawMfccFileExtension, outputMfccFileExtension, dimension, samplingRateInHz, windowSizeInSeconds, skipSizeInSeconds); folder = baseFolder + "test/hmm_gen_parameters"; MfccRaw2MfccConverter.convertFolder(folder, rawMfccFileExtension, outputMfccFileExtension, dimension, samplingRateInHz, windowSizeInSeconds, skipSizeInSeconds); folder = baseFolder + "test/original_parameters"; MfccRaw2MfccConverter.convertFolder(folder, rawMfccFileExtension, outputMfccFileExtension, dimension, samplingRateInHz, windowSizeInSeconds, skipSizeInSeconds); /* * dimension = 21; baseFolder = "D:/Oytun/DFKI/voices/hmmVoiceConversionTest/mellspRaw_21Dimensional/"; folder = * baseFolder + "hmm_gen_parameters"; MfccRaw2MfccConverter.convertFolder(folder, rawMfccFileExtension, * outputMfccFileExtension, dimension, samplingRateInHz, windowSizeInSeconds, skipSizeInSeconds); * * folder = baseFolder + "original_parameters"; MfccRaw2MfccConverter.convertFolder(folder, rawMfccFileExtension, * outputMfccFileExtension, dimension, samplingRateInHz, windowSizeInSeconds, skipSizeInSeconds); * * folder = baseFolder + "test/hmm_gen_parameters"; MfccRaw2MfccConverter.convertFolder(folder, rawMfccFileExtension, * outputMfccFileExtension, dimension, samplingRateInHz, windowSizeInSeconds, skipSizeInSeconds); * * folder = baseFolder + "test/original_parameters"; MfccRaw2MfccConverter.convertFolder(folder, rawMfccFileExtension, * outputMfccFileExtension, dimension, samplingRateInHz, windowSizeInSeconds, skipSizeInSeconds); */ /* * dimension = 25; baseFolder = "D:/Oytun/DFKI/voices/hmmVoiceConversionTest/mfccRaw_25Dimensional/"; folder = baseFolder * + "hmm_train"; MfccRaw2MfccConverter.convertFolder(folder, rawMfccFileExtension, outputMfccFileExtension, dimension, * samplingRateInHz, windowSizeInSeconds, skipSizeInSeconds); * * folder = baseFolder + "hmm_test"; MfccRaw2MfccConverter.convertFolder(folder, rawMfccFileExtension, * outputMfccFileExtension, dimension, samplingRateInHz, windowSizeInSeconds, skipSizeInSeconds); * * folder = baseFolder + "orig_train"; MfccRaw2MfccConverter.convertFolder(folder, rawMfccFileExtension, * outputMfccFileExtension, dimension, samplingRateInHz, windowSizeInSeconds, skipSizeInSeconds); * * folder = baseFolder + "orig_test"; MfccRaw2MfccConverter.convertFolder(folder, rawMfccFileExtension, * outputMfccFileExtension, dimension, samplingRateInHz, windowSizeInSeconds, skipSizeInSeconds); */ } }