我有一个字符串,它是文本的语音转录,称为lia_phon格式(法语音素器)。字符串看起来像这样:
ttoujjourr
这个字符串是法语单词"toujours"(意思是永远)的发音转写。
我想做的是将这个字符串转换为SAMPA格式,给定lia_phon音素和SAMPA音素之间的等价列表。
例如,我们有:
(LIA_phon,SAMPA)
tt,t
ou,u
jj,Z
rr,R
因此,在SAMPA格式中,单词"toujours"是tuZuR。
我想从Java中自动转换这个单词。你知道怎么做吗?我为TTS系统Mary TTS工作,该系统专门处理SAMPA音素。
非常感谢
Emma
假设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");
}
}
听起来像是一个相当简单的字符串替换操作。
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;
}