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