annotate src/Main/AIMCopy.cc @ 232:af531fc3f280

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