From f9912e0c4162d4c32211d8df217c98f836c55345 Mon Sep 17 00:00:00 2001 From: "Reece H. Dunn" Date: Wed, 29 Oct 2014 18:21:31 +0000 Subject: [PATCH] TtsService: fix and test onGetVoice. The default Android 5.0 implementation enumerates the available locales. This enumerates the voices returned by eSpeak. --- .../espeak/test/TextToSpeechTest.java | 71 +++++++++++++++++++ .../src/com/reecedunn/espeak/TtsService.java | 9 ++- 2 files changed, 79 insertions(+), 1 deletion(-) diff --git a/android/eSpeakTests/src/com/reecedunn/espeak/test/TextToSpeechTest.java b/android/eSpeakTests/src/com/reecedunn/espeak/test/TextToSpeechTest.java index 22522670..9eaccc2a 100644 --- a/android/eSpeakTests/src/com/reecedunn/espeak/test/TextToSpeechTest.java +++ b/android/eSpeakTests/src/com/reecedunn/espeak/test/TextToSpeechTest.java @@ -16,8 +16,12 @@ package com.reecedunn.espeak.test; +import java.util.HashSet; import java.util.Locale; +import java.util.Set; +import android.annotation.SuppressLint; +import android.os.Build; import android.speech.tts.TextToSpeech; import static com.reecedunn.espeak.test.TtsMatcher.isTtsLangCode; @@ -26,6 +30,73 @@ import static org.hamcrest.Matchers.*; public class TextToSpeechTest extends TextToSpeechTestCase { + private Set mVoices = null; + private Set mAdded = new HashSet(); + private Set mRemoved = new HashSet(); + + @SuppressLint("NewApi") + public Set getVoices() + { + if (mVoices == null) + { + Set voiceData = getEngine().getVoices(); + assertThat(voiceData, is(notNullValue())); + + mVoices = new HashSet(); + for (android.speech.tts.Voice voice : voiceData) + { + mVoices.add(voice); + } + + Set voices = new HashSet(); + for (Object data : mVoices) + { + voices.add(((android.speech.tts.Voice)data).getName()); + } + + Set expected = new HashSet(); + for (VoiceData.Voice data : VoiceData.voices) + { + expected.add(data.name); + } + + for (String voice : voices) + { + if (!expected.contains(voice)) + { + mAdded.add(voice); + } + } + + for (String voice : expected) + { + if (!voices.contains(voice)) + { + mRemoved.add(voice); + } + } + } + return mVoices; + } + + public void testAddedVoices() + { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) + return; + + getVoices(); // Ensure that the voice data has been populated. + assertThat(mAdded.toString(), is("[]")); + } + + public void testRemovedVoices() + { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) + return; + + getVoices(); // Ensure that the voice data has been populated. + assertThat(mRemoved.toString(), is("[]")); + } + public void testUnsupportedLanguage() { assertThat(getEngine(), is(notNullValue())); diff --git a/android/src/com/reecedunn/espeak/TtsService.java b/android/src/com/reecedunn/espeak/TtsService.java index f7c380bf..9ad1a759 100644 --- a/android/src/com/reecedunn/espeak/TtsService.java +++ b/android/src/com/reecedunn/espeak/TtsService.java @@ -41,6 +41,7 @@ import android.util.Log; import com.reecedunn.espeak.SpeechSynthesis.SynthReadyCallback; +import java.util.ArrayList; import java.util.List; import java.util.Locale; @@ -205,7 +206,13 @@ public class TtsService extends TextToSpeechService { @Override public List onGetVoices() { - return super.onGetVoices(); + List voices = new ArrayList(); + for (Voice voice : mAvailableVoices) { + int quality = android.speech.tts.Voice.QUALITY_NORMAL; + int latency = android.speech.tts.Voice.LATENCY_VERY_LOW; + voices.add(new android.speech.tts.Voice(voice.name, voice.locale, quality, latency, false, null)); + } + return voices; } @Override