annotate src/Main/AIMCopy_SSI_Features_v4_PZFC.cc @ 611:0fbaf443ec82

Carfac C++ revision 3, indluding more style improvements. The output structs are now classes again, and have separate storage methods for each output structure along with flags in the Run and RunSegment methods to allow for only storing NAPs if desired.
author alexbrandmeyer
date Fri, 17 May 2013 19:52:45 +0000
parents c5f5e9569863
children
rev   line source
tomwalters@44 1 // Copyright 2008-2010, Thomas Walters
tomwalters@44 2 //
tomwalters@44 3 // AIM-C: A C++ implementation of the Auditory Image Model
tomwalters@44 4 // http://www.acousticscale.org/AIMC
tomwalters@44 5 //
tomwalters@45 6 // Licensed under the Apache License, Version 2.0 (the "License");
tomwalters@45 7 // you may not use this file except in compliance with the License.
tomwalters@45 8 // You may obtain a copy of the License at
tomwalters@44 9 //
tomwalters@45 10 // http://www.apache.org/licenses/LICENSE-2.0
tomwalters@44 11 //
tomwalters@45 12 // Unless required by applicable law or agreed to in writing, software
tomwalters@45 13 // distributed under the License is distributed on an "AS IS" BASIS,
tomwalters@45 14 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
tomwalters@45 15 // See the License for the specific language governing permissions and
tomwalters@45 16 // limitations under the License.
tomwalters@44 17
tomwalters@44 18 /*!
tomwalters@44 19 * \file AIMCopy.cpp
tomwalters@44 20 * \brief AIM-C replacement for HTK's HCopy
tomwalters@44 21 *
tomwalters@44 22 * The following subset of the command-line flags
tomwalters@44 23 * should be implemented from HCopy:
tomwalters@44 24 * -A Print command line arguments off
tomwalters@44 25 * -C cf Set config file to cf default
tomwalters@44 26 * (should be able to take multiple config files)
tomwalters@44 27 * -S f Set script file to f none
tomwalters@44 28 * //! \todo -T N Set trace flags to N 0
tomwalters@44 29 * -V Print version information off
tomwalters@44 30 * -D of Write configuration data to of none
tomwalters@44 31 *
tomwalters@44 32 * \author Thomas Walters <tom@acousticscale.org>
tomwalters@44 33 * \date created 2008/05/08
tomwalters@44 34 * \version \$Id$
tomwalters@44 35 */
tomwalters@44 36
tomwalters@44 37 #include <fstream>
tomwalters@44 38 #include <iostream>
tomwalters@44 39 #include <string>
tomwalters@44 40 #include <utility>
tomwalters@44 41 #include <vector>
tomwalters@44 42
tomwalters@44 43 #include <stdlib.h>
tomwalters@44 44 #include <time.h>
tomwalters@44 45
tomwalters@44 46 #include "Modules/Input/ModuleFileInput.h"
tomwalters@44 47 #include "Modules/BMM/ModuleGammatone.h"
tomwalters@44 48 #include "Modules/BMM/ModulePZFC.h"
tomwalters@44 49 #include "Modules/NAP/ModuleHCL.h"
tomwalters@44 50 #include "Modules/Strobes/ModuleParabola.h"
tomwalters@44 51 #include "Modules/Strobes/ModuleLocalMax.h"
tomwalters@44 52 #include "Modules/SAI/ModuleSAI.h"
tomwalters@44 53 #include "Modules/SSI/ModuleSSI.h"
tomwalters@44 54 #include "Modules/SNR/ModuleNoise.h"
tomwalters@44 55 #include "Modules/Profile/ModuleSlice.h"
tomwalters@44 56 #include "Modules/Profile/ModuleScaler.h"
tomwalters@44 57 #include "Modules/Features/ModuleGaussians.h"
tomwalters@44 58 #include "Modules/Output/FileOutputHTK.h"
tomwalters@44 59 #include "Support/Common.h"
tomwalters@44 60 #include "Support/FileList.h"
tomwalters@44 61 #include "Support/Parameters.h"
tomwalters@44 62
tomwalters@44 63 using std::ofstream;
tomwalters@44 64 using std::pair;
tomwalters@44 65 using std::vector;
tomwalters@44 66 using std::string;
tomwalters@44 67 int main(int argc, char* argv[]) {
tomwalters@44 68 string sound_file;
tomwalters@44 69 string data_file;
tomwalters@44 70 string config_file;
tomwalters@44 71 string script_file;
tomwalters@44 72 bool write_data = false;
tomwalters@44 73 bool print_version = false;
tomwalters@44 74
tomwalters@44 75 string version_string(
tomwalters@44 76 " AIM-C AIMCopy\n"
tomwalters@44 77 " (c) 2006-2010, Thomas Walters and Willem van Engen\n"
tomwalters@44 78 " http://www.acoustiscale.org/AIMC/\n"
tomwalters@44 79 "\n");
tomwalters@44 80
tomwalters@44 81 if (argc < 2) {
tomwalters@44 82 printf("%s", version_string.c_str());
tomwalters@44 83 printf("AIMCopy is intended as a drop-in replacement for HTK's HCopy\n");
tomwalters@44 84 printf("command. It is used for making features from audio files for\n");
tomwalters@44 85 printf("use with HTK.\n");
tomwalters@44 86 printf("Usage: \n");
tomwalters@44 87 printf(" -A Print command line arguments off\n");
tomwalters@44 88 printf(" -C cf Set config file to cf none\n");
tomwalters@44 89 printf(" -S f Set script file to f none\n");
tomwalters@44 90 printf(" -V Print version information off\n");
tomwalters@44 91 printf(" -D g Write configuration data to g none\n");
tomwalters@44 92 return -1;
tomwalters@44 93 }
tomwalters@44 94
tomwalters@44 95 // Parse command-line arguments
tomwalters@44 96 for (int i = 1; i < argc; i++) {
tomwalters@44 97 if (strcmp(argv[i],"-A") == 0) {
tomwalters@44 98 for (int j = 0; j < argc; j++)
tomwalters@44 99 printf("%s ",argv[j]);
tomwalters@44 100 printf("\n");
tomwalters@44 101 fflush(stdout);
tomwalters@44 102 continue;
tomwalters@44 103 }
tomwalters@44 104 if (strcmp(argv[i],"-C") == 0) {
tomwalters@44 105 if (++i >= argc) {
tomwalters@44 106 aimc::LOG_ERROR(_T("Configuration file name expected after -C"));
tomwalters@44 107 return(-1);
tomwalters@44 108 }
tomwalters@44 109 config_file = argv[i];
tomwalters@44 110 continue;
tomwalters@44 111 }
tomwalters@44 112 if (strcmp(argv[i],"-S") == 0) {
tomwalters@44 113 if (++i >= argc) {
tomwalters@44 114 aimc::LOG_ERROR(_T("Script file name expected after -S"));
tomwalters@44 115 return(-1);
tomwalters@44 116 }
tomwalters@44 117 script_file = argv[i];
tomwalters@44 118 continue;
tomwalters@44 119 }
tomwalters@44 120 if (strcmp(argv[i],"-D") == 0) {
tomwalters@44 121 if (++i >= argc) {
tomwalters@44 122 aimc::LOG_ERROR(_T("Data file name expected after -D"));
tomwalters@44 123 return(-1);
tomwalters@44 124 }
tomwalters@44 125 data_file = argv[i];
tomwalters@44 126 write_data = true;
tomwalters@44 127 continue;
tomwalters@44 128 }
tomwalters@44 129 if (strcmp(argv[i],"-V") == 0) {
tomwalters@44 130 print_version = true;
tomwalters@44 131 continue;
tomwalters@44 132 }
tomwalters@44 133 aimc::LOG_ERROR(_T("Unrecognized command-line argument: %s"), argv[i]);
tomwalters@44 134 }
tomwalters@44 135
tomwalters@44 136 if (print_version)
tomwalters@44 137 printf("%s", version_string.c_str());
tomwalters@44 138
tomwalters@44 139 aimc::Parameters params;
tomwalters@44 140
tomwalters@44 141 if (!params.Load(config_file.c_str())) {
tomwalters@44 142 aimc::LOG_ERROR(_T("Couldn't load parameters from file %s"),
tomwalters@44 143 config_file.c_str());
tomwalters@44 144 return -1;
tomwalters@44 145 }
tomwalters@44 146
tomwalters@44 147 vector<pair<string, string> > file_list = aimc::FileList::Load(script_file);
tomwalters@44 148 if (file_list.size() == 0) {
tomwalters@44 149 aimc::LOG_ERROR("No data read from file %s", script_file.c_str());
tomwalters@44 150 return -1;
tomwalters@44 151 }
tomwalters@44 152
tomwalters@44 153 // Set up AIM-C processor here
tomwalters@44 154 aimc::ModuleFileInput input(&params);
tomwalters@44 155 //aimc::ModuleNoise noise_maker(&params);
tomwalters@44 156 aimc::ModulePZFC bmm(&params);
tomwalters@44 157 aimc::ModuleHCL nap(&params);
tomwalters@44 158 aimc::ModuleLocalMax strobes(&params);
tomwalters@44 159 aimc::ModuleSAI sai(&params);
tomwalters@44 160 params.SetBool("ssi.pitch_cutoff", false);
tomwalters@44 161 aimc::ModuleSSI ssi_no_cutoff(&params);
tomwalters@44 162
tomwalters@44 163 params.SetBool("ssi.pitch_cutoff", true);
tomwalters@44 164 params.SetFloat("ssi.pitch_search_start_ms", 4.6f);
tomwalters@44 165 aimc::ModuleSSI ssi_cutoff(&params);
tomwalters@44 166
tomwalters@44 167 params.SetBool("slice.all", false);
tomwalters@44 168 params.SetInt("slice.lower_index", 77);
tomwalters@44 169 params.SetInt("slice.upper_index", 150);
tomwalters@44 170 aimc::ModuleSlice slice_ssi_slice_1_no_cutoff(&params);
tomwalters@44 171 aimc::ModuleSlice slice_ssi_slice_1_cutoff(&params);
tomwalters@44 172
tomwalters@44 173 params.SetBool("slice.all", true);
tomwalters@44 174 aimc::ModuleSlice slice_ssi_all_no_cutoff(&params);
tomwalters@44 175 aimc::ModuleSlice slice_ssi_all_cutoff(&params);
tomwalters@44 176
tomwalters@44 177 params.SetFloat("nap.lowpass_cutoff", 100.0);
tomwalters@44 178 aimc::ModuleHCL smooth_nap(&params);
tomwalters@44 179 params.SetBool("slice.all", true);
tomwalters@44 180 aimc::ModuleSlice nap_profile(&params);
tomwalters@44 181 aimc::ModuleScaler nap_scaler(&params);
tomwalters@44 182
tomwalters@44 183 aimc::ModuleGaussians nap_features(&params);
tomwalters@44 184 aimc::ModuleGaussians features_ssi_slice1_no_cutoff(&params);
tomwalters@44 185 aimc::ModuleGaussians features_ssi_slice1_cutoff(&params);
tomwalters@44 186 aimc::ModuleGaussians features_ssi_all_no_cutoff(&params);
tomwalters@44 187 aimc::ModuleGaussians features_ssi_all_cutoff(&params);
tomwalters@44 188
tomwalters@44 189 aimc::FileOutputHTK nap_out(&params);
tomwalters@44 190 aimc::FileOutputHTK output_ssi_slice1_no_cutoff(&params);
tomwalters@44 191 aimc::FileOutputHTK output_ssi_slice1_cutoff(&params);
tomwalters@44 192 aimc::FileOutputHTK output_ssi_all_no_cutoff(&params);
tomwalters@44 193 aimc::FileOutputHTK output_ssi_all_cutoff(&params);
tomwalters@44 194
tomwalters@44 195 input.AddTarget(&bmm);
tomwalters@44 196 //noise_maker.AddTarget(&bmm);
tomwalters@44 197 bmm.AddTarget(&nap);
tomwalters@44 198 bmm.AddTarget(&smooth_nap);
tomwalters@44 199 smooth_nap.AddTarget(&nap_profile);
tomwalters@44 200 nap_profile.AddTarget(&nap_scaler);
tomwalters@44 201 nap_scaler.AddTarget(&nap_features);
tomwalters@44 202 nap_features.AddTarget(&nap_out);
tomwalters@44 203
tomwalters@44 204 nap.AddTarget(&strobes);
tomwalters@44 205 strobes.AddTarget(&sai);
tomwalters@44 206 sai.AddTarget(&ssi_no_cutoff);
tomwalters@44 207 sai.AddTarget(&ssi_cutoff);
tomwalters@44 208
tomwalters@44 209 ssi_no_cutoff.AddTarget(&slice_ssi_slice_1_no_cutoff);
tomwalters@44 210 ssi_no_cutoff.AddTarget(&slice_ssi_all_no_cutoff);
tomwalters@44 211 ssi_cutoff.AddTarget(&slice_ssi_slice_1_cutoff);
tomwalters@44 212 ssi_cutoff.AddTarget(&slice_ssi_all_cutoff);
tomwalters@44 213
tomwalters@44 214 slice_ssi_slice_1_no_cutoff.AddTarget(&features_ssi_slice1_no_cutoff);
tomwalters@44 215 slice_ssi_all_no_cutoff.AddTarget(&features_ssi_all_no_cutoff);
tomwalters@44 216 slice_ssi_slice_1_cutoff.AddTarget(&features_ssi_slice1_cutoff);
tomwalters@44 217 slice_ssi_all_cutoff.AddTarget(&features_ssi_all_cutoff);
tomwalters@44 218
tomwalters@44 219
tomwalters@44 220 features_ssi_slice1_no_cutoff.AddTarget(&output_ssi_slice1_no_cutoff);
tomwalters@44 221 features_ssi_all_no_cutoff.AddTarget(&output_ssi_all_no_cutoff);
tomwalters@44 222 features_ssi_slice1_cutoff.AddTarget(&output_ssi_slice1_cutoff);
tomwalters@44 223 features_ssi_all_cutoff.AddTarget(&output_ssi_all_cutoff);
tomwalters@44 224
tomwalters@44 225
tomwalters@44 226 if (write_data) {
tomwalters@44 227 ofstream outfile(data_file.c_str());
tomwalters@44 228 if (outfile.fail()) {
tomwalters@44 229 aimc::LOG_ERROR("Couldn't open data file %s for writing",
tomwalters@44 230 data_file.c_str());
tomwalters@44 231 return -1;
tomwalters@44 232 }
tomwalters@44 233 time_t rawtime;
tomwalters@44 234 struct tm * timeinfo;
tomwalters@44 235 time(&rawtime);
tomwalters@44 236 timeinfo = localtime(&rawtime);
tomwalters@44 237
tomwalters@44 238
tomwalters@44 239 outfile << "# AIM-C AIMCopy\n";
tomwalters@44 240 outfile << "# Run on: " << asctime(timeinfo);
tomwalters@44 241 char * descr = getenv("USER");
tomwalters@44 242 if (descr) {
tomwalters@44 243 outfile << "# By user: " << descr <<"\n";
tomwalters@44 244 }
tomwalters@44 245 outfile << "#Module chain: ";
tomwalters@44 246 outfile << "# ";
tomwalters@44 247 outfile << "# Module versions:\n";
tomwalters@44 248 outfile << "# " << input.id() << " : " << input.version() << "\n";
tomwalters@44 249 outfile << "# " << bmm.id() << " : " << bmm.version() << "\n";
tomwalters@44 250 outfile << "# " << nap.id() << " : " << nap.version() << "\n";
tomwalters@44 251 outfile << "# " << strobes.id() << " : " << strobes.version() << "\n";
tomwalters@44 252 outfile << "# " << sai.id() << " : " << sai.version() << "\n";
tomwalters@44 253 outfile << "#\n";
tomwalters@44 254 outfile << "# Parameters:\n";
tomwalters@44 255 outfile << params.WriteString();
tomwalters@44 256 outfile.close();
tomwalters@44 257 }
tomwalters@44 258
tomwalters@44 259 for (unsigned int i = 0; i < file_list.size(); ++i) {
tomwalters@44 260 // aimc::LOG_INFO(_T("In: %s"), file_list[i].first.c_str());
tomwalters@44 261 aimc::LOG_INFO(_T("Out: %s"), file_list[i].second.c_str());
tomwalters@44 262
tomwalters@44 263 string filename = file_list[i].second + ".slice_1_no_cutoff";
tomwalters@44 264 output_ssi_slice1_no_cutoff.OpenFile(filename.c_str(), 10.0f);
tomwalters@44 265 filename = file_list[i].second + ".ssi_profile_no_cutoff";
tomwalters@44 266 output_ssi_all_no_cutoff.OpenFile(filename.c_str(), 10.0f);
tomwalters@44 267 filename = file_list[i].second + ".slice_1_cutoff";
tomwalters@44 268 output_ssi_slice1_cutoff.OpenFile(filename.c_str(), 10.0f);
tomwalters@44 269 filename = file_list[i].second + ".ssi_profile_cutoff";
tomwalters@44 270 output_ssi_all_cutoff.OpenFile(filename.c_str(), 10.0f);
tomwalters@44 271 filename = file_list[i].second + ".smooth_nap_profile";
tomwalters@44 272 nap_out.OpenFile(filename.c_str(), 10.0f);
tomwalters@44 273
tomwalters@44 274 if (input.LoadFile(file_list[i].first.c_str())) {
tomwalters@44 275 input.Process();
tomwalters@44 276 } else {
tomwalters@44 277 printf("LoadFile failed for file %s\n", file_list[i].first.c_str());
tomwalters@44 278 }
tomwalters@44 279 input.Reset();
tomwalters@44 280 }
tomwalters@44 281
tomwalters@44 282 return 0;
tomwalters@44 283 }