All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.daisy.pipeline.tts.VoiceInfo Maven / Gradle / Ivy

Go to download

Common API for TTS functionality and utility Java functions and XProc steps

There is a newer version: 7.3.0
Show newest version
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