|
|
@@ -17,11 +17,13 @@ |
|
|
|
package com.reecedunn.espeak.test; |
|
|
|
|
|
|
|
import java.util.List; |
|
|
|
import java.util.Locale; |
|
|
|
|
|
|
|
import com.reecedunn.espeak.SpeechSynthesis; |
|
|
|
import com.reecedunn.espeak.SpeechSynthesis.Voice; |
|
|
|
|
|
|
|
import android.media.AudioFormat; |
|
|
|
import android.speech.tts.TextToSpeech; |
|
|
|
import android.test.AndroidTestCase; |
|
|
|
|
|
|
|
import static org.hamcrest.MatcherAssert.assertThat; |
|
|
@@ -29,6 +31,34 @@ import static org.hamcrest.Matchers.*; |
|
|
|
|
|
|
|
public class SpeechSynthesisTest extends AndroidTestCase |
|
|
|
{ |
|
|
|
public static final Locale af = new Locale("af"); // Afrikaans |
|
|
|
|
|
|
|
public static final Locale de = new Locale("de"); // German |
|
|
|
public static final Locale de_DE = new Locale("de", "DE"); // German (Germany) |
|
|
|
public static final Locale de_1996 = new Locale("de", "", "1996"); // German (1996 Orthography) |
|
|
|
public static final Locale de_CH_1901 = new Locale("de", "CH", "1901"); // German (Traditional Orthography,Switzerland) |
|
|
|
|
|
|
|
public static final Locale fr = new Locale("fr"); // French |
|
|
|
public static final Locale fr_FR = new Locale("fr", "FR"); // French (France) |
|
|
|
public static final Locale fr_BE = new Locale("fr", "BE"); // French (Belgium) |
|
|
|
public static final Locale fr_1694acad = new Locale("fr", "", "1694acad"); // French (Early Modern French) |
|
|
|
public static final Locale fr_FR_1694acad = new Locale("fr", "FR", "1694acad"); // French (Early Modern French,France) |
|
|
|
public static final Locale fr_BE_1694acad = new Locale("fr", "BE", "1694acad"); // French (Early Modern French,Belgium) |
|
|
|
|
|
|
|
public static final Locale hy = new Locale("hy"); // Armenian |
|
|
|
public static final Locale hy_AM = new Locale("hy", "AM"); // Armenian (Armenia) |
|
|
|
public static final Locale hy_arevela = new Locale("hy", "", "arevela"); // Armenian (Eastern) |
|
|
|
public static final Locale hy_arevmda = new Locale("hy", "", "arevmda"); // Armenian (Western) |
|
|
|
public static final Locale hy_AM_arevela = new Locale("hy", "AM", "arevela"); // Armenian (Eastern,Armenia) |
|
|
|
public static final Locale hy_AM_arevmda = new Locale("hy", "AM", "arevmda"); // Armenian (Western,Armenia) |
|
|
|
|
|
|
|
public static final Locale en = new Locale("en"); // English |
|
|
|
public static final Locale en_GB = new Locale("en", "GB"); // English (Great Britain) |
|
|
|
public static final Locale en_US = new Locale("en", "US"); // English (USA) |
|
|
|
public static final Locale en_scotland = new Locale("en", "", "scotland"); // English (Scottish) |
|
|
|
public static final Locale en_GB_scotland = new Locale("en", "GB", "scotland"); // English (Scottish,Great Britain) |
|
|
|
public static final Locale en_GB_north = new Locale("en", "GB", "north"); // English (North,Great Britain) |
|
|
|
|
|
|
|
private SpeechSynthesis.SynthReadyCallback mCallback = new SpeechSynthesis.SynthReadyCallback() |
|
|
|
{ |
|
|
|
@Override |
|
|
@@ -48,7 +78,7 @@ public class SpeechSynthesisTest extends AndroidTestCase |
|
|
|
{ |
|
|
|
if (mVoices == null) |
|
|
|
{ |
|
|
|
SpeechSynthesis synth = new SpeechSynthesis(getContext(), mCallback); |
|
|
|
final SpeechSynthesis synth = new SpeechSynthesis(getContext(), mCallback); |
|
|
|
mVoices = synth.getAvailableVoices(); |
|
|
|
assertThat(mVoices, is(notNullValue())); |
|
|
|
assertThat(mVoices.size(), is(78)); |
|
|
@@ -70,7 +100,7 @@ public class SpeechSynthesisTest extends AndroidTestCase |
|
|
|
|
|
|
|
public void checkVoice(String name, String identifier, String language, String iso3Language, String country, String iso3Country, String variant, int gender) |
|
|
|
{ |
|
|
|
Voice voice = getVoice(name); |
|
|
|
final Voice voice = getVoice(name); |
|
|
|
assertThat(voice, is(notNullValue())); |
|
|
|
assertThat(voice.name, is(name)); |
|
|
|
assertThat(voice.identifier, is(identifier)); |
|
|
@@ -85,7 +115,7 @@ public class SpeechSynthesisTest extends AndroidTestCase |
|
|
|
|
|
|
|
public void testConstruction() |
|
|
|
{ |
|
|
|
SpeechSynthesis synth = new SpeechSynthesis(getContext(), mCallback); |
|
|
|
final SpeechSynthesis synth = new SpeechSynthesis(getContext(), mCallback); |
|
|
|
assertThat(synth.getSampleRate(), is(22050)); |
|
|
|
assertThat(synth.getChannelCount(), is(1)); |
|
|
|
assertThat(synth.getAudioFormat(), is(AudioFormat.ENCODING_PCM_16BIT)); |
|
|
@@ -129,7 +159,7 @@ public class SpeechSynthesisTest extends AndroidTestCase |
|
|
|
checkVoice("ht", "test/ht", "ht", "hat", "", "", "", SpeechSynthesis.GENDER_UNSPECIFIED); // Haitian Creole |
|
|
|
checkVoice("hu", "hu", "hu", "hun", "", "", "", SpeechSynthesis.GENDER_MALE); // Hungarian |
|
|
|
checkVoice("hy", "hy", "hy", "hye", "", "", "", SpeechSynthesis.GENDER_MALE); // Armenian |
|
|
|
checkVoice("hy-west", "hy-west", "hy", "hye", "", "", "arevmda", SpeechSynthesis.GENDER_MALE); // Armenian (West) |
|
|
|
checkVoice("hy-west", "hy-west", "hy", "hye", "", "", "arevmda", SpeechSynthesis.GENDER_MALE); // Armenian (Western) |
|
|
|
checkVoice("id", "id", "in", "ind", "", "", "", SpeechSynthesis.GENDER_MALE); // Indonesia |
|
|
|
checkVoice("is", "is", "is", "isl", "", "", "", SpeechSynthesis.GENDER_MALE); // Icelandic |
|
|
|
checkVoice("it", "it", "it", "ita", "", "", "", SpeechSynthesis.GENDER_MALE); // Italian |
|
|
@@ -175,4 +205,74 @@ public class SpeechSynthesisTest extends AndroidTestCase |
|
|
|
checkVoice("zh", "zh", "zh", "zho", "", "", "", SpeechSynthesis.GENDER_MALE); // Chinese (Mandarin) |
|
|
|
checkVoice("zh-yue", "zh-yue", "yue", "", "", "", "", SpeechSynthesis.GENDER_MALE); // Chinese (Cantonese) |
|
|
|
} |
|
|
|
|
|
|
|
public void testMatchVoiceWithLanguage() |
|
|
|
{ |
|
|
|
final Voice voice = getVoice("de"); // language="de" country="" variant="" |
|
|
|
assertThat(voice, is(notNullValue())); |
|
|
|
|
|
|
|
assertThat(voice.match(fr), is(TextToSpeech.LANG_NOT_SUPPORTED)); |
|
|
|
assertThat(voice.match(fr_BE), is(TextToSpeech.LANG_NOT_SUPPORTED)); |
|
|
|
assertThat(voice.match(fr_1694acad), is(TextToSpeech.LANG_NOT_SUPPORTED)); |
|
|
|
assertThat(voice.match(fr_FR_1694acad), is(TextToSpeech.LANG_NOT_SUPPORTED)); |
|
|
|
|
|
|
|
assertThat(voice.match(de), is(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE)); |
|
|
|
assertThat(voice.match(de_1996), is(TextToSpeech.LANG_COUNTRY_AVAILABLE)); |
|
|
|
assertThat(voice.match(de_DE), is(TextToSpeech.LANG_AVAILABLE)); |
|
|
|
assertThat(voice.match(de_CH_1901), is(TextToSpeech.LANG_AVAILABLE)); |
|
|
|
} |
|
|
|
|
|
|
|
public void testMatchVoiceWithLanguageAndCountry() |
|
|
|
{ |
|
|
|
final Voice voice = getVoice("fr-fr"); // language="fr" country="fr" variant="" |
|
|
|
assertThat(voice, is(notNullValue())); |
|
|
|
|
|
|
|
assertThat(voice.match(de), is(TextToSpeech.LANG_NOT_SUPPORTED)); |
|
|
|
assertThat(voice.match(de_1996), is(TextToSpeech.LANG_NOT_SUPPORTED)); |
|
|
|
assertThat(voice.match(de_DE), is(TextToSpeech.LANG_NOT_SUPPORTED)); |
|
|
|
assertThat(voice.match(de_CH_1901), is(TextToSpeech.LANG_NOT_SUPPORTED)); |
|
|
|
|
|
|
|
assertThat(voice.match(fr), is(TextToSpeech.LANG_AVAILABLE)); |
|
|
|
assertThat(voice.match(fr_FR), is(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE)); |
|
|
|
assertThat(voice.match(fr_BE), is(TextToSpeech.LANG_AVAILABLE)); |
|
|
|
assertThat(voice.match(fr_1694acad), is(TextToSpeech.LANG_AVAILABLE)); |
|
|
|
assertThat(voice.match(fr_FR_1694acad), is(TextToSpeech.LANG_COUNTRY_AVAILABLE)); |
|
|
|
assertThat(voice.match(fr_BE_1694acad), is(TextToSpeech.LANG_AVAILABLE)); |
|
|
|
} |
|
|
|
|
|
|
|
public void testMatchVoiceWithLanguageAndVariant() |
|
|
|
{ |
|
|
|
final Voice voice = getVoice("hy-west"); // language="hy" country="" variant="arevmda" |
|
|
|
assertThat(voice, is(notNullValue())); |
|
|
|
|
|
|
|
assertThat(voice.match(fr), is(TextToSpeech.LANG_NOT_SUPPORTED)); |
|
|
|
assertThat(voice.match(fr_BE), is(TextToSpeech.LANG_NOT_SUPPORTED)); |
|
|
|
assertThat(voice.match(fr_1694acad), is(TextToSpeech.LANG_NOT_SUPPORTED)); |
|
|
|
assertThat(voice.match(fr_FR_1694acad), is(TextToSpeech.LANG_NOT_SUPPORTED)); |
|
|
|
|
|
|
|
assertThat(voice.match(hy), is(TextToSpeech.LANG_COUNTRY_AVAILABLE)); |
|
|
|
assertThat(voice.match(hy_AM), is(TextToSpeech.LANG_AVAILABLE)); |
|
|
|
assertThat(voice.match(hy_arevela), is(TextToSpeech.LANG_COUNTRY_AVAILABLE)); |
|
|
|
assertThat(voice.match(hy_arevmda), is(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE)); |
|
|
|
assertThat(voice.match(hy_AM_arevela), is(TextToSpeech.LANG_AVAILABLE)); |
|
|
|
assertThat(voice.match(hy_AM_arevmda), is(TextToSpeech.LANG_AVAILABLE)); // NOTE: Android does not support LANG_VAR_AVAILABLE. |
|
|
|
} |
|
|
|
|
|
|
|
public void testMatchVoiceWithLanguageCountryAndVariant() |
|
|
|
{ |
|
|
|
final Voice voice = getVoice("en-sc"); // language="en" country="GB" variant="scotland" |
|
|
|
assertThat(voice, is(notNullValue())); |
|
|
|
|
|
|
|
assertThat(voice.match(de), is(TextToSpeech.LANG_NOT_SUPPORTED)); |
|
|
|
assertThat(voice.match(de_1996), is(TextToSpeech.LANG_NOT_SUPPORTED)); |
|
|
|
assertThat(voice.match(de_DE), is(TextToSpeech.LANG_NOT_SUPPORTED)); |
|
|
|
assertThat(voice.match(de_CH_1901), is(TextToSpeech.LANG_NOT_SUPPORTED)); |
|
|
|
|
|
|
|
assertThat(voice.match(en), is(TextToSpeech.LANG_AVAILABLE)); |
|
|
|
assertThat(voice.match(en_GB), is(TextToSpeech.LANG_COUNTRY_AVAILABLE)); |
|
|
|
assertThat(voice.match(en_US), is(TextToSpeech.LANG_AVAILABLE)); |
|
|
|
assertThat(voice.match(en_scotland), is(TextToSpeech.LANG_AVAILABLE)); // NOTE: Android does not support LANG_VAR_AVAILABLE. |
|
|
|
assertThat(voice.match(en_GB_scotland), is(TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE)); |
|
|
|
assertThat(voice.match(en_GB_north), is(TextToSpeech.LANG_COUNTRY_AVAILABLE)); |
|
|
|
} |
|
|
|
} |