TrainTargetMain.cpp

Go to the documentation of this file.
00001 /*
00002 This file is part of LIA_RAL which is a set of software based on ALIZE
00003 toolkit for speaker recognition. ALIZE toolkit is required to use LIA_RAL.
00004 
00005 LIA_RAL project is a development project was initiated by the computer
00006 science laboratory of Avignon / France (Laboratoire Informatique d'Avignon -
00007 LIA) [http://lia.univ-avignon.fr <http://lia.univ-avignon.fr/>]. Then it
00008 was supported by two national projects of the French Research Ministry:
00009         - TECHNOLANGUE program [http://www.technolangue.net]
00010         - MISTRAL program [http://mistral.univ-avignon.fr]
00011 
00012 LIA_RAL is free software: you can redistribute it and/or modify
00013 it under the terms of the GNU Lesser General Public License as
00014 published by the Free Software Foundation, either version 3 of
00015 the License, or any later version.
00016 
00017 LIA_RAL is distributed in the hope that it will be useful,
00018 but WITHOUT ANY WARRANTY; without even the implied warranty of
00019 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00020 GNU Lesser General Public License for more details.
00021 
00022 You should have received a copy of the GNU Lesser General Public
00023 License along with LIA_RAL.
00024 If not, see [http://www.gnu.org/licenses/].
00025 
00026 The LIA team as well as the LIA_RAL project team wants to highlight the
00027 limits of voice authentication in a forensic context.
00028 The "Person Authentification by Voice: A Need of Caution" paper
00029 proposes a good overview of this point (cf. "Person
00030 Authentification by Voice: A Need of Caution", Bonastre J.F.,
00031 Bimbot F., Boe L.J., Campbell J.P., Douglas D.A., Magrin-
00032 chagnolleau I., Eurospeech 2003, Genova].
00033 The conclusion of the paper of the paper is proposed bellow:
00034 [Currently, it is not possible to completely determine whether the
00035 similarity between two recordings is due to the speaker or to other
00036 factors, especially when: (a) the speaker does not cooperate, (b) there
00037 is no control over recording equipment, (c) recording conditions are not
00038 known, (d) one does not know whether the voice was disguised and, to a
00039 lesser extent, (e) the linguistic content of the message is not
00040 controlled. Caution and judgment must be exercised when applying speaker
00041 recognition techniques, whether human or automatic, to account for these
00042 uncontrolled factors. Under more constrained or calibrated situations,
00043 or as an aid for investigative purposes, judicious application of these
00044 techniques may be suitable, provided they are not considered as infallible.
00045 At the present time, there is no scientific process that enables one to
00046 uniquely characterize a persones voice or to identify with absolute
00047 certainty an individual from his or her voice.]
00048 
00049 Copyright (C) 2004-2010
00050 Laboratoire d'informatique d'Avignon [http://lia.univ-avignon.fr]
00051 LIA_RAL admin [alize@univ-avignon.fr]
00052 Jean-Francois Bonastre [jean-francois.bonastre@univ-avignon.fr]
00053 */
00054 
00055 #include <iostream>
00056 #include "liatools.h"
00057 #include "TrainTarget.h"
00058 
00059 int main(int argc, char* argv[]){
00060 
00061     ConfigChecker cc;
00062     cc.addStringParam("config", false, true, "default config filename");
00063     cc.addIntegerParam("verboseLevel",false,true,"level of the berose information 0=no verbose, 1=normal, 2=more");
00064     cc.addStringParam("inputFeatureFilename",false, true,"feature filename or filename of a text file with the list of feature filenames");
00065     cc.addStringParam("targetIdList",true,true,"The file with the list of models to train. A line is composed by client_id file1 file2 ...");
00066     cc.addStringParam("inputWorldFilename",false,true,"if set, the init is based on a model get from this file, else frrom scratch");
00067     cc.addStringParam("mixtureServer",false,true,"If set save the complete mixture server in the filename (FUTURE USED, TODO)");
00068     cc.addBooleanParam("initByClient",false,true,"For by lael option. Modify the initial model for statistic estimation (EM), default world, if set client");
00069     cc.addBooleanParam("saveEmptyModel",false,true,"If no data is available for a model (or a lable model), save the not adapted model (world or global client)");
00070     cc.addBooleanParam("useIdForSelectedFrame",false,true,"If set, the segments with label ID are used for training the client model ID");
00071     cc.addStringParam("labelSelectedFrames",false,true,"The segments with this label are used for training the worldmodel (if UseIdForSelectedFrame is not used)"); 
00072     cc.addFloatParam("baggedFrameProbability",false,true,"Defines the % of frames taken for each iterations (default 1)");
00073     cc.addIntegerParam("nbTrainIt",false,true,"number of it (default=1)"); 
00074     cc.addBooleanParam("normalizeModel",false,true,"if set to true,  normalize the world (at each iteration)");
00075     cc.addBooleanParam("normalizeModelMeanOnly",false,true,"Used only if normalizeModel is On, says if only mean parameters should be normalized"); 
00076     cc.addIntegerParam("normalizeModelNbIt",false,true,"Used only if noramlizeModelMeanOnly is set, nb of normalization it");
00077     cc.addBooleanParam("meanAdapt",false,true,"Mean adaptation (default false)");
00078     cc.addBooleanParam("varAdapt",false,true,"Variance adaptation (default false)");
00079     cc.addBooleanParam("weightAdapt",false,true,"Weight adaptation (default false)");
00080     cc.addStringParam("MAPAlgo",true,true,"Adaptation method (MAPConst,MAPConst2,MAPOccDep,MLLR)");
00081     cc.addFloatParam("MAPAlphaMean",false,true,"a priori proba for world");         
00082     cc.addFloatParam("MAPAlphaVar",false,true,"a priori proba for world");
00083     cc.addFloatParam("MAPAlphaWeight",false,true,"a priori proba for world");
00084     cc.addFloatParam("MAPRegFactorMean",false,true,"Reg factor");                       
00085     cc.addFloatParam("MAPRegFactorVar",false,true,"Reg factor");        
00086     cc.addFloatParam("MAPRegFactorWeight",false,true,"Reg factor");     
00087     cc.addBooleanParam("info",false,false,"If info is requested, just info on the train set is outputed");
00088     cc.addBooleanParam("useModelData",false,true,"New MAP algo based on ML estimate of the training data");
00089     cc.addStringParam("initModel",false,true,"With model based, use a specific model for initialize the EM estimate (default=world");
00090     cc.addBooleanParam("outputAdaptParam",false,true,"Saving a vector (matrix if MLLR, weights if MAP) instead of a mixture");
00091     //cc.addBooleanParam("use01",false,true,"if set at true, don't compute the global mean and cov but uses 0 mean and 1 cov");
00092     try{
00093     CmdLine cmdLine(argc, argv);
00094     if (cmdLine.displayHelpRequired()){
00095       cout <<"TrainTarget.exe"<<endl<<"This program is used for Adapting a client model from a world model"
00096            <<endl<<cc.getParamList()<<endl;
00097       return 0;  
00098     }
00099     if (cmdLine.displayVersionRequired()){
00100     cout <<"Version 2"<<endl;
00101     } 
00102     Config tmp;
00103     cmdLine.copyIntoConfig(tmp);
00104     Config config;
00105     if (tmp.existsParam("config")) config.load(tmp.getParam("config"));
00106     cmdLine.copyIntoConfig(config);
00107     cc.check(config);
00108     debug=config.getParam_debug();
00109     if (config.existsParam("verbose"))verbose=config.getParam("verbose").toBool();else verbose=false;
00110     if (verbose) verboseLevel=1;else verboseLevel=0;
00111     if (config.existsParam("verboseLevel"))verboseLevel=config.getParam("verboseLevel").toLong();
00112     if (verboseLevel>0) verbose=true;
00113     bool train=true;                                 // Training the target models
00114     if (config.existsParam("info"))                  // Information on the data available for the targets and output a file with good amount of data
00115       train=false;
00116     if (train){
00117       if (config.existsParam("byLabelModel"))        // if the paramter is present, for each client, we train one model for each cluster 
00118                 TrainTargetByLabel(config);                  // (a cluster is a set of segments with the same label)      
00119      if (config.existsParam("FactorAnalysis"))        // if the paramter is present, for each client, we train one model for each cluster 
00120                 TrainTargetFA(config);                  // (a cluster is a set of segments with the same label)
00121         bool JFA = false;                                                                               //default value for previous versions compatibility
00122         bool LFA = false;
00123         if (config.existsParam("channelCompensation") && (config.getParam("channelCompensation") == "JFA"))
00124                 JFA = true;
00125         else if (config.existsParam("channelCompensation") && (config.getParam("channelCompensation") == "LFA"))
00126                         LFA=true;
00127         if (JFA)                TrainTargetJFA(config);                                         // if JFA is true, for each client, we train one model for each cluster 
00128         else if (LFA)   TrainTargetLFA(config);
00129     else TrainTarget(config);  
00130     }
00131     else   InfoTarget(config);   
00132     
00133     return 0;
00134   }
00135   catch(alize::Exception & e){ cout <<"TrainTarget "<< e.toString() << endl << cc.getParamList()<<endl;}
00136 }
00137 
00138