annotate trunk/src/Main/AIMCopy.cc @ 404:ae015c67d1e1

Created wiki page through web user interface.
author tomwalters
date Tue, 19 Oct 2010 07:10:17 +0000
parents 69466da9745e
children a908972d234e
rev   line source
tomwalters@296 1 // Copyright 2008-2010, Thomas Walters
tomwalters@296 2 //
tomwalters@296 3 // AIM-C: A C++ implementation of the Auditory Image Model
tomwalters@296 4 // http://www.acousticscale.org/AIMC
tomwalters@296 5 //
tomwalters@318 6 // Licensed under the Apache License, Version 2.0 (the "License");
tomwalters@318 7 // you may not use this file except in compliance with the License.
tomwalters@318 8 // You may obtain a copy of the License at
tomwalters@296 9 //
tomwalters@318 10 // http://www.apache.org/licenses/LICENSE-2.0
tomwalters@296 11 //
tomwalters@318 12 // Unless required by applicable law or agreed to in writing, software
tomwalters@318 13 // distributed under the License is distributed on an "AS IS" BASIS,
tomwalters@318 14 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
tomwalters@318 15 // See the License for the specific language governing permissions and
tomwalters@318 16 // limitations under the License.
tomwalters@296 17
tomwalters@296 18 /*!
tomwalters@296 19 * \file AIMCopy.cpp
tomwalters@296 20 * \brief AIM-C replacement for HTK's HCopy
tomwalters@296 21 *
tomwalters@296 22 * The following subset of the command-line flags
tomwalters@296 23 * should be implemented from HCopy:
tomwalters@296 24 * -A Print command line arguments off
tomwalters@296 25 * -C cf Set config file to cf default
tomwalters@296 26 * (should be able to take multiple config files)
tomwalters@296 27 * -S f Set script file to f none
tomwalters@296 28 * //! \todo -T N Set trace flags to N 0
tomwalters@296 29 * -V Print version information off
tomwalters@296 30 * -D of Write configuration data to of none
tomwalters@296 31 *
tomwalters@296 32 * \author Thomas Walters <tom@acousticscale.org>
tomwalters@296 33 * \date created 2008/05/08
tomwalters@296 34 * \version \$Id$
tomwalters@296 35 */
tomwalters@296 36
tomwalters@296 37 #include <fstream>
tomwalters@296 38 #include <iostream>
tomwalters@296 39 #include <string>
tomwalters@296 40 #include <utility>
tomwalters@296 41 #include <vector>
tomwalters@296 42
tomwalters@296 43 #include <stdlib.h>
tomwalters@297 44 #include <time.h>
tomwalters@296 45
tomwalters@296 46 #include "Support/Common.h"
tomwalters@296 47 #include "Support/FileList.h"
tomwalters@402 48 #include "Support/ModuleTree.h"
tomwalters@296 49 #include "Support/Parameters.h"
tomwalters@296 50
tomwalters@402 51 namespace aimc {
tomwalters@296 52 using std::ofstream;
tomwalters@296 53 using std::pair;
tomwalters@296 54 using std::vector;
tomwalters@296 55 using std::string;
tomwalters@402 56 class AIMCopy {
tomwalters@402 57 public:
tomwalters@402 58 AIMCopy();
tomwalters@402 59
tomwalters@402 60 bool Initialize(string script_filename,
tomwalters@402 61 string config_filename);
tomwalters@402 62
tomwalters@402 63 bool WriteConfig(string config_dump_filename,
tomwalters@402 64 string config_graph_filename);
tomwalters@402 65
tomwalters@402 66 bool Process();
tomwalters@402 67
tomwalters@402 68 private:
tomwalters@402 69 bool initialized_;
tomwalters@402 70 Parameters global_parameters_;
tomwalters@402 71 ModuleTree tree_;
tomwalters@402 72 vector<pair<string, string> > script_;
tomwalters@402 73 };
tomwalters@402 74
tomwalters@402 75
tomwalters@402 76 AIMCopy::AIMCopy() : initialized_(false) {
tomwalters@402 77
tomwalters@402 78 }
tomwalters@402 79
tomwalters@402 80 bool AIMCopy::Initialize(string script_filename,
tomwalters@402 81 string config_filename) {
tomwalters@402 82
tomwalters@402 83 LOG_INFO("AIMCopy: Loading script");
tomwalters@402 84 script_ = FileList::Load(script_filename);
tomwalters@402 85 if (script_.size() == 0) {
tomwalters@402 86 LOG_ERROR("No data read from script file %s", script_filename.c_str());
tomwalters@402 87 return false;
tomwalters@402 88 }
tomwalters@402 89
tomwalters@402 90 LOG_INFO("AIMCopy: Loading configuration");
tomwalters@402 91 if (!tree_.LoadConfigFile(config_filename)) {
tomwalters@402 92 LOG_ERROR(_T("Failed to load configuration file"));
tomwalters@402 93 return false;
tomwalters@402 94 }
tomwalters@402 95 LOG_INFO("AIMCopy: Successfully loaded configuration");
tomwalters@402 96 initialized_ = true;
tomwalters@402 97 return true;
tomwalters@402 98 }
tomwalters@402 99
tomwalters@402 100 bool AIMCopy::WriteConfig(string config_dump_filename,
tomwalters@402 101 string config_graph_filename) {
tomwalters@402 102 if (!initialized_) {
tomwalters@402 103 return false;
tomwalters@402 104 }
tomwalters@402 105
tomwalters@402 106 if (script_.size() > 0) {
tomwalters@402 107 global_parameters_.SetString("input_filename", script_[0].first.c_str());
tomwalters@402 108 global_parameters_.SetString("output_filename_base", script_[0].second.c_str());
tomwalters@402 109 LOG_INFO("AIMCopy: Initializing tree for initial parameter write.");
tomwalters@402 110 if (!tree_.Initialize(&global_parameters_)) {
tomwalters@402 111 LOG_ERROR(_T("Failed to initialize tree."));
tomwalters@402 112 return false;
tomwalters@402 113 }
tomwalters@402 114 } else {
tomwalters@402 115 LOG_ERROR(_T("No input files in script."));
tomwalters@402 116 return false;
tomwalters@402 117 }
tomwalters@402 118
tomwalters@402 119 if (!config_dump_filename.empty()) {
tomwalters@402 120 LOG_INFO("AIMCopy: Dumping configuration.");
tomwalters@402 121 ofstream output_stream;
tomwalters@402 122 output_stream.open(config_dump_filename.c_str());
tomwalters@402 123 if (output_stream.fail()) {
tomwalters@402 124 LOG_ERROR(_T("Failed to open configuration file %s for writing."),
tomwalters@402 125 config_dump_filename.c_str());
tomwalters@402 126 return false;
tomwalters@402 127 }
tomwalters@402 128
tomwalters@402 129 time_t rawtime;
tomwalters@402 130 struct tm * timeinfo;
tomwalters@402 131 time(&rawtime);
tomwalters@402 132 timeinfo = localtime(&rawtime);
tomwalters@402 133 output_stream << "# AIM-C AIMCopy\n";
tomwalters@402 134 output_stream << "# Run at: " << asctime(timeinfo);
tomwalters@402 135 char * descr = getenv("USER");
tomwalters@402 136 if (descr) {
tomwalters@402 137 output_stream << "# By user: " << descr <<"\n";
tomwalters@402 138 }
tomwalters@402 139 tree_.PrintConfiguration(output_stream);
tomwalters@402 140 output_stream.close();
tomwalters@402 141 }
tomwalters@402 142
tomwalters@402 143 if (!config_graph_filename.empty()) {
tomwalters@402 144 ofstream output_stream;
tomwalters@402 145 output_stream.open(config_graph_filename.c_str());
tomwalters@402 146 if (output_stream.fail()) {
tomwalters@402 147 LOG_ERROR(_T("Failed to open graph file %s for writing."),
tomwalters@402 148 config_graph_filename.c_str());
tomwalters@402 149 return false;
tomwalters@402 150 }
tomwalters@402 151 tree_.MakeDotGraph(output_stream);
tomwalters@402 152 output_stream.close();
tomwalters@402 153 }
tomwalters@402 154 return true;
tomwalters@402 155 }
tomwalters@402 156
tomwalters@402 157 bool AIMCopy::Process() {
tomwalters@402 158 if (!initialized_) {
tomwalters@402 159 return false;
tomwalters@402 160 }
tomwalters@402 161 for (unsigned int i = 0; i < script_.size(); ++i) {
tomwalters@402 162 global_parameters_.SetString("input_filename", script_[i].first.c_str());
tomwalters@402 163 global_parameters_.SetString("output_filename_base", script_[i].second.c_str());
tomwalters@402 164 if (!tree_.Initialize(&global_parameters_)) {
tomwalters@402 165 return false;
tomwalters@402 166 }
tomwalters@402 167 aimc::LOG_INFO(_T("%s -> %s"),
tomwalters@402 168 script_[i].first.c_str(),
tomwalters@402 169 script_[i].second.c_str());
tomwalters@402 170 tree_.Reset();
tomwalters@402 171 tree_.Process();
tomwalters@402 172 }
tomwalters@402 173 return true;
tomwalters@402 174 }
tomwalters@402 175
tomwalters@402 176 } // namespace aimc
tomwalters@402 177
tomwalters@296 178 int main(int argc, char* argv[]) {
tomwalters@402 179 std::string data_file;
tomwalters@402 180 std::string dot_file;
tomwalters@402 181 std::string config_file;
tomwalters@402 182 std::string script_file;
tomwalters@296 183
tomwalters@402 184 const std::string version_string(
tomwalters@296 185 " AIM-C AIMCopy\n"
tomwalters@296 186 " (c) 2006-2010, Thomas Walters and Willem van Engen\n"
tomwalters@296 187 " http://www.acoustiscale.org/AIMC/\n"
tomwalters@402 188 "\n");
tomwalters@402 189
tomwalters@402 190 const std::string usage_string(
tomwalters@402 191 "AIMCopy is intended as a drop-in replacement for HTK's HCopy\n"
tomwalters@402 192 "command. It is used for making features from audio files for\n"
tomwalters@402 193 "use with HTK.\n"
tomwalters@402 194 "Usage: \n"
tomwalters@402 195 " <flag> <meaning> <default>\n"
tomwalters@402 196 " -A Print command line arguments off\n"
tomwalters@402 197 " -C cf Set config file to cf none\n"
tomwalters@402 198 " -S f Set script file to f none\n"
tomwalters@402 199 " -V Print version information off\n"
tomwalters@402 200 " -D d Write complete parameter set to file d none\n"
tomwalters@402 201 " -G g Write graph to file g none\n");
tomwalters@296 202
tomwalters@296 203 if (argc < 2) {
tomwalters@402 204 std::cout << version_string.c_str();
tomwalters@402 205 std::cout << usage_string.c_str();
tomwalters@296 206 return -1;
tomwalters@296 207 }
tomwalters@296 208
tomwalters@296 209 // Parse command-line arguments
tomwalters@296 210 for (int i = 1; i < argc; i++) {
tomwalters@296 211 if (strcmp(argv[i],"-A") == 0) {
tomwalters@296 212 for (int j = 0; j < argc; j++)
tomwalters@296 213 printf("%s ",argv[j]);
tomwalters@296 214 printf("\n");
tomwalters@296 215 fflush(stdout);
tomwalters@296 216 continue;
tomwalters@296 217 }
tomwalters@296 218 if (strcmp(argv[i],"-C") == 0) {
tomwalters@296 219 if (++i >= argc) {
tomwalters@296 220 aimc::LOG_ERROR(_T("Configuration file name expected after -C"));
tomwalters@296 221 return(-1);
tomwalters@296 222 }
tomwalters@296 223 config_file = argv[i];
tomwalters@296 224 continue;
tomwalters@296 225 }
tomwalters@296 226 if (strcmp(argv[i],"-S") == 0) {
tomwalters@296 227 if (++i >= argc) {
tomwalters@296 228 aimc::LOG_ERROR(_T("Script file name expected after -S"));
tomwalters@296 229 return(-1);
tomwalters@296 230 }
tomwalters@296 231 script_file = argv[i];
tomwalters@296 232 continue;
tomwalters@296 233 }
tomwalters@296 234 if (strcmp(argv[i],"-D") == 0) {
tomwalters@296 235 if (++i >= argc) {
tomwalters@296 236 aimc::LOG_ERROR(_T("Data file name expected after -D"));
tomwalters@296 237 return(-1);
tomwalters@296 238 }
tomwalters@296 239 data_file = argv[i];
tomwalters@296 240 continue;
tomwalters@296 241 }
tomwalters@402 242 if (strcmp(argv[i],"-G") == 0) {
tomwalters@402 243 if (++i >= argc) {
tomwalters@402 244 aimc::LOG_ERROR(_T("Graph file name expected after -D"));
tomwalters@402 245 return(-1);
tomwalters@402 246 }
tomwalters@402 247 dot_file = argv[i];
tomwalters@402 248 continue;
tomwalters@402 249 }
tomwalters@402 250 if (strcmp(argv[i],"-V") == 0) {
tomwalters@402 251 std::cout << version_string;
tomwalters@296 252 continue;
tomwalters@296 253 }
tomwalters@296 254 aimc::LOG_ERROR(_T("Unrecognized command-line argument: %s"), argv[i]);
tomwalters@296 255 }
tomwalters@296 256
tomwalters@402 257 std::cout << "Configuration file: " << config_file << std::endl;
tomwalters@402 258 std::cout << "Script file: " << script_file << std::endl;
tomwalters@402 259 std::cout << "Data file: " << data_file << std::endl;
tomwalters@402 260 std::cout << "Graph file: " << dot_file << std::endl;
tomwalters@402 261
tomwalters@402 262 aimc::AIMCopy processor;
tomwalters@402 263 aimc::LOG_INFO("main: Initializing...");
tomwalters@402 264 if (!processor.Initialize(script_file, config_file)) {
tomwalters@296 265 return -1;
tomwalters@296 266 }
tomwalters@402 267
tomwalters@402 268 aimc::LOG_INFO("main: Writing confg...");
tomwalters@402 269 if (!processor.WriteConfig(data_file, dot_file)) {
tomwalters@296 270 return -1;
tomwalters@296 271 }
tomwalters@402 272
tomwalters@402 273 aimc::LOG_INFO("main: Processing...");
tomwalters@402 274 if (!processor.Process()) {
tomwalters@402 275 return -1;
tomwalters@296 276 }
tomwalters@296 277
tomwalters@296 278 return 0;
tomwalters@296 279 }