annotate src/Main/AIMCopy_SSI_Features_v2.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@40 1 // Copyright 2008-2010, Thomas Walters
tomwalters@40 2 //
tomwalters@40 3 // AIM-C: A C++ implementation of the Auditory Image Model
tomwalters@40 4 // http://www.acousticscale.org/AIMC
tomwalters@40 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@40 9 //
tomwalters@45 10 // http://www.apache.org/licenses/LICENSE-2.0
tomwalters@40 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@40 17
tomwalters@40 18 /*!
tomwalters@40 19 * \file AIMCopy.cpp
tomwalters@40 20 * \brief AIM-C replacement for HTK's HCopy
tomwalters@40 21 *
tomwalters@40 22 * The following subset of the command-line flags
tomwalters@40 23 * should be implemented from HCopy:
tomwalters@40 24 * -A Print command line arguments off
tomwalters@40 25 * -C cf Set config file to cf default
tomwalters@40 26 * (should be able to take multiple config files)
tomwalters@40 27 * -S f Set script file to f none
tomwalters@40 28 * //! \todo -T N Set trace flags to N 0
tomwalters@40 29 * -V Print version information off
tomwalters@40 30 * -D of Write configuration data to of none
tomwalters@40 31 *
tomwalters@40 32 * \author Thomas Walters <tom@acousticscale.org>
tomwalters@40 33 * \date created 2008/05/08
tomwalters@40 34 * \version \$Id$
tomwalters@40 35 */
tomwalters@40 36
tomwalters@40 37 #include <fstream>
tomwalters@40 38 #include <iostream>
tomwalters@40 39 #include <string>
tomwalters@40 40 #include <utility>
tomwalters@40 41 #include <vector>
tomwalters@40 42
tomwalters@40 43 #include <stdlib.h>
tomwalters@40 44 #include <time.h>
tomwalters@40 45
tomwalters@40 46 #include "Modules/Input/ModuleFileInput.h"
tomwalters@40 47 #include "Modules/BMM/ModuleGammatone.h"
tomwalters@40 48 #include "Modules/BMM/ModulePZFC.h"
tomwalters@40 49 #include "Modules/NAP/ModuleHCL.h"
tomwalters@40 50 #include "Modules/Strobes/ModuleParabola.h"
tomwalters@40 51 #include "Modules/Strobes/ModuleLocalMax.h"
tomwalters@40 52 #include "Modules/SAI/ModuleSAI.h"
tomwalters@40 53 #include "Modules/SSI/ModuleSSI.h"
tomwalters@40 54 #include "Modules/SNR/ModuleNoise.h"
tomwalters@40 55 #include "Modules/Profile/ModuleSlice.h"
tomwalters@40 56 #include "Modules/Profile/ModuleScaler.h"
tomwalters@40 57 #include "Modules/Features/ModuleGaussians.h"
tomwalters@40 58 #include "Modules/Output/FileOutputHTK.h"
tomwalters@40 59 #include "Support/Common.h"
tomwalters@40 60 #include "Support/FileList.h"
tomwalters@40 61 #include "Support/Parameters.h"
tomwalters@40 62
tomwalters@40 63 using std::ofstream;
tomwalters@40 64 using std::pair;
tomwalters@40 65 using std::vector;
tomwalters@40 66 using std::string;
tomwalters@40 67 int main(int argc, char* argv[]) {
tomwalters@40 68 string sound_file;
tomwalters@40 69 string data_file;
tomwalters@40 70 string config_file;
tomwalters@40 71 string script_file;
tomwalters@40 72 bool write_data = false;
tomwalters@40 73 bool print_version = false;
tomwalters@40 74
tomwalters@40 75 string version_string(
tomwalters@40 76 " AIM-C AIMCopy\n"
tomwalters@40 77 " (c) 2006-2010, Thomas Walters and Willem van Engen\n"
tomwalters@40 78 " http://www.acoustiscale.org/AIMC/\n"
tomwalters@40 79 "\n");
tomwalters@40 80
tomwalters@40 81 if (argc < 2) {
tomwalters@40 82 printf("%s", version_string.c_str());
tomwalters@40 83 printf("AIMCopy is intended as a drop-in replacement for HTK's HCopy\n");
tomwalters@40 84 printf("command. It is used for making features from audio files for\n");
tomwalters@40 85 printf("use with HTK.\n");
tomwalters@40 86 printf("Usage: \n");
tomwalters@40 87 printf(" -A Print command line arguments off\n");
tomwalters@40 88 printf(" -C cf Set config file to cf none\n");
tomwalters@40 89 printf(" -S f Set script file to f none\n");
tomwalters@40 90 printf(" -V Print version information off\n");
tomwalters@40 91 printf(" -D g Write configuration data to g none\n");
tomwalters@40 92 return -1;
tomwalters@40 93 }
tomwalters@40 94
tomwalters@40 95 // Parse command-line arguments
tomwalters@40 96 for (int i = 1; i < argc; i++) {
tomwalters@40 97 if (strcmp(argv[i],"-A") == 0) {
tomwalters@40 98 for (int j = 0; j < argc; j++)
tomwalters@40 99 printf("%s ",argv[j]);
tomwalters@40 100 printf("\n");
tomwalters@40 101 fflush(stdout);
tomwalters@40 102 continue;
tomwalters@40 103 }
tomwalters@40 104 if (strcmp(argv[i],"-C") == 0) {
tomwalters@40 105 if (++i >= argc) {
tomwalters@40 106 aimc::LOG_ERROR(_T("Configuration file name expected after -C"));
tomwalters@40 107 return(-1);
tomwalters@40 108 }
tomwalters@40 109 config_file = argv[i];
tomwalters@40 110 continue;
tomwalters@40 111 }
tomwalters@40 112 if (strcmp(argv[i],"-S") == 0) {
tomwalters@40 113 if (++i >= argc) {
tomwalters@40 114 aimc::LOG_ERROR(_T("Script file name expected after -S"));
tomwalters@40 115 return(-1);
tomwalters@40 116 }
tomwalters@40 117 script_file = argv[i];
tomwalters@40 118 continue;
tomwalters@40 119 }
tomwalters@40 120 if (strcmp(argv[i],"-D") == 0) {
tomwalters@40 121 if (++i >= argc) {
tomwalters@40 122 aimc::LOG_ERROR(_T("Data file name expected after -D"));
tomwalters@40 123 return(-1);
tomwalters@40 124 }
tomwalters@40 125 data_file = argv[i];
tomwalters@40 126 write_data = true;
tomwalters@40 127 continue;
tomwalters@40 128 }
tomwalters@40 129 if (strcmp(argv[i],"-V") == 0) {
tomwalters@40 130 print_version = true;
tomwalters@40 131 continue;
tomwalters@40 132 }
tomwalters@40 133 aimc::LOG_ERROR(_T("Unrecognized command-line argument: %s"), argv[i]);
tomwalters@40 134 }
tomwalters@40 135
tomwalters@40 136 if (print_version)
tomwalters@40 137 printf("%s", version_string.c_str());
tomwalters@40 138
tomwalters@40 139 aimc::Parameters params;
tomwalters@40 140
tomwalters@40 141 if (!params.Load(config_file.c_str())) {
tomwalters@40 142 aimc::LOG_ERROR(_T("Couldn't load parameters from file %s"),
tomwalters@40 143 config_file.c_str());
tomwalters@40 144 return -1;
tomwalters@40 145 }
tomwalters@40 146
tomwalters@40 147 vector<pair<string, string> > file_list = aimc::FileList::Load(script_file);
tomwalters@40 148 if (file_list.size() == 0) {
tomwalters@40 149 aimc::LOG_ERROR("No data read from file %s", script_file.c_str());
tomwalters@40 150 return -1;
tomwalters@40 151 }
tomwalters@40 152
tomwalters@40 153 // Set up AIM-C processor here
tomwalters@40 154 aimc::ModuleFileInput input(&params);
tomwalters@40 155 aimc::ModuleNoise noise_maker(&params);
tomwalters@40 156 aimc::ModuleGammatone bmm(&params);
tomwalters@40 157 aimc::ModuleHCL nap(&params);
tomwalters@40 158 aimc::ModuleLocalMax strobes(&params);
tomwalters@40 159 aimc::ModuleSAI sai(&params);
tomwalters@40 160 aimc::ModuleSSI ssi(&params);
tomwalters@40 161
tomwalters@40 162 params.SetBool("slice.all", false);
tomwalters@40 163 params.SetInt("slice.lower_index", 77);
tomwalters@40 164 params.SetInt("slice.upper_index", 150);
tomwalters@40 165 aimc::ModuleSlice slice_1(&params);
tomwalters@40 166
tomwalters@40 167 //params.SetInt("slice.lower_index", 210);
tomwalters@40 168 //params.SetInt("slice.upper_index", 240);
tomwalters@40 169 //aimc::ModuleSlice slice_2(&params);
tomwalters@40 170
tomwalters@40 171 //params.SetInt("slice.lower_index", 280);
tomwalters@40 172 //params.SetInt("slice.upper_index", 304);
tomwalters@40 173 //aimc::ModuleSlice slice_3(&params);
tomwalters@40 174
tomwalters@40 175 //params.SetInt("slice.lower_index", 328);
tomwalters@40 176 //params.SetInt("slice.upper_index", 352);
tomwalters@40 177 //aimc::ModuleSlice slice_4(&params);
tomwalters@40 178
tomwalters@40 179 params.SetBool("slice.all", true);
tomwalters@40 180 aimc::ModuleSlice slice_5(&params);
tomwalters@40 181
tomwalters@40 182 //params.SetFloat("nap.lowpass_cutoff", 100.0);
tomwalters@40 183 //aimc::ModuleHCL smooth_nap(&params);
tomwalters@40 184 //params.SetBool("slice.all", true);
tomwalters@40 185 //aimc::ModuleSlice nap_profile(&params);
tomwalters@40 186 //aimc::ModuleScaler nap_scaler(&params);
tomwalters@40 187 //aimc::ModuleGaussians nap_features(&params);
tomwalters@40 188 //aimc::FileOutputHTK nap_out(&params);
tomwalters@40 189
tomwalters@40 190 aimc::ModuleGaussians features_1(&params);
tomwalters@40 191 //aimc::ModuleGaussians features_2(&params);
tomwalters@40 192 //aimc::ModuleGaussians features_3(&params);
tomwalters@40 193 //aimc::ModuleGaussians features_4(&params);
tomwalters@40 194 aimc::ModuleGaussians features_5(&params);
tomwalters@40 195
tomwalters@40 196 aimc::FileOutputHTK output_1(&params);
tomwalters@40 197 //aimc::FileOutputHTK output_2(&params);
tomwalters@40 198 //aimc::FileOutputHTK output_3(&params);
tomwalters@40 199 //aimc::FileOutputHTK output_4(&params);
tomwalters@40 200 aimc::FileOutputHTK output_5(&params);
tomwalters@40 201
tomwalters@40 202 input.AddTarget(&noise_maker);
tomwalters@40 203 noise_maker.AddTarget(&bmm);
tomwalters@40 204 bmm.AddTarget(&nap);
tomwalters@40 205 //bmm.AddTarget(&smooth_nap);
tomwalters@40 206 //smooth_nap.AddTarget(&nap_profile);
tomwalters@40 207 //nap_profile.AddTarget(&nap_scaler);
tomwalters@40 208 //nap_scaler.AddTarget(&nap_features);
tomwalters@40 209 //nap_features.AddTarget(&nap_out);
tomwalters@40 210 nap.AddTarget(&strobes);
tomwalters@40 211 strobes.AddTarget(&sai);
tomwalters@40 212 sai.AddTarget(&ssi);
tomwalters@40 213
tomwalters@40 214 ssi.AddTarget(&slice_1);
tomwalters@40 215 //ssi.AddTarget(&slice_2);
tomwalters@40 216 //ssi.AddTarget(&slice_3);
tomwalters@40 217 //ssi.AddTarget(&slice_4);
tomwalters@40 218 ssi.AddTarget(&slice_5);
tomwalters@40 219
tomwalters@40 220 slice_1.AddTarget(&features_1);
tomwalters@40 221 //slice_2.AddTarget(&features_2);
tomwalters@40 222 //slice_3.AddTarget(&features_3);
tomwalters@40 223 //slice_4.AddTarget(&features_4);
tomwalters@40 224 slice_5.AddTarget(&features_5);
tomwalters@40 225
tomwalters@40 226 features_1.AddTarget(&output_1);
tomwalters@40 227 //features_2.AddTarget(&output_2);
tomwalters@40 228 //features_3.AddTarget(&output_3);
tomwalters@40 229 //features_4.AddTarget(&output_4);
tomwalters@40 230 features_5.AddTarget(&output_5);
tomwalters@40 231
tomwalters@40 232 if (write_data) {
tomwalters@40 233 ofstream outfile(data_file.c_str());
tomwalters@40 234 if (outfile.fail()) {
tomwalters@40 235 aimc::LOG_ERROR("Couldn't open data file %s for writing",
tomwalters@40 236 data_file.c_str());
tomwalters@40 237 return -1;
tomwalters@40 238 }
tomwalters@40 239 time_t rawtime;
tomwalters@40 240 struct tm * timeinfo;
tomwalters@40 241 time(&rawtime);
tomwalters@40 242 timeinfo = localtime(&rawtime);
tomwalters@40 243
tomwalters@40 244
tomwalters@40 245 outfile << "# AIM-C AIMCopy\n";
tomwalters@40 246 outfile << "# Run on: " << asctime(timeinfo);
tomwalters@40 247 char * descr = getenv("USER");
tomwalters@40 248 if (descr) {
tomwalters@40 249 outfile << "# By user: " << descr <<"\n";
tomwalters@40 250 }
tomwalters@40 251 outfile << "#Module chain: ";
tomwalters@40 252 outfile << "#input";
tomwalters@40 253 outfile << "# noise_maker";
tomwalters@40 254 outfile << "# gt";
tomwalters@40 255 outfile << "# nap";
tomwalters@40 256 outfile << "# slice";
tomwalters@40 257 outfile << "# scaler";
tomwalters@40 258 outfile << "# features";
tomwalters@40 259 outfile << "# output";
tomwalters@40 260 outfile << "# local_max";
tomwalters@40 261 outfile << "# sai_weighted";
tomwalters@40 262 outfile << "# ssi";
tomwalters@40 263 outfile << "# slice";
tomwalters@40 264 outfile << "# features";
tomwalters@40 265 outfile << "# output";
tomwalters@40 266 outfile << "# slice";
tomwalters@40 267 outfile << "# features";
tomwalters@40 268 outfile << "# output";
tomwalters@40 269 outfile << "# slice";
tomwalters@40 270 outfile << "# features";
tomwalters@40 271 outfile << "# output";
tomwalters@40 272 outfile << "# slice";
tomwalters@40 273 outfile << "# features";
tomwalters@40 274 outfile << "# output";
tomwalters@40 275 outfile << "# slice";
tomwalters@40 276 outfile << "# features";
tomwalters@40 277 outfile << "# output";
tomwalters@40 278 outfile << "# ";
tomwalters@40 279 outfile << "# Module versions:\n";
tomwalters@40 280 outfile << "# " << input.id() << " : " << input.version() << "\n";
tomwalters@40 281 outfile << "# " << bmm.id() << " : " << bmm.version() << "\n";
tomwalters@40 282 outfile << "# " << nap.id() << " : " << nap.version() << "\n";
tomwalters@40 283 outfile << "# " << strobes.id() << " : " << strobes.version() << "\n";
tomwalters@40 284 outfile << "# " << sai.id() << " : " << sai.version() << "\n";
tomwalters@40 285 outfile << "# " << slice_1.id() << " : " << slice_1.version() << "\n";
tomwalters@40 286 // outfile << "# " << profile.id() << " : " << profile.version() << "\n";
tomwalters@40 287 // outfile << "# " << scaler.id() << " : " << scaler.version() << "\n";
tomwalters@40 288 outfile << "# " << features_1.id() << " : " << features_1.version() << "\n";
tomwalters@40 289 outfile << "# " << output_1.id() << " : " << output_1.version() << "\n";
tomwalters@40 290 outfile << "#\n";
tomwalters@40 291 outfile << "# Parameters:\n";
tomwalters@40 292 outfile << params.WriteString();
tomwalters@40 293 outfile.close();
tomwalters@40 294 }
tomwalters@40 295
tomwalters@40 296 for (unsigned int i = 0; i < file_list.size(); ++i) {
tomwalters@40 297 // aimc::LOG_INFO(_T("In: %s"), file_list[i].first.c_str());
tomwalters@40 298 aimc::LOG_INFO(_T("Out: %s"), file_list[i].second.c_str());
tomwalters@40 299
tomwalters@40 300 string filename = file_list[i].second + ".slice_1";
tomwalters@40 301 output_1.OpenFile(filename.c_str(), 10.0f);
tomwalters@40 302 //filename = file_list[i].second + ".slice_2";
tomwalters@40 303 //output_2.OpenFile(filename.c_str(), 10.0f);
tomwalters@40 304 //filename = file_list[i].second + ".slice_3";
tomwalters@40 305 //output_3.OpenFile(filename.c_str(), 10.0f);
tomwalters@40 306 //filename = file_list[i].second + ".slice_4";
tomwalters@40 307 //output_4.OpenFile(filename.c_str(), 10.0f);
tomwalters@40 308 filename = file_list[i].second + ".ssi_profile";
tomwalters@40 309 output_5.OpenFile(filename.c_str(), 10.0f);
tomwalters@40 310 //filename = file_list[i].second + ".smooth_nap_profile";
tomwalters@40 311 //nap_out.OpenFile(filename.c_str(), 10.0f);
tomwalters@40 312
tomwalters@40 313 if (input.LoadFile(file_list[i].first.c_str())) {
tomwalters@40 314 input.Process();
tomwalters@40 315 } else {
tomwalters@40 316 printf("LoadFile failed for file %s\n", file_list[i].first.c_str());
tomwalters@40 317 }
tomwalters@40 318 input.Reset();
tomwalters@40 319 }
tomwalters@40 320
tomwalters@40 321 return 0;
tomwalters@40 322 }