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