/** * Gender. * * @param clusterSetBase the cluster set base * @param clusterSet the cluster set * @param featureSet the feature set * @param parameter the parameter * @return the cluster set * @throws Exception the exception */ public ClusterSet gender( ClusterSet clusterSetBase, ClusterSet clusterSet, AudioFeatureSet featureSet, Parameter parameter) throws Exception { String mask = parameter.getParameterSegmentationOutputFile().getMask(); boolean oldByCluster = parameter.getParameterScore().isByCluster(); boolean oldGender = parameter.getParameterScore().isGender(); String FeatureFormat = "featureSetTransformation"; AudioFeatureSet featureSet2 = loadFeature(featureSet, parameter, clusterSet, FeatureFormat + ",1:3:2:0:0:0,13,1:1:0:0"); String dir = "ester2"; InputStream genderInputStream = getClass().getResourceAsStream(dir + "/gender.gmms"); GMMArrayList genderVector = MainTools.readGMMContainer(genderInputStream, parameter.getParameterModel()); parameter.getParameterScore().setByCluster(true); parameter.getParameterScore().setGender(true); ClusterSet clustersGender = MScore.make(featureSet2, clusterSet, genderVector, null, parameter); if (parameter.getParameterDiarization().isSaveAllStep()) { parameter.getParameterSegmentationOutputFile().setMask(mask + ".g.seg"); MainTools.writeClusterSet(parameter, clustersGender, false); } parameter.getParameterSegmentationOutputFile().setMask(mask); parameter.getParameterScore().setByCluster(oldByCluster); parameter.getParameterScore().setGender(oldGender); return clustersGender; }
public ClusterSet make( AudioFeatureSet featureSet, ClusterSet clusterSet, GMMArrayList gmmList, GMMArrayList gmmTopList, Parameter parameter) throws DiarizationException, IOException { logger.info("Compute Score"); int size = gmmList.size(); logger.finer("GMM size:" + size); ArrayList<String> genderString = new ArrayList<String>(); ArrayList<String> bandwidthString = new ArrayList<String>(); for (int i = 0; i < size; i++) { String gmmName = gmmList.get(i).getName(); if (parameter.getParameterScore().isGender() == true) { if (gmmName.equals("MS")) { genderString.add(Cluster.genderStrings[1]); bandwidthString.add(Segment.bandwidthStrings[2]); } else if (gmmName.equals("FS")) { genderString.add(Cluster.genderStrings[2]); bandwidthString.add(Segment.bandwidthStrings[2]); } else if (gmmName.equals("MT")) { genderString.add(Cluster.genderStrings[1]); bandwidthString.add(Segment.bandwidthStrings[1]); } else if (gmmName.equals("FT")) { genderString.add(Cluster.genderStrings[2]); bandwidthString.add(Segment.bandwidthStrings[1]); } else { genderString.add(Cluster.genderStrings[0]); bandwidthString.add(Segment.bandwidthStrings[0]); } } else { genderString.add(Cluster.genderStrings[0]); bandwidthString.add(Segment.bandwidthStrings[0]); } } ClusterSet clusterSetResult = new ClusterSet(); for (Cluster cluster : clusterSet.clusterSetValue()) { double[] sumScoreVector = new double[size]; int[] sumLenghtVector = new int[size]; double ubmScore = 0.0; GMM gmmTop = null; if (parameter.getParameterTopGaussian().getScoreNTop() >= 0) { gmmTop = gmmTopList.get(0); } Arrays.fill(sumScoreVector, 0.0); Arrays.fill(sumLenghtVector, 0); for (Segment currantSegment : cluster) { Segment segment = (currantSegment.clone()); int end = segment.getStart() + segment.getLength(); featureSet.setCurrentShow(segment.getShowName()); double[] scoreVector = new double[size]; double maxScore = 0.0; int idxMaxScore = 0; for (int i = 0; i < size; i++) { gmmList.get(i).score_initialize(); } for (int start = segment.getStart(); start < end; start++) { for (int i = 0; i < size; i++) { GMM gmm = gmmList.get(i); if (parameter.getParameterTopGaussian().getScoreNTop() >= 0) { if (i == 0) { gmmTop.score_getAndAccumulateAndFindTopComponents( featureSet, start, parameter.getParameterTopGaussian().getScoreNTop()); } gmm.score_getAndAccumulateForComponentSubset( featureSet, start, gmmTop.getTopGaussianVector()); } else { gmm.score_getAndAccumulate(featureSet, start); } } } if (parameter.getParameterTopGaussian().getScoreNTop() >= 0) { ubmScore = gmmTop.score_getMeanLog(); gmmTop.score_getSumLog(); gmmTop.score_getCount(); gmmTop.score_reset(); } for (int i = 0; i < size; i++) { GMM gmm = gmmList.get(i); scoreVector[i] = gmm.score_getMeanLog(); sumLenghtVector[i] += gmm.score_getCount(); sumScoreVector[i] += gmm.score_getSumLog(); if (i == 0) { maxScore = scoreVector[0]; idxMaxScore = 0; } else { double value = scoreVector[i]; if (maxScore < value) { maxScore = value; idxMaxScore = i; } } gmm.score_reset(); } if (parameter.getParameterScore().isTNorm()) { double sumScore = 0; double sum2Score = 0; for (int i = 0; i < size; i++) { sumScore += scoreVector[i]; sum2Score += (scoreVector[i] * scoreVector[i]); } for (int i = 0; i < size; i++) { double value = scoreVector[i]; double mean = (sumScore - value) / (size - 1); double et = Math.sqrt(((sum2Score - (value * value)) / (size - 1)) - (mean * mean)); scoreVector[i] = (value - mean) / et; } } if (parameter.getParameterScore().isGender() == true) { segment.setBandwidth(bandwidthString.get(idxMaxScore)); segment.setInformation("segmentGender", genderString.get(idxMaxScore)); } if (parameter.getParameterScore().isBySegment()) { for (int k = 0; k < size; k++) { double score = scoreVector[k]; GMM gmm = gmmList.get(k); segment.setInformation("score:" + gmm.getName(), score); currantSegment.setInformation("score:" + gmm.getName(), score); } if (parameter.getParameterTopGaussian().getScoreNTop() >= 0) { segment.setInformation("score:" + "UBM", ubmScore); currantSegment.setInformation("score:" + "UBM", ubmScore); } } String newName = cluster.getName(); if (parameter.getParameterScore().isByCluster() == false) { if ((scoreVector[idxMaxScore] > parameter.getParameterSegmentation().getThreshold()) && (parameter.getParameterScore().getLabel() != ParameterScore.LabelType.LABEL_TYPE_NONE.ordinal())) { if (parameter.getParameterScore().getLabel() == ParameterScore.LabelType.LABEL_TYPE_ADD.ordinal()) { newName += "_"; newName += gmmList.get(idxMaxScore).getName(); } else { newName = gmmList.get(idxMaxScore).getName(); } } Cluster temporaryCluster = clusterSetResult.getOrCreateANewCluster(newName); temporaryCluster.setGender(cluster.getGender()); if (parameter.getParameterScore().isGender() == true) { temporaryCluster.setGender(genderString.get(idxMaxScore)); } temporaryCluster.addSegment(segment); } } if (parameter.getParameterScore().isByCluster()) { for (int i = 0; i < size; i++) { sumScoreVector[i] /= sumLenghtVector[i]; } if (parameter.getParameterScore().isTNorm()) { double sumScore = 0; double sum2Score = 0; for (int i = 0; i < size; i++) { sumScore += sumScoreVector[i]; sum2Score += (sumScoreVector[i] * sumScoreVector[i]); } for (int i = 0; i < size; i++) { double value = sumScoreVector[i]; double mean = (sumScore - value) / (size - 1); double et = Math.sqrt(((sum2Score - (value * value)) / (size - 1)) - (mean * mean)); sumScoreVector[i] = (value - mean) / et; } } double maxScore = sumScoreVector[0]; int idxMaxScore = 0; for (int i = 1; i < size; i++) { double s = sumScoreVector[i]; if (maxScore < s) { maxScore = s; idxMaxScore = i; } } String newName = cluster.getName(); if ((sumScoreVector[idxMaxScore] > parameter.getParameterSegmentation().getThreshold()) && (parameter.getParameterScore().getLabel() != ParameterScore.LabelType.LABEL_TYPE_NONE.ordinal())) { if (parameter.getParameterScore().getLabel() == ParameterScore.LabelType.LABEL_TYPE_ADD.ordinal()) { newName += "_"; newName += gmmList.get(idxMaxScore).getName(); } else { newName = gmmList.get(idxMaxScore).getName(); } // logger.finer("cluster name=" + cluster.getName() + " new_name=" + newName); } Cluster tempororaryCluster = clusterSetResult.getOrCreateANewCluster(newName); tempororaryCluster.setGender(cluster.getGender()); if (parameter.getParameterScore().isGender() == true) { tempororaryCluster.setGender(genderString.get(idxMaxScore)); } tempororaryCluster.setName(newName); for (Segment currantSegment : cluster) { Segment segment = (currantSegment.clone()); if (parameter.getParameterScore().isGender() == true) { segment.setBandwidth(bandwidthString.get(idxMaxScore)); } tempororaryCluster.addSegment(segment); } for (int k = 0; k < size; k++) { double score = sumScoreVector[k]; GMM gmm = gmmList.get(k); // logger.finer("****clustername = " + newName + " name=" + gmm.getName() + " =" + score+" // k="+k); // logger.log(Level.SEVERE, "****clustername = " + newName + " name=" + gmm.getName() + " // =" + score); tempororaryCluster.setInformation("score:" + gmm.getName(), score); ClusterResult cr = new ClusterResult(); cr.setName(newName); cr.getValue().put(score, gmm.getName()); System.out.println( "------ clusterResultSet.putValue(newName, gmm.getName(), score)=----------------"); System.out.println(newName + " " + gmm.getName() + " " + score); if (isName(gmm.getName())) { clusterResultSet.putValue(newName, gmm.getName(), score); } else { System.out.println("*****************" + gmm.getName() + " Non nome valido "); } } if (parameter.getParameterTopGaussian().getScoreNTop() >= 0) { // tempororaryCluster.putInformation("score:" + "length", ubmSumLen); // tempororaryCluster.putInformation("score:" + "UBM", ubmSumScore / ubmSumLen); } } } this.clusterSetResult = clusterSetResult; return clusterSetResult; }