
org.daisy.pipeline.tts.VoiceInfo Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of tts-common Show documentation
Show all versions of tts-common Show documentation
Common API for TTS functionality and utility Java functions and XProc steps
package org.daisy.pipeline.tts;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.google.common.base.Preconditions;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
public class VoiceInfo {
private static Pattern localePattern = Pattern
.compile("(\\p{Alpha}{2})(?:[-_](\\p{Alpha}{2}))?(?:[-_](\\p{Alnum}{1,8}))*");
public enum Gender {
MALE_ADULT("male", "man", "male-adult"),
MALE_CHILD("boy", "male-young", "male-child"),
MALE_ELDERY("man-old", "male-old", "male-elder", "man-elder"),
FEMALE_CHILD("girl", "female-young", "female-child"),
FEMALE_ADULT("woman", "female", "female-adult"),
FEMALE_ELDERY("woman-old", "female-old", "woman-elder", "female-elder");
private final List variants;
private Gender(String... variants) {
this.variants = Lists.newArrayList(variants);
}
private static final Map lookup = new HashMap();
static {
Splitter splitter = Splitter.on('-').omitEmptyStrings();
for (Gender gender : EnumSet.allOf(Gender.class)) {
for (String variant : gender.variants) {
lookup.put(variant, gender);
List parts = splitter.splitToList(variant);
if (parts.size() > 1) {
lookup.put(parts.get(0) + parts.get(1), gender);
lookup.put(parts.get(1) + parts.get(0), gender);
lookup.put(parts.get(0) + '-' + parts.get(1), gender);
lookup.put(parts.get(1) + '-' + parts.get(0), gender);
lookup.put(parts.get(0) + '_' + parts.get(1), gender);
lookup.put(parts.get(1) + '_' + parts.get(0), gender);
}
}
}
}
public static Gender of(String gender) {
return lookup.get(gender);
}
}
public static Locale tagToLocale(String langtag) {
//TODO: in Java7 we would use:
//return Locale.forLanguageTag(lang)
//=> this works with BCP47 tags, and should work with old tags from RFC 3066
//TODO: use a common function for pipeline-mod-nlp and pipeline-mod-tts
Locale locale = null;
if (langtag != null) {
Matcher m = localePattern.matcher(langtag.toLowerCase());
if (m.matches()) {
locale = new Locale(m.group(1), m.group(2) != null ? m.group(2) : "");
}
}
return locale;
}
public VoiceInfo(String voiceEngine, String voiceName, String language, Gender gender,
float priority) {
this(new Voice(voiceEngine, voiceName),language,gender,priority);
}
public VoiceInfo(Voice v, String language, Gender gender, float priority) {
this(v,tagToLocale(language),gender,priority);
}
public VoiceInfo(Voice v, Locale language, Gender gender) {
this(v,language,gender,-1);
}
private VoiceInfo(Voice v, Locale locale, Gender gender, float priority) {
Preconditions.checkNotNull(v);
Preconditions.checkNotNull(locale);
Preconditions.checkNotNull(gender);
this.voice = v;
this.language = locale;
this.priority = priority;
this.gender = gender;
}
@Override
public int hashCode() {
return this.voice.hashCode() ^ this.language.hashCode();
}
public boolean equals(Object other) {
VoiceInfo o = (VoiceInfo) other;
return voice.equals(o.voice) && language.equals(o.language);
}
public Gender gender;
public Voice voice;
public Locale language;
public float priority;
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy