Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055 #if !defined(ALIZE_FeatureFileReaderHTK_cpp)
00056 #define ALIZE_FeatureFileReaderHTK_cpp
00057
00058 #include <new>
00059 #include "FeatureFileReaderHTK.h"
00060 #include "Feature.h"
00061 #include "Exception.h"
00062 #include "LabelServer.h"
00063 #include "Label.h"
00064 #include "Config.h"
00065 #include "FileReader.h"
00066
00067
00068
00069 static const int WAVEFORM = 0;
00070 static const int LPC = 1;
00071 static const int LPREFC = 2;
00072 static const int LPCEPSTRA = 3;
00073 static const int LPDELCEP = 4;
00074 static const int IREFC = 5;
00075 static const int MFCC = 6;
00076 static const int FBANK = 7;
00077 static const int MELSPEC = 8;
00078 static const int USER = 9;
00079 static const int DISCRETE = 10;
00080
00081
00082
00083 static const int E = 000100;
00084 static const int N = 000200;
00085 static const int D = 000400;
00086 static const int A = 001000;
00087 static const int C = 002000;
00088 static const int Z = 004000;
00089 static const int K = 010000;
00090 static const int O = 020000;
00091
00092 using namespace alize;
00093 typedef FeatureFileReaderHTK R;
00094
00095
00096 R::FeatureFileReaderHTK(const FileName& f, const Config& c, LabelServer* l,
00097 BigEndian be, BufferUsage b, unsigned long bufferSize,
00098 HistoricUsage h, unsigned long historicSize)
00099 :FeatureFileReaderSingle(&FileReader::create(f, getPath(f, c),
00100 getExt(f, c), getBigEndian(c, be)), NULL, c, l, b, bufferSize, h, historicSize),
00101 _paramDefined(false) {}
00102
00103 R& R::create(const FileName& f, const Config& c, LabelServer* l,
00104 BigEndian be, BufferUsage b, unsigned long bufferSize,
00105 HistoricUsage h, unsigned long historicSize)
00106 {
00107 R* p = new (std::nothrow) R(f, c, l, be, b, bufferSize, h, historicSize);
00108 assertMemoryIsAllocated(p, __FILE__, __LINE__);
00109 return *p;
00110 }
00111
00112 void R::readParams()
00113 {
00114 assert(_pReader != NULL);
00115 _pReader->open();
00116
00117 if (!readHeader())
00118 {
00119 _pReader->close();
00120 throw InvalidDataException("Wrong header", __FILE__, __LINE__,
00121 _pReader->getFullFileName());
00122 }
00123 }
00124
00125 unsigned long R::getFeatureCount()
00126 {
00127 if (!_paramDefined)
00128 const_cast<FeatureFileReaderHTK*>(this)->readParams();
00129 return _featureCount;
00130 }
00131
00132 unsigned long R::getVectSize()
00133 {
00134 if (!_paramDefined)
00135 readParams();
00136 return _vectSize;
00137 }
00138
00139 const FeatureFlags& R::getFeatureFlags()
00140 {
00141 if (!_paramDefined)
00142 readParams();
00143 return _flags;
00144 }
00145
00146 real_t R::getSampleRate()
00147 {
00148 if (!_paramDefined)
00149 readParams();
00150 return _sampleRate;
00151 }
00152
00153 String R::getClassName() const { return "FeatureFileReaderHTK"; }
00154
00155 bool R::readHeader()
00156 {
00157 assert(_pReader != NULL);
00158 _featureCount = _pReader->readInt4();
00159 _sampleRate = 10000000/_pReader->readInt4();
00160
00161 _vectSize = _pReader->readInt2()/4;
00162
00163 int kind = 0;
00164 kind = _pReader->readInt2();
00165 if ( (int)(kind ^ 0xffffffc0) == WAVEFORM)
00166 return false;
00167
00168
00169 _flags.set("100000");
00170 if (kind & E)
00171 _flags.useE = true;
00172 if (kind & D)
00173 {
00174 _flags.useD = true;
00175 if (kind & E)
00176 _flags.useDE = true;
00177 }
00178 if (kind & A)
00179 {
00180 _flags.useDD = true;
00181 if (kind & E)
00182 _flags.useDDE = true;
00183 }
00184 if (kind & N)
00185 _flags.useE = false;
00186
00187 _paramDefined = true;
00188
00189 return true;
00190 }
00191
00192 unsigned long R::getHeaderLength() { return 12; }
00193
00194 R::~FeatureFileReaderHTK() {}
00195
00196
00197 #endif // !defined(ALIZE_FeatureFileReaderHTK_cpp)
00198
00199