//------------------------------------------------------------------------- int labelNGram(Config& config) { if (config.existsParam("debug"))debug=true; else debug=false; if (config.existsParam("verbose"))verbose=true; else verbose=false; String extOutputLabel=".sym.lbl"; // the extension of the output files if (config.existsParam("saveLabelFileExtension")) extOutputLabel=config.getParam("saveLabelFileExtension"); String pathOutput="./"; // the path of the output files if (config.existsParam("labelOutputPath")) pathOutput=config.getParam("labelOutputPath"); String extSymbol=".sym"; // the extension of the symbol files if (config.existsParam("symbolFileExtension")) extSymbol=config.getParam("symbolFileExtension"); String pathSymbol="./"; if (config.existsParam("symbolPath")) pathSymbol=config.getParam("symbolPath"); String formatSymbol="ascii"; if (config.existsParam("symbolFormat")) pathSymbol=config.getParam("symbolFormat"); String NGramFilename=config.getParam("NGramFilename"); unsigned long NGramOrder=3; if (config.existsParam("NGramOrder")) NGramOrder=config.getParam("NGramOrder").toLong(); unsigned long NGramSelected=16; if (config.existsParam("NGramSelected")) NGramSelected=config.getParam("NGramSelected").toLong(); NGram NGramTable(NGramOrder,NGramSelected); NGramTable.load(NGramFilename,config); // Load the NGRAM table, selecting the NGramSelected first String inputFilename=config.getParam("inputFilename"); String labelSelectedFrames=config.getParam("labelSelectedFrames"); XLine inputFileList; try{ if (inputFilename.endsWith(".lst")){ // input is file containing a list of filenames XList tmp(inputFilename,config); inputFileList=tmp.getAllElements(); } else inputFileList.addElement(inputFilename); // a single filename String *p; while ((p=inputFileList.getElement())){ String& filename=*p; if (verbose) cout <<"labelNGram file["<<filename<<"] Table["<<NGramFilename<<"] Order["<<NGramOrder<<"] Selected["<<NGramSelected<<"]"<<endl; SegServer segServer; LabelServer labelServer; loadClusterFile(filename,segServer,labelServer,config); long codeSelectedFrame=labelServer.getLabelIndexByString(labelSelectedFrames); // Get the index of the selected cluster if (codeSelectedFrame==-1){ // No data for this model !!!!!!!!!!!!!! cout << " WARNING - NO DATA with the label["<<labelSelectedFrames<<"] in file ["<<filename<<"]"<<endl; exit(0); } SegCluster& cluster=segServer.getCluster(codeSelectedFrame); // Gives the cluster of the selected/used segments ULongVector tabS; unsigned long nbSym=loadSymbol(pathSymbol+filename+extSymbol,formatSymbol,tabS,config); // Read the stream of symbols SegServer segServerOutput; SegCluster& clusterOut=segServerOutput.createCluster(0,labelSelectedFrames,cluster.sourceName()); // computeLabelNGram(NGramTable,cluster,clusterOut,tabS,nbSym); // if (verbose){ cout <<"File["<<filename<<"]" <<endl; cout << "Output the new label file in ["<<pathOutput+filename+extOutputLabel <<"]"<<endl; } outputLabelFile(clusterOut,pathOutput+filename+extOutputLabel,config); } // end file loop } // fin try catch (Exception& e) { cout << e.toString().c_str() << endl; } return 0; }
int saveApost(Config &config) { bool writeAllFeature=true; // Output a vector for all input vectors (selected and not selected vectors) - DEFAULT=on if (config.existsParam("writeAllFeatures")) writeAllFeature=config.getParam("writeAllFeatures").toBool(); // Define if all the feature (selected or not) should be written String modelname = config.getParam("inputModelFilename"); String inputFeatureFileName =config.getParam("inputFeatureFilename"); // input feature - could be a simple feature file or a list of filenames XLine inputFeatureFileNameList; // The (feature) input filename list if (inputFeatureFileName.endsWith(".lst")){ // If the file parameter is the name of a XList file XList inputFileNameXList(inputFeatureFileName,config); // Read the filename list file inputFeatureFileNameList=inputFileNameXList.getAllElements(); // And put the filename in a list if the file is a list of feature filenames } else { // It was a simple feature file and not a filename list inputFeatureFileNameList.addElement(inputFeatureFileName); // add the filename in the list } try{ // read UBM MixtureServer _ms(config); StatServer _ss(config); _ms.loadMixtureGD(config.getParam("inputWorldFilename")); MixtureGD & UBM=_ms.getMixtureGD((unsigned long) 0); MixtureGDStat &acc=_ss.createAndStoreMixtureStat(UBM); unsigned long _vsize=UBM.getVectSize(); unsigned long _mixsize=UBM.getDistribCount(); // Loop over the list of feature files String *file; String labelSelectedFrames; unsigned long codeSelectedFrame; while ((file=inputFeatureFileNameList.getElement())!= NULL){ String & featureFilename=(*file); FeatureServer fs(config,featureFilename); FeatureServer fs_out(config,featureFilename); SegServer segmentsServer; LabelServer labelServer; initializeClusters(featureFilename,segmentsServer,labelServer,config); verifyClusterFile(segmentsServer,fs,config); labelSelectedFrames=config.getParam("labelSelectedFrames"); codeSelectedFrame=labelServer.getLabelIndexByString(labelSelectedFrames); SegCluster& selectedSegments=segmentsServer.getCluster(codeSelectedFrame); // Compute Occupations and Statistics acc.resetOcc(); Seg *seg; selectedSegments.rewind(); String currentSource=""; while((seg=selectedSegments.getSeg())!=NULL){ unsigned long begin=seg->begin()+fs.getFirstFeatureIndexOfASource(seg->sourceName()); // Idx of the first frame of the current file in the feature server if (currentSource!=seg->sourceName()) { currentSource=seg->sourceName(); if (verbose)cout << "Processing speaker["<<currentSource<<"]"<< endl; } fs.seekFeature(begin); Feature f; for (unsigned long idxFrame=0;idxFrame<seg->length();idxFrame++){ fs.readFeature(f); acc.computeAndAccumulateOcc(f); RealVector <double> aPost=acc.getOccVect(); Feature tmpF; for(unsigned long k=0;k<_mixsize;k++) { tmpF[k]=aPost[k]; } fs_out.addFeature(f); } } // Writing apost probabilities to file cout << "Writing to: " << featureFilename << endl; FeatureFileWriter w(featureFilename, config); // build a featurefile writer to output the features (real features) SegServer fakeSegServer; if (writeAllFeature) { // Output all the features- feature count id the same SegServer fakeSegServer; // Create a new fake segment server fakeSegServer.createCluster(0); // Create a new cluster SegCluster& fakeSeg=fakeSegServer.getCluster(0); // Get the cluster fakeSeg.add(fakeSegServer.createSeg(0,fs_out.getFeatureCount(),codeSelectedFrame, labelSelectedFrames,featureFilename)); // Add a segment with all the features outputFeatureFile(config,fs_out,fakeSeg,w); // output all the features - giving the same file length } else outputFeatureFile(config,fs_out,selectedSegments, w); // Output only the selected features - giving a shorter output } } catch (Exception& e){cout << e.toString().c_str() << endl;} return 0; }
void TurnDetection(Config& config, SegCluster& cluster,SegServer& segOutputServer, StatServer& ss,FeatureServer &fs,MixtureServer& ms,LabelServer& labelServer){ SegServer segTemp; segOutputServer.removeAllClusters(); segOutputServer.removeAllSegs(); SegServer actualSeg; String et_temp="speech"; Label l(et_temp); SegCluster& clusterSeg=actualSeg.createCluster(labelServer.addLabel(l),et_temp," "); //Create the cluster L String crit="DGLR"; if(config.existsParam("clusteringCrit")) crit=config.getParam("clusteringCrit"); double threshold=0.0; if(config.existsParam("clusteringCritThresh")) threshold=config.getParam("clusteringCritThresh").toDouble(); unsigned long winSize=50; if(config.existsParam("winSize")) winSize=config.getParam("winSize").toLong(); unsigned long winStep=5; if(config.existsParam("winStep")) winStep=config.getParam("winStep").toLong(); double alpha=0.7; if(config.existsParam("alpha")) alpha=config.getParam("alpha").toDouble(); unsigned long start1=0, end1=0; unsigned long start2=0, end2=0; unsigned long accu=0; for(unsigned long iseg=0; iseg<cluster.getCount(); iseg++){ Seg& segment=(Seg&)cluster.get(iseg); if(verbose) cout << "Segment" << iseg << ": " << segment.begin() << " " << endSeg(&segment) << endl; if(segment.length() <= 2*winSize){ clusterSeg.add(actualSeg.createSeg(segment.begin(),endSeg(&segment)-segment.begin()+1,0,segment.string(),segment.sourceName())); if(debug) cout << "add: " << segment.begin() << " " << endSeg(&segment) << endl; } else{ ObjectRefVector res; start1=segment.begin(); end1=start1+winSize-1; start2=end1+1; end2=start2+winSize-1; accu = start1; while(end2 < endSeg(&segment)){ if(verbose){ cout << "Computation between: " << start1 << " " << end1; cout << " and " << start2 << " " << end2 << endl; } SegCluster& c1=segTemp.createCluster(); c1.add(segTemp.createSeg(start1,winSize,0,"null",segment.sourceName())); SegCluster& c2=segTemp.createCluster(); c2.add(segTemp.createSeg(start2,winSize,0,"null",segment.sourceName())); CritInfo *resCrit=new CritInfo(clusteringCriterionWithoutWorldInitOneGaus(config, c1, c2, ss, fs,crit),false,end1); res.addObject((Object&)*resCrit); start1+=winStep; end1+=winStep; start2+=winStep; end2+=winStep; } /* smoothing */ /* for(unsigned long i=1; i<res.size()-1; i++){ CritInfo &resCrit=(CritInfo&)(res.getObject(i)); CritInfo &resCritP=(CritInfo&)(res.getObject(i-1)); CritInfo &resCritN=(CritInfo&)(res.getObject(i+1)); resCrit.setValue(0.25*resCritP.getValue()+0.25*resCritN.getValue()+0.5*resCrit.getValue()); } */ DoubleVector score_buffer; score_buffer.setSize(2); score_buffer[0 % 2]=((CritInfo&)(res.getObject(0))).getValue(); for(unsigned long i=1; i<res.size()-1; i++) { CritInfo &resCrit=(CritInfo&)(res.getObject(i)); CritInfo &resCritN=(CritInfo&)(res.getObject(i+1));//right window score_buffer[i % 2]=resCrit.getValue(); resCrit.setValue(0.25*score_buffer[(i-1) % 2]+0.25*resCritN.getValue()+0.5*resCrit.getValue()); } /* to look for maxima in the criterion value curve */ /* if difference on left and right of a point with neighboor points is over alpha*standard deviation => maxima is found ! */ double sum=0.0; double sum2=0.0; for(unsigned long i=0; i<res.size(); i++){ CritInfo &resCrit=(CritInfo&)res.getObject(i); sum += resCrit.getValue(); sum2+=resCrit.getValue()*resCrit.getValue(); } double mean=sum/(double)res.size(); double std=sqrt((sum2/(double)(res.size())-(mean*mean))); if(verbose){ cout << "Mean and std: " << mean << " " << std << endl; } CritInfo &resCrit=(CritInfo&)res.getObject(0); resCrit.setDec(false); for(unsigned long i=1, j=0; i<res.size()-1; i++){ /* for each value */ /* search left min */ j=i-1; double minL=((CritInfo&)res.getObject(i)).getValue(); bool ok=true; while(ok && (j > 0)){ if(((CritInfo&)res.getObject(j)).getValue() < minL){ minL =((CritInfo&)res.getObject(j)).getValue(); j--; }else{ ok = false; } } if(myabs(((CritInfo&)res.getObject(i)).getValue()-minL) > alpha*std){ // search right min j=i+1; double minR=((CritInfo&)res.getObject(i)).getValue(); ok=true; while(ok && (j < res.size())){ if(((CritInfo&)res.getObject(j)).getValue() < minR){ minR = ((CritInfo&)res.getObject(j)).getValue(); j++; }else{ ok = false; } } if(myabs(((CritInfo&)res.getObject(i)).getValue()-minR) > alpha*std){ ((CritInfo&)res.getObject(i)).setDec(true); }else{ ((CritInfo&)res.getObject(i)).setDec(false); } }else{ ((CritInfo&)res.getObject(i)).setDec(false); } /*double max=((CritInfo&)res.getObject(i)).getValue(); double minL=((CritInfo&)res.getObject(i-1)).getValue(); double minR=((CritInfo&)res.getObject(i+1)).getValue(); if((minL < max) && (minR < max) && (max > mean+std)) ((CritInfo&)res.getObject(i)).setDec(true); else ((CritInfo&)res.getObject(i)).setDec(false); */ } start1 = segment.begin(); for(unsigned long i=0; i<res.size(); i++){ cout << ((CritInfo&)res.getObject(i)).getFrame() << " " << ((CritInfo&)res.getObject(i)).getValue() << " => " << ((CritInfo&)res.getObject(i)).getDec() << endl; if(((CritInfo&)res.getObject(i)).getDec()){ clusterSeg.add(actualSeg.createSeg(start1,((CritInfo&)res.getObject(i)).getFrame()-start1+1,0,segment.string(),segment.sourceName())); if(verbose) cout << "add: " << start1 << " " << ((CritInfo&)res.getObject(i)).getFrame() << endl; start1=((CritInfo&)res.getObject(i)).getFrame()+1; } } // last point cout << "last point: " << start1 << " fin segment: " << endSeg(&segment) << endl; if(start1 < endSeg(&segment)){ clusterSeg.add(actualSeg.createSeg(start1,endSeg(&segment)-start1+1,0,segment.string(),segment.sourceName())); if(verbose) cout << "add: " << start1 << " " << endSeg(&segment) << endl; } } } displayAllClusters(config, actualSeg); segOutputServer=actualSeg; }