[mary-users] HalfphoneFeatureComputer

Jerome Perri jerome.perri at hotmail.com
Wed Sep 7 16:49:10 CEST 2011


And to be even more specific:
I think the error (if it should be one) occurs here in the 3rd line from below ("map.put..."):

    /**
     * Initialize a byte-string two-way translator,
     * setting byte values according to the position of strings
     * in the array.
     * @param strings a list of up to {@link #MAXNUM} strings to be represented by unique byte values.
     * @throws IllegalArgumentException if list of strings is longer than the maximum number of values, {@link #MAXNUM}.
     */
    public ByteStringTranslator(String[] strings)
    {
        if (strings.length > MAXNUM) {
            StringBuilder buf = new StringBuilder();
            for (int i=0; i<strings.length; i++) {
                buf.append("\""+strings[i]+"\" ");
            }
            throw new IllegalArgumentException("Too many strings for a byte-string translator: \n"+buf.toString()+ "("+strings.length+" strings)");
        }
        list = new ArrayList<String>(Arrays.asList(strings));
        map = new HashMap<String, Byte>();
        for (int i=0; i<strings.length; i++) {
            map.put(strings[i], (byte)i); //HERE NEGATIVE BYTE VALUES ARE GIVEN TO THE HALFPHONEUNITNAMES
        }
    }

From: jerome.perri at hotmail.com
To: nshmyrev at nexiwave.com; mary-users at dfki.de; marc.schroeder at dfki.de; fxavier at ircam.fr
Subject: [mary-users] HalfphoneFeatureComputer
Date: Wed, 7 Sep 2011 16:39:49 +0200








Hello all,

I would like to start my question from scratch, please:

I have now found out more about why the HalfPhoneFeatureComputer does not want to work.

I have over 70 phonemes in my phonemeset.
When I query certain HalfPhoneUnitName names as ByteFeatures, I get negative values, and in one place I think a positive value is expected.

For example if I take a look at the HalfPhoneUnitProcessor in IDE, the byte representation for "y:_L" is -113.

This negative value is given to the HalfPhoneUnit in this step:

        public HalfPhoneUnitName(String[] possiblePhonemes, String pauseSymbol)
        {
            this.name = "halfphone_unitname";
            this.pauseSymbol = pauseSymbol;
            String[] possibleValues = new String[2*possiblePhonemes.length+1];
            possibleValues[0] = "0"; // the "n/a" value
            for (int i=0; i<possiblePhonemes.length; i++) {
                possibleValues[2*i+1] = possiblePhonemes[i]+"_L";
                possibleValues[2*i+2] = possiblePhonemes[i]+"_R";
            }
            this.values = new ByteStringTranslator(possibleValues);//HERE THE NEGATIVE VALUES ARE GIVEN FOR SOME HALFPHONES
        }
----
And here is where the error then finally hits and make the HalfPhoneFeatureComputer fail (I have added a separate error handler here):

    /**
     * For the given elements and using the given feature computer, create a string representation of the 
     * target features.
     * @param featureComputer
     * @param segmentsAndBoundaries
     * @return a multi-line string.
     * @throws Exception 
     */
    public String listTargetFeatures(TargetFeatureComputer featureComputer, List<Element> segmentsAndBoundaries) throws Exception 
    {

        try {
        String pauseSymbol = featureComputer.getPauseSymbol();
        List<Target> targets = overridableCreateTargetsWithPauses(segmentsAndBoundaries, pauseSymbol);
        // Third, compute the feature vectors and convert them to text
        String header = featureComputer.getAllFeatureProcessorNamesAndValues();
        StringBuilder text = new StringBuilder();
        StringBuilder bin = new StringBuilder();
        for (Target target : targets) {
            //System.err.print("target name " + target.getName());
            String sTargetName;
            sTargetName=target.getName();
            if (target.getName().equals("y:_L"))
            {
                    int bla;
                    bla=0; // I have set a breakpoint here to track the following in detail
            }
            FeatureVector features = featureComputer.computeFeatureVector(target);
            text.append(featureComputer.toStringValues(features)).append("\n");//hier kommt der fehler
            bin.append(features.toString()).append("\n");
        }
        
        // Leave an empty line between sections:
        String out = header + "\n" + text + "\n" + bin;
        return out;
        } catch (Exception e) {
            throw new Exception("Doh!", e);
        }
    }

The error occurs in text.append(featureComputer ...).
----
The underlying calls are 

/**
     * Using the set of feature processors defined when creating the target feature computer,
     * compute a feature vector for the target
     * @param target 
     * @return a feature vector for the target
     */
    public FeatureVector computeFeatureVector(Target target)
    {
        byte[] byteFeatures = new byte[byteValuedDiscreteFeatureProcessors.length];
        short[] shortFeatures = new short[shortValuedDiscreteFeatureProcessors.length];
        float[] floatFeatures = new float[continuousFeatureProcessors.length];
        for (int i=0; i<byteValuedDiscreteFeatureProcessors.length; i++) {
            byteFeatures[i] = byteValuedDiscreteFeatureProcessors[i].process(target);//HERE THE ERROR OCCURS
        }
        for (int i=0; i<shortValuedDiscreteFeatureProcessors.length; i++) {
            shortFeatures[i] = shortValuedDiscreteFeatureProcessors[i].process(target);
        }
        for (int i=0; i<continuousFeatureProcessors.length; i++) {
            floatFeatures[i] = continuousFeatureProcessors[i].process(target);
        }
        return new FeatureVector(byteFeatures, shortFeatures, floatFeatures, 0);
    }
---
TargetFeatureComputer

  /**
     * For the given feature vector, convert each encoded value into its string representation.
     * @param features a feature vector, which must match the feature processors known to this feature computer.
     * @return a string in which the string values of all features are separated by spaces.
     * @throws IllegalArgumentException if the number of byte-valued, short-valued or continuous elements in features 
     * do not match the set of feature processors in this feature computer.
     */
    public String toStringValues(FeatureVector features)
    {
        StringBuilder buf = new StringBuilder();
        byte[] bytes = features.getByteValuedDiscreteFeatures();
        short[] shorts = features.getShortValuedDiscreteFeatures();
        float[] floats = features.getContinuousFeatures();
        if (bytes.length != byteValuedDiscreteFeatureProcessors.length
                || shorts.length != shortValuedDiscreteFeatureProcessors.length
                || floats.length != continuousFeatureProcessors.length) {
            throw new IllegalArgumentException("Number of features in argument does not match number of feature processors");
        }
        for (int i=0; i<bytes.length; i++) {
            if (buf.length() > 0) buf.append(" ");
            buf.append(byteValuedDiscreteFeatureProcessors[i].getValues()[(int)bytes[i]]); //HERE THE ERROR FINALLY OCCURS, I THINK IT WANTS A POSITIVE VALUE, BUT I HAVE NEGATIVE
        }
        for (int i=0; i<shorts.length; i++) {
            if (buf.length() > 0) buf.append(" ");
            buf.append(shortValuedDiscreteFeatureProcessors[i].getValues()[(int)shorts[i]]);
        }
        for (int i=0; i<floats.length; i++) {
            if (buf.length() > 0) buf.append(" ");
            buf.append(floats[i]);
        }
        return buf.toString();
    }

-----
MaryLanguageFeatureProcessor.HalfPhoneUnitName.getValues

Was that informative and good? :-)

Jerome


 		 	   		   		 	   		  
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.dfki.de/pipermail/mary-users/attachments/20110907/73918888/attachment-0001.htm 


More information about the Mary-users mailing list