FeatureFileReaderHTK.cpp

Go to the documentation of this file.
00001 /*
00002         This file is part of ALIZE which is an open-source tool for 
00003         speaker recognition.
00004 
00005     ALIZE is free software: you can redistribute it and/or modify
00006     it under the terms of the GNU Lesser General Public License as 
00007     published by the Free Software Foundation, either version 3 of 
00008     the License, or any later version.
00009 
00010     ALIZE is distributed in the hope that it will be useful,
00011     but WITHOUT ANY WARRANTY; without even the implied warranty of
00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013     GNU Lesser General Public License for more details.
00014 
00015     You should have received a copy of the GNU Lesser General Public 
00016     License along with ALIZE.
00017     If not, see <http://www.gnu.org/licenses/>.
00018         
00019         ALIZE is a development project initiated by the ELISA consortium
00020         [alize.univ-avignon.fr/] and funded by the French Research 
00021         Ministry in the framework of the TECHNOLANGUE program 
00022         [www.technolangue.net]
00023 
00024         The ALIZE project team wants to highlight the limits of voice
00025         authentication in a forensic context.
00026         The "Person  Authentification by Voice: A Need of Caution" paper 
00027         proposes a good overview of this point (cf. "Person  
00028         Authentification by Voice: A Need of Caution", Bonastre J.F., 
00029         Bimbot F., Boe L.J., Campbell J.P., Douglas D.A., Magrin-
00030         chagnolleau I., Eurospeech 2003, Genova].
00031         The conclusion of the paper of the paper is proposed bellow:
00032         [Currently, it is not possible to completely determine whether the 
00033         similarity between two recordings is due to the speaker or to other 
00034         factors, especially when: (a) the speaker does not cooperate, (b) there 
00035         is no control over recording equipment, (c) recording conditions are not 
00036         known, (d) one does not know whether the voice was disguised and, to a 
00037         lesser extent, (e) the linguistic content of the message is not 
00038         controlled. Caution and judgment must be exercised when applying speaker 
00039         recognition techniques, whether human or automatic, to account for these 
00040         uncontrolled factors. Under more constrained or calibrated situations, 
00041         or as an aid for investigative purposes, judicious application of these 
00042         techniques may be suitable, provided they are not considered as infallible.
00043         At the present time, there is no scientific process that enables one to 
00044         uniquely characterize a person=92s voice or to identify with absolute 
00045         certainty an individual from his or her voice.]
00046         Contact Jean-Francois Bonastre for more information about the licence or
00047         the use of ALIZE
00048 
00049         Copyright (C) 2003-2010
00050         Laboratoire d'informatique d'Avignon [lia.univ-avignon.fr]
00051         ALIZE admin [alize@univ-avignon.fr]
00052         Jean-Francois Bonastre [jean-francois.bonastre@univ-avignon.fr]
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 // parameter
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 // qualifiers (octal)
00082 
00083 static const int E = 000100; // has energy
00084 static const int N = 000200; // absolute energy suppressed
00085 static const int D = 000400; // has delta coefficients
00086 static const int A = 001000; // has delta coefficients
00087 static const int C = 002000; // is compressed
00088 static const int Z = 004000; // has zero mean static coef
00089 static const int K = 010000; // has CRC checksum
00090 static const int O = 020000; // has 0'th cepstral coef
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() // private virtual
00113 {
00114   assert(_pReader != NULL);
00115   _pReader->open(); // can throw FileNotFoundException
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();  // can throw FileNotFoundException
00129   return _featureCount;
00130 }
00131 //-------------------------------------------------------------------------
00132 unsigned long R::getVectSize()
00133 {
00134   if (!_paramDefined)
00135     readParams(); // can throw FileNotFoundException
00136   return _vectSize;
00137 }
00138 //-------------------------------------------------------------------------
00139 const FeatureFlags& R::getFeatureFlags()
00140 {
00141   if (!_paramDefined)
00142     readParams(); // can throw FileNotFoundException
00143   return _flags;
00144 }
00145 //-------------------------------------------------------------------------
00146 real_t R::getSampleRate()
00147 {
00148   if (!_paramDefined)
00149     readParams(); // can throw FileNotFoundException
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(); // 1/samplePeriod
00160                      // samplePeriod = multiple of 100 ns
00161   _vectSize = _pReader->readInt2()/4;
00162   
00163   int kind = 0;
00164   kind = _pReader->readInt2();
00165   if ( (int)(kind ^ 0xffffffc0) == WAVEFORM)
00166     return false;
00167   // TODO : test all cases
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