// Build the segments with the energized frames unsigned long selectFrames(FeatureServer &fs,SegServer & segServer,double threshold,SegCluster &selectedSeg,SegCluster &outputSeg,String labelOutput,String fileName) { unsigned long countFrames=0; fs.reset(); // feature server reset unsigned long ind=0; unsigned long begin=0; bool in=false; Seg *seg; // current selectd segment selectedSeg.rewind(); // reset the reader at the begin of the input stream while((seg=selectedSeg.getSeg())!=NULL){ // For each input segments for (unsigned long idx=seg->begin();idx<seg->begin()+seg->length();idx++){ // for each frame Feature f; fs.seekFeature(idx); fs.readFeature(f); if (f[0]>threshold){ // the frame is selected countFrames++; if (in==false){ // Begin of a new segment in=true; begin=ind; } } else if (in){ // End of a segment in=false; Seg & segFake=segServer.createSeg(begin,ind-begin,0, // Create a segment - Take care : length=end-begin+1 but ind =end+1 !! labelOutput,fileName); outputSeg.add(segFake); // Add a segment } ind++; // Increment the frame index } // end of one input segment if (in){ // deal with the last energized segmeent inside the current input segment in=false; Seg & segFake=segServer.createSeg(begin,ind-begin+1,0, // Create a segment labelOutput,fileName); outputSeg.add(segFake); // Add a segment - Take care : length=end-begin+1 and ind=end in this case !! } } // end feature loop return countFrames; }
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 launchTurnDetectionProcess(Config & config){ String outputFilesPath=config.getParam("outputFilesPath"); String inputListFileName = config.getParam("listFileToSegment"); //file including the list of files to segment XLine classToAnalyse; //Array of labels to analyze classToAnalyse.reset(); if(verbose){ cout << "*********** Current Configuration ***************" << endl; for(unsigned long i=0; i<config.getParamCount(); i++){ cout << config.getParamName(i) << " => " << config.getParamContent(i) << endl; } cout << "*************************************************" << endl; } try{ XList listLabel; XList listFileName; try{ listFileName.load(inputListFileName,config); } catch(FileNotFoundException& e){ cout<<"There is no files to segment !"<<endl; exit(-1); } listFileName.rewind(); XLine *filep; while ((filep=listFileName.getLine()) != NULL){ // For each stream of audio data (in several files in the same line) const XLine & listFile=filep->getElements(); // One or several files, as several part of the same stream MixtureServer ms(config); StatServer ss(config, ms); SegServer Resultat; FeatureServer fs(config,listFile); // Reading the features (one or more files) SegServer segmentsServer; // Create the segment server for managing the segments/clusters LabelServer labelServer; // Create the lable server, for indexing the segments/clusters initializeClusters(listFile,segmentsServer,labelServer,config); // Reading the segmentation files for each feature input file verifyClusterFile(segmentsServer,fs,config); // Verify if the segments ending before the end of the feature files String fileInit=listFile.getElement(0); config.setParam("fileSize", String::valueOf(fs.getFeatureCountOfASource(fileInit))); if(config.existsParam("fileRefPath")){ // assumption: all the segments in the segment server come from the same source file !!! displayAllSegmentsFromRef(config, fileInit, fs.getFeatureCountOfASource(fileInit)); } for(unsigned long icluster=0;icluster<segmentsServer.getClusterCount();icluster++){ // for each cluster SegCluster& cluster=segmentsServer.getCluster(icluster); SegServer segOutputServer; TurnDetection(config,cluster,segOutputServer,ss,fs,ms,labelServer); displayAllSegments(config,segOutputServer); for(unsigned long i=0;i<segOutputServer.getSegCount();i++){ Seg& segment=segOutputServer.getSeg(i); Resultat.createSeg(segment.begin(),segment.length(),segment.labelCode(),segment.string(),segment.sourceName()); } }//for icluster saveSegmentation(config,Resultat,fs,outputFilesPath,1); }// while } // end try catch (Exception& e){ cout << e.toString().c_str() << endl; } }//launchTurnDetectionProcess
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; }