/* * Copyright (C) 2012-2013 Reece H. Dunn * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * This Activity is used by Android to get the list of languages to display * to the user when selecting the text-to-speech language. This is by locale, * not voice name. */ package com.reecedunn.espeak; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.speech.tts.TextToSpeech.Engine; import android.util.Log; import com.reecedunn.espeak.SpeechSynthesis.SynthReadyCallback; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Locale; public class CheckVoiceData extends Activity { private static final String TAG = "eSpeakTTS"; /** Resources required for eSpeak to run correctly. */ private static final String[] BASE_RESOURCES = { "version", "intonations", "phondata", "phonindex", "phontab", "en_dict", }; public static File getDataPath(Context context) { return new File(context.getDir("voices", MODE_PRIVATE), "espeak-ng-data"); } public static boolean hasBaseResources(Context context) { final File dataPath = getDataPath(context); for (String resource : BASE_RESOURCES) { final File resourceFile = new File(dataPath, resource); if (!resourceFile.exists()) { Log.e(TAG, "Missing base resource: " + resourceFile.getPath()); return false; } } return true; } public static boolean canUpgradeResources(Context context) { try { final String version = FileUtils.read(context.getResources().openRawResource(R.raw.espeakdata_version)); final String installedVersion = FileUtils.read(new File(getDataPath(context), "version")); return !version.equals(installedVersion); } catch (Exception e) { return false; } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ArrayList availableLanguages = new ArrayList(); ArrayList unavailableLanguages = new ArrayList(); boolean haveBaseResources = hasBaseResources(this); if (!haveBaseResources || canUpgradeResources(this)) { if (!haveBaseResources) { unavailableLanguages.add(Locale.ENGLISH.toString()); } returnResults(Engine.CHECK_VOICE_DATA_FAIL, availableLanguages, unavailableLanguages); return; } final SpeechSynthesis engine = new SpeechSynthesis(this, mSynthReadyCallback); final List voices = engine.getAvailableVoices(); for (Voice voice : voices) { availableLanguages.add(voice.toString()); } returnResults(Engine.CHECK_VOICE_DATA_PASS, availableLanguages, unavailableLanguages); } private void returnResults(int result, ArrayList availableLanguages, ArrayList unavailableLanguages) { final Intent returnData = new Intent(); returnData.putStringArrayListExtra(Engine.EXTRA_AVAILABLE_VOICES, availableLanguages); returnData.putStringArrayListExtra(Engine.EXTRA_UNAVAILABLE_VOICES, unavailableLanguages); setResult(result, returnData); finish(); } private final SynthReadyCallback mSynthReadyCallback = new SynthReadyCallback() { @Override public void onSynthDataReady(byte[] audioData) { // Do nothing. } @Override public void onSynthDataComplete() { // Do nothing. } }; }