Java - Phonetic transcription - 将一种格式转换为SAMPA格式

时间:2011-06-06 17:08:52

标签: java text-to-speech

我有一个字符串,它是一个文本的语音转录,在所谓的lia_phon格式(法语phonemizer)。字符串看起来像这样:

ttoujjourr

这个字符串是法语单词“toujours”的语音转录(总是意味着)。

我想要做的是将此字符串转换为SAMPA格式,给出lia_phon phonems和sampa之间等效的列表。

例如,我们有:

(LIA_phon,SAMPA)

tt,t

ou,你

jj,Z

rr,R

因此,SAMPA格式中的“toujours”一词是tuZuR。

我想从Java自动转换这个单词。有什么想法怎么做?我正在为TTS系统Mary TTS工作,该系统专门用于SAMPA手机。

非常感谢,

艾玛

2 个答案:

答案 0 :(得分:1)

假设LIA_phon音素总是2个字符,您可以创建一个简单的Map来存储转化。然后你可以编写一个方法,一次迭代LIA_phon输入字符串2个字符并查找地图中的2个字符音素并将它们附加到StringBuilder个实例。下面,我写了一个实现,并确认它适用于单元测试(也包括在下面)。

LiaPhon.java

import java.util.HashMap;
import java.util.Map;

public class LiaPhon {
    private final static Map<String,String> LIA_PHONE_TO_SAMPA = new HashMap<String,String>();
    static {
        LIA_PHONE_TO_SAMPA.put("tt", "t");
        LIA_PHONE_TO_SAMPA.put("ou", "u");
        LIA_PHONE_TO_SAMPA.put("jj", "Z");
        LIA_PHONE_TO_SAMPA.put("rr", "R");
        // etc.
    }

    public static String liaPhone2SAMPA(String liaPhon) {
         int length = liaPhon.length();
         if (length % 2 != 0) {
             throw new IllegalArgumentException("LIA_phon must contain an even number of characters!");
         }
         StringBuilder sampa = new StringBuilder();
         for (int i=0; i<length; i+=2) {
             String liaPhonPhoneme = liaPhon.substring(i, i+2);
             String sampaPhoneme = LIA_PHONE_TO_SAMPA.get(liaPhonPhoneme);
             if (sampaPhoneme == null) {
                 throw new IllegalArgumentException("Unrecognized LIA_phon phoneme: " + liaPhonPhoneme);
             }
             sampa.append(sampaPhoneme);
         }
         return sampa.toString();
    }
}

LiaPhonTest.java

import static org.junit.Assert.*;

import org.junit.Test;

public class LiaPhonTest {
    @Test
    public void testLiaPhone2SAMPA() {
        assertEquals("tuZuR", LiaPhon.liaPhone2SAMPA("ttoujjourr"));
    }

    @Test(expected=IllegalArgumentException.class)
    public void testLiaPhone2SAMPAWithOddNumberOfLetters() {
        LiaPhon.liaPhone2SAMPA("ttoujjour");
    }   

    @Test(expected=IllegalArgumentException.class)
    public void testLiaPhone2SAMPAWithInvalidPhoneme() {
        LiaPhon.liaPhone2SAMPA("ttoujj$$ourr");
    }   
}

答案 1 :(得分:0)

听起来像一个相当简单的字符串替换操作。

public static Map<String, String> liaToSampa = new HashMap<String, String>();
static {
liaToSampa.put("tt", "t");
liaToSampa.out("ou","u");
liatoSampa.put("jj","Z");
liaToSampa.put("rr","R");
}
// etc

public static String translateLiaToSampa(String liaWord) {
   String result = liaWord;
   for (Map.Entry<String, String> entry : liaToSampa.entrySet()) {
       String liaPhoneme = entry.getKey();
       String sampaPhoneme = entry.getValue();
       result = result.replaceAll(liaPhoneme, sampaPhoneme);
   }
   return result;
}