TextToSpeech.java revision 77a5d39343760d9950ca15a87db0ae778afb4f2b
1e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi/* 2e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * Copyright (C) 2009 Google Inc. 3e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * 4e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * use this file except in compliance with the License. You may obtain a copy of 6e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * the License at 7e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * 8e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 9e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * 10e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 11e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * License for the specific language governing permissions and limitations under 14e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * the License. 15e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi */ 1621a6a6d26baf32593d63226f9728ddd66f0bd571Jean-Michel Trivipackage android.speech.tts; 1721a6a6d26baf32593d63226f9728ddd66f0bd571Jean-Michel Trivi 18f85aa5a4d4e6f1ef7e07638568e27d709b8085c6Charles Chenimport android.speech.tts.ITts; 19f85aa5a4d4e6f1ef7e07638568e27d709b8085c6Charles Chenimport android.speech.tts.ITtsCallback; 20e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 21ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Triviimport android.annotation.SdkConstant; 22ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Triviimport android.annotation.SdkConstant.SdkConstantType; 23e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Triviimport android.content.ComponentName; 24e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Triviimport android.content.Context; 25e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Triviimport android.content.Intent; 26e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Triviimport android.content.ServiceConnection; 27a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Triviimport android.media.AudioManager; 28e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Triviimport android.os.IBinder; 29e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Triviimport android.os.RemoteException; 30e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Triviimport android.util.Log; 31e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 32a8518c169bb34e540b7542ad5bd3891053d01a9fJean-Michel Triviimport java.util.HashMap; 33679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Triviimport java.util.Locale; 34a8518c169bb34e540b7542ad5bd3891053d01a9fJean-Michel Trivi 35e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi/** 36e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * 3762788e9b48f884a35b89c88911b581daa6a14e08Jean-Michel Trivi * Synthesizes speech from text for immediate playback or to create a sound file. 38e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * 39e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi */ 4062788e9b48f884a35b89c88911b581daa6a14e08Jean-Michel Trivi//TODO complete javadoc + add links to constants 41a8518c169bb34e540b7542ad5bd3891053d01a9fJean-Michel Trivipublic class TextToSpeech { 42e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 4391bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi /** 4491bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi * Denotes a successful operation. 4591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi */ 46ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final int SUCCESS = 0; 4791bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi /** 4891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi * Denotes a generic operation failure. 4991bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi */ 50ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final int ERROR = -1; 5191bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi 52679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi /** 53679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi * Queue mode where all entries in the playback queue (media to be played 54679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi * and text to be synthesized) are dropped and replaced by the new entry. 55679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi */ 56ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final int QUEUE_FLUSH = 0; 57679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi /** 58679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi * Queue mode where the new entry is added at the end of the playback queue. 59679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi */ 60ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final int QUEUE_ADD = 1; 61e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 62aaf842edbfe76990413d4c002acb394f855321b5Charles Chen 63aaf842edbfe76990413d4c002acb394f855321b5Charles Chen /** 64aaf842edbfe76990413d4c002acb394f855321b5Charles Chen * Denotes the language is available exactly as specified by the locale 65aaf842edbfe76990413d4c002acb394f855321b5Charles Chen */ 66ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final int LANG_COUNTRY_VAR_AVAILABLE = 2; 67aaf842edbfe76990413d4c002acb394f855321b5Charles Chen 68aaf842edbfe76990413d4c002acb394f855321b5Charles Chen 69aaf842edbfe76990413d4c002acb394f855321b5Charles Chen /** 70aaf842edbfe76990413d4c002acb394f855321b5Charles Chen * Denotes the language is available for the language and country specified 71aaf842edbfe76990413d4c002acb394f855321b5Charles Chen * by the locale, but not the variant. 72aaf842edbfe76990413d4c002acb394f855321b5Charles Chen */ 73ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final int LANG_COUNTRY_AVAILABLE = 1; 74aaf842edbfe76990413d4c002acb394f855321b5Charles Chen 75aaf842edbfe76990413d4c002acb394f855321b5Charles Chen 76aaf842edbfe76990413d4c002acb394f855321b5Charles Chen /** 77aaf842edbfe76990413d4c002acb394f855321b5Charles Chen * Denotes the language is available for the language by the locale, 78aaf842edbfe76990413d4c002acb394f855321b5Charles Chen * but not the country and variant. 79aaf842edbfe76990413d4c002acb394f855321b5Charles Chen */ 80ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final int LANG_AVAILABLE = 0; 81aaf842edbfe76990413d4c002acb394f855321b5Charles Chen 82aaf842edbfe76990413d4c002acb394f855321b5Charles Chen /** 83aaf842edbfe76990413d4c002acb394f855321b5Charles Chen * Denotes the language data is missing. 84aaf842edbfe76990413d4c002acb394f855321b5Charles Chen */ 85ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final int LANG_MISSING_DATA = -1; 86aaf842edbfe76990413d4c002acb394f855321b5Charles Chen 87aaf842edbfe76990413d4c002acb394f855321b5Charles Chen /** 88aaf842edbfe76990413d4c002acb394f855321b5Charles Chen * Denotes the language is not supported by the current TTS engine. 89aaf842edbfe76990413d4c002acb394f855321b5Charles Chen */ 90ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final int LANG_NOT_SUPPORTED = -2; 91ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi 92ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi 93ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi /** 94ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * Broadcast Action: The TextToSpeech synthesizer has completed processing 95ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * of all the text in the speech queue. 96ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi */ 97ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 98ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final String ACTION_TTS_QUEUE_PROCESSING_COMPLETED = 99ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi "android.speech.tts.TTS_QUEUE_PROCESSING_COMPLETED"; 100aaf842edbfe76990413d4c002acb394f855321b5Charles Chen 101aaf842edbfe76990413d4c002acb394f855321b5Charles Chen 102e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi /** 103679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi * Called when the TTS has initialized. 104e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * 10591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi * The InitListener must implement the onInit function. onInit is passed a 10691bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi * status code indicating the result of the TTS initialization. 107e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi */ 108e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi public interface OnInitListener { 10991bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi public void onInit(int status); 110e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 111e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 112e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi /** 11378c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen * Called when the TTS has completed saying something that has an utterance ID set. 11478c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen * 11578c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen * The OnUtteranceCompletedListener must implement the onUtteranceCompleted function. 11678c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen * onUtteranceCompleted is passed a String that is the utteranceId given in 11778c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen * the original speak call. 11878c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen */ 11978c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen public interface OnUtteranceCompletedListener { 12078c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen public void onUtteranceCompleted(String utteranceId); 12178c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen } 12278c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen 12378c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen 12478c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen /** 125d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi * Internal constants for the TTS functionality 126d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi * 127d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi */ 128d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi public class Engine { 129d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi // default values for a TTS engine when settings are not found in the provider 13062253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 13162253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * {@hide} 13262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 133ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final int DEFAULT_RATE = 100; // 1x 13462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 13562253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * {@hide} 13662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 137ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final int DEFAULT_PITCH = 100;// 1x 13862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 13962253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * {@hide} 14062253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 141ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final int USE_DEFAULTS = 0; // false 14262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 14362253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * {@hide} 14462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 145ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final String DEFAULT_SYNTH = "com.svox.pico"; 146d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi 147a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi // default values for rendering 148ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final int DEFAULT_STREAM = AudioManager.STREAM_MUSIC; 149a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi 150d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi // return codes for a TTS engine's check data activity 15162253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 15262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * Indicates success when checking the installation status of the resources used by the 153ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * text-to-speech engine with the {@link #ACTION_CHECK_TTS_DATA} intent. 15462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 155d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi public static final int CHECK_VOICE_DATA_PASS = 1; 15662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 15762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * Indicates failure when checking the installation status of the resources used by the 158ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * text-to-speech engine with the {@link #ACTION_CHECK_TTS_DATA} intent. 15962253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 160d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi public static final int CHECK_VOICE_DATA_FAIL = 0; 16162253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 16262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * Indicates erroneous data when checking the installation status of the resources used by 163ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * the text-to-speech engine with the {@link #ACTION_CHECK_TTS_DATA} intent. 16462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 165d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi public static final int CHECK_VOICE_DATA_BAD_DATA = -1; 16662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 16762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * Indicates missing resources when checking the installation status of the resources used 168ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * by the text-to-speech engine with the {@link #ACTION_CHECK_TTS_DATA} intent. 16962253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 170d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi public static final int CHECK_VOICE_DATA_MISSING_DATA = -2; 17162253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 17262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * Indicates missing storage volume when checking the installation status of the resources 173ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * used by the text-to-speech engine with the {@link #ACTION_CHECK_TTS_DATA} intent. 17462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 17562253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi public static final int CHECK_VOICE_DATA_MISSING_VOLUME = -3; 17699a0feecd0f0aad314d7a4637d329b8a9e8c1150Charles Chen 177ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi // intents to ask engine to install data or check its data 178ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi /** 179ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * Broadcast Action: Triggers the platform Text-To-Speech engine to 180ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * start the activity that installs the resource files on the device 181ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * that are required for TTS to be operational. Since the installation 182ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * of the data can be interrupted or declined by the user, the application 183ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * shouldn't expect successful installation upon return from that intent, 184ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * and if need be, should check installation status with 185ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * {@link #ACTION_CHECK_TTS_DATA}. 186ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi */ 187ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 188ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final String ACTION_INSTALL_TTS_DATA = 189ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi "android.speech.tts.engine.INSTALL_TTS_DATA"; 190ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi 191ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi /** 19277a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi * {@hide} 19377a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi */ 19477a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 19577a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi public static final String ACTION_TTS_DATA_INSTALLED = 19677a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi "android.speech.tts.engine.TTS_DATA_INSTALLED"; 19777a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi /** 198ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * Broadcast Action: Starts the activity from the platform Text-To-Speech 199ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * engine to verify the proper installation and availability of the 200ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * resource files on the system. Upon completion, the activity will 201ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * return one of the following codes: 202ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * {@link #CHECK_VOICE_DATA_PASS}, 203ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * {@link #CHECK_VOICE_DATA_FAIL}, 204ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * {@link #CHECK_VOICE_DATA_BAD_DATA}, 205ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * {@link #CHECK_VOICE_DATA_MISSING_DATA}, or 206ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * {@link #CHECK_VOICE_DATA_MISSING_VOLUME}. 207ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * <p> Moreover, the data received in the activity result will contain the following 208ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * fields: 209ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * <ul> 210ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * <li>{@link #EXTRA_VOICE_DATA_ROOT_DIRECTORY} which 211ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * indicates the path to the location of the resource files</li>, 212ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * <li>{@link #EXTRA_VOICE_DATA_FILES} which contains 213ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * the list of all the resource files</li>, 214ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * <li>and {@link #EXTRA_VOICE_DATA_FILES_INFO} which 215ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * contains, for each resource file, the description of the language covered by 216ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * the file in the xxx-YYY format, where xxx is the 3-letter ISO language code, 217ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * and YYY is the 3-letter ISO country code.</li> 218ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * </ul> 219ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi */ 220ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 221ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final String ACTION_CHECK_TTS_DATA = 222ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi "android.speech.tts.engine.CHECK_TTS_DATA"; 223ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi 224ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi // extras for a TTS engine's check data activity 22562253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 226ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * Extra information received with the {@link #ACTION_CHECK_TTS_DATA} intent where 22762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * the text-to-speech engine specifies the path to its resources. 22862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 229ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final String EXTRA_VOICE_DATA_ROOT_DIRECTORY = "dataRoot"; 23062253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 231ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * Extra information received with the {@link #ACTION_CHECK_TTS_DATA} intent where 23262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * the text-to-speech engine specifies the file names of its resources under the 23362253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * resource path. 23462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 235ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final String EXTRA_VOICE_DATA_FILES = "dataFiles"; 23662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 237ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * Extra information received with the {@link #ACTION_CHECK_TTS_DATA} intent where 23862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * the text-to-speech engine specifies the locale associated with each resource file. 23962253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 240ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final String EXTRA_VOICE_DATA_FILES_INFO = "dataFilesInfo"; 24199a0feecd0f0aad314d7a4637d329b8a9e8c1150Charles Chen 24277a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi // extras for a TTS engine's data installation 24377a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi /** 24477a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi * Extra information received with the {@link #ACTION_TTS_DATA_INSTALLED} intent 24577a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi * which indicates whether the TTS data installation requested with 24677a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi * {@link #ACTION_INSTALL_TTS_DATA} completed successfully or not. The value is 24777a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi * {@link TextToSpeech#SUCCESS} or {@link TextToSpeech#ERROR}. 24877a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi * {@hide} 24977a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi */ 25077a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi public static final String EXTRA_TTS_DATA_INSTALLED = "dataInstalled"; 25177a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi 25262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi // keys for the parameters passed with speak commands. Hidden keys are used internally 25362253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi // to maintain engine state for each TextToSpeech instance. 25462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 25562253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * {@hide} 25662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 257ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final String KEY_PARAM_RATE = "rate"; 25862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 25962253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * {@hide} 26062253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 261ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final String KEY_PARAM_LANGUAGE = "language"; 26262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 26362253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * {@hide} 26462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 265ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final String KEY_PARAM_COUNTRY = "country"; 26662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 26762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * {@hide} 26862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 269ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final String KEY_PARAM_VARIANT = "variant"; 27062253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 27162253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * Parameter key to specify the audio stream type to be used when speaking text 27262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * or playing back a file. 27362253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 274ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final String KEY_PARAM_STREAM = "streamType"; 27562253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 27662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * Parameter key to identify an utterance in the completion listener after text has been 27762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * spoken, a file has been played back or a silence duration has elapsed. 27862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 279ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final String KEY_PARAM_UTTERANCE_ID = "utteranceId"; 28062253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi 28162253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi // key positions in the array of cached parameters 28262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 28362253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * {@hide} 28462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 285ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi protected static final int PARAM_POSITION_RATE = 0; 28662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 28762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * {@hide} 28862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 289ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi protected static final int PARAM_POSITION_LANGUAGE = 2; 29062253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 29162253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * {@hide} 29262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 293ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi protected static final int PARAM_POSITION_COUNTRY = 4; 29462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 29562253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * {@hide} 29662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 297ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi protected static final int PARAM_POSITION_VARIANT = 6; 29862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 29962253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * {@hide} 30062253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 301ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi protected static final int PARAM_POSITION_STREAM = 8; 30262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 30362253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * {@hide} 30462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 305ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi protected static final int PARAM_POSITION_UTTERANCE_ID = 10; 30662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 30762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * {@hide} 30862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 309ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi protected static final int NB_CACHED_PARAMS = 6; 310d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi } 311d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi 312d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi /** 313679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi * Connection needed for the TTS. 314e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi */ 315679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi private ServiceConnection mServiceConnection; 316e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 31791bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi private ITts mITts = null; 31878c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen private ITtsCallback mITtscallback = null; 31991bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi private Context mContext = null; 320a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen private String mPackageName = ""; 32191bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi private OnInitListener mInitListener = null; 32291bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi private boolean mStarted = false; 32391bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi private final Object mStartLock = new Object(); 324da7681e7b61dd450be72f2b4a80e6d1c86342e05Jean-Michel Trivi /** 325da7681e7b61dd450be72f2b4a80e6d1c86342e05Jean-Michel Trivi * Used to store the cached parameters sent along with each synthesis request to the 326da7681e7b61dd450be72f2b4a80e6d1c86342e05Jean-Michel Trivi * TTS service. 327da7681e7b61dd450be72f2b4a80e6d1c86342e05Jean-Michel Trivi */ 32887c9684fd0fa31fd6ad7f7e9f4cfedddc4fdc4b0Jean-Michel Trivi private String[] mCachedParams; 329e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 330e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi /** 331e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * The constructor for the TTS. 332e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * 333e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @param context 334e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * The context 33591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi * @param listener 33691bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi * The InitListener that will be called when the TTS has 337e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * initialized successfully. 338e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi */ 33991bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi public TextToSpeech(Context context, OnInitListener listener) { 34091bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mContext = context; 341a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen mPackageName = mContext.getPackageName(); 34291bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mInitListener = listener; 34387c9684fd0fa31fd6ad7f7e9f4cfedddc4fdc4b0Jean-Michel Trivi 344ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams = new String[2*Engine.NB_CACHED_PARAMS]; // store key and value 345ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_RATE] = Engine.KEY_PARAM_RATE; 346ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_LANGUAGE] = Engine.KEY_PARAM_LANGUAGE; 347ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_COUNTRY] = Engine.KEY_PARAM_COUNTRY; 348ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_VARIANT] = Engine.KEY_PARAM_VARIANT; 349ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_STREAM] = Engine.KEY_PARAM_STREAM; 350ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID] = Engine.KEY_PARAM_UTTERANCE_ID; 35187c9684fd0fa31fd6ad7f7e9f4cfedddc4fdc4b0Jean-Michel Trivi 352ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_RATE + 1] = 353ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi String.valueOf(Engine.DEFAULT_RATE); 354da7681e7b61dd450be72f2b4a80e6d1c86342e05Jean-Michel Trivi // initialize the language cached parameters with the current Locale 355da7681e7b61dd450be72f2b4a80e6d1c86342e05Jean-Michel Trivi Locale defaultLoc = Locale.getDefault(); 356ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_LANGUAGE + 1] = defaultLoc.getISO3Language(); 357ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_COUNTRY + 1] = defaultLoc.getISO3Country(); 358ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_VARIANT + 1] = defaultLoc.getVariant(); 359e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 360ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_STREAM + 1] = 361ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi String.valueOf(Engine.DEFAULT_STREAM); 362ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID + 1] = ""; 363a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi 364da7681e7b61dd450be72f2b4a80e6d1c86342e05Jean-Michel Trivi initTts(); 365e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 366e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 367e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 368e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi private void initTts() { 36991bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 370e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 371e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // Initialize the TTS, run the callback after the binding is successful 372679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi mServiceConnection = new ServiceConnection() { 373e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi public void onServiceConnected(ComponentName name, IBinder service) { 37491bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi synchronized(mStartLock) { 37591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mITts = ITts.Stub.asInterface(service); 37691bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = true; 37791bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi if (mInitListener != null) { 37891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi // TODO manage failures and missing resources 379ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mInitListener.onInit(SUCCESS); 380e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 381e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 382e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 383e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 384e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi public void onServiceDisconnected(ComponentName name) { 38591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi synchronized(mStartLock) { 38691bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mITts = null; 38791bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mInitListener = null; 38891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 389e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 390e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 391e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi }; 392e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 39352ae06521a8d4c48757b126cff233f037d0a16baCharles Chen Intent intent = new Intent("android.intent.action.START_TTS_SERVICE"); 394e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi intent.addCategory("android.intent.category.TTS"); 395679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi mContext.bindService(intent, mServiceConnection, 39691bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi Context.BIND_AUTO_CREATE); 397a8518c169bb34e540b7542ad5bd3891053d01a9fJean-Michel Trivi // TODO handle case where the binding works (should always work) but 398a8518c169bb34e540b7542ad5bd3891053d01a9fJean-Michel Trivi // the plugin fails 399e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 400e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 401e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 402e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi /** 403e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * Shuts down the TTS. It is good practice to call this in the onDestroy 404e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * method of the Activity that is using the TTS so that the TTS is stopped 405e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * cleanly. 406e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi */ 407e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi public void shutdown() { 408e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi try { 409679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi mContext.unbindService(mServiceConnection); 410e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (IllegalArgumentException e) { 411e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // Do nothing and fail silently since an error here indicates that 412e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // binding never succeeded in the first place. 413e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 414e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 415e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 416e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 417e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi /** 418e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * Adds a mapping between a string of text and a sound resource in a 419e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * package. 420ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * @see #speak(String, int, HashMap) 421e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * 422e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @param text 423e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * Example: <b><code>"south_south_east"</code></b><br/> 424e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * 425e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @param packagename 426e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * Pass the packagename of the application that contains the 427e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * resource. If the resource is in your own application (this is 428e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * the most common case), then put the packagename of your 429e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * application here.<br/> 430e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * Example: <b>"com.google.marvin.compass"</b><br/> 431e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * The packagename can be found in the AndroidManifest.xml of 432e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * your application. 433e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * <p> 434e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * <code><manifest xmlns:android="..." 435e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * package="<b>com.google.marvin.compass</b>"></code> 436e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * </p> 437e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * 438e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @param resourceId 439e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * Example: <b><code>R.raw.south_south_east</code></b> 4405c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * 441ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. 442e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi */ 4435c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen public int addSpeech(String text, String packagename, int resourceId) { 44491bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi synchronized(mStartLock) { 44591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi if (!mStarted) { 446ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi return ERROR; 447e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 448e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi try { 449a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen mITts.addSpeech(mPackageName, text, packagename, resourceId); 450ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi return SUCCESS; 451e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (RemoteException e) { 452e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 453630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - addSpeech", "RemoteException"); 454630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 45591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 456e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 457e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (NullPointerException e) { 458e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 459630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - addSpeech", "NullPointerException"); 460630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 46191bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 462e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 463e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (IllegalStateException e) { 464e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 465630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - addSpeech", "IllegalStateException"); 466630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 46791bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 468e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 469e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 470ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi return ERROR; 471e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 472e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 473e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 474e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 475e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi /** 476e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * Adds a mapping between a string of text and a sound file. Using this, it 477e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * is possible to add custom pronounciations for text. 478e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * 479e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @param text 480e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * The string of text 481e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @param filename 482e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * The full path to the sound file (for example: 483e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * "/sdcard/mysounds/hello.wav") 4845c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * 485ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. 486e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi */ 4875c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen public int addSpeech(String text, String filename) { 48891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi synchronized (mStartLock) { 48991bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi if (!mStarted) { 490ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi return ERROR; 491e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 492e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi try { 493a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen mITts.addSpeechFile(mPackageName, text, filename); 494ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi return SUCCESS; 495e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (RemoteException e) { 496e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 497630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - addSpeech", "RemoteException"); 498630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 49991bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 500e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 501e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (NullPointerException e) { 502e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 503630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - addSpeech", "NullPointerException"); 504630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 50591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 506e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 507e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (IllegalStateException e) { 508e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 509630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - addSpeech", "IllegalStateException"); 510630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 51191bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 512e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 513e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 514ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi return ERROR; 515e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 516e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 517e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 518e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 519e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi /** 520904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * Adds a mapping between a string of text and a sound resource in a 521904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * package. 522904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * 523ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * @see #playEarcon(String, int, HashMap) 524904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * 525904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * @param earcon The name of the earcon 526904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * Example: <b><code>"[tick]"</code></b><br/> 527904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * 528904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * @param packagename 529904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * Pass the packagename of the application that contains the 530904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * resource. If the resource is in your own application (this is 531904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * the most common case), then put the packagename of your 532904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * application here.<br/> 533904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * Example: <b>"com.google.marvin.compass"</b><br/> 534904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * The packagename can be found in the AndroidManifest.xml of 535904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * your application. 536904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * <p> 537904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * <code><manifest xmlns:android="..." 538904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * package="<b>com.google.marvin.compass</b>"></code> 539904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * </p> 540904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * 541904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * @param resourceId 542904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * Example: <b><code>R.raw.tick_snd</code></b> 543904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * 544ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. 545904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen */ 546904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen public int addEarcon(String earcon, String packagename, int resourceId) { 547904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen synchronized(mStartLock) { 548904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen if (!mStarted) { 549ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi return ERROR; 550904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen } 551904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen try { 552904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen mITts.addEarcon(mPackageName, earcon, packagename, resourceId); 553ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi return SUCCESS; 554904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen } catch (RemoteException e) { 555904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen // TTS died; restart it. 556904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen Log.e("TextToSpeech.java - addEarcon", "RemoteException"); 557904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen e.printStackTrace(); 558904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen mStarted = false; 559904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen initTts(); 560904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen } catch (NullPointerException e) { 561904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen // TTS died; restart it. 562904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen Log.e("TextToSpeech.java - addEarcon", "NullPointerException"); 563904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen e.printStackTrace(); 564904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen mStarted = false; 565904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen initTts(); 566904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen } catch (IllegalStateException e) { 567904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen // TTS died; restart it. 568904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen Log.e("TextToSpeech.java - addEarcon", "IllegalStateException"); 569904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen e.printStackTrace(); 570904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen mStarted = false; 571904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen initTts(); 572904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen } 573ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi return ERROR; 574904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen } 575904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen } 576904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen 577904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen 578904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen /** 579904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * Adds a mapping between a string of text and a sound file. Using this, it 580904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * is possible to add custom earcons. 581904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * 582904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * @param earcon 583904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * The name of the earcon 584904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * @param filename 585904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * The full path to the sound file (for example: 586904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * "/sdcard/mysounds/tick.wav") 587904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * 588ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. 589904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen */ 590904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen public int addEarcon(String earcon, String filename) { 591904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen synchronized (mStartLock) { 592904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen if (!mStarted) { 593ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi return ERROR; 594904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen } 595904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen try { 596904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen mITts.addEarconFile(mPackageName, earcon, filename); 597ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi return SUCCESS; 598904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen } catch (RemoteException e) { 599904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen // TTS died; restart it. 600904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen Log.e("TextToSpeech.java - addEarcon", "RemoteException"); 601904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen e.printStackTrace(); 602904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen mStarted = false; 603904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen initTts(); 604904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen } catch (NullPointerException e) { 605904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen // TTS died; restart it. 606904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen Log.e("TextToSpeech.java - addEarcon", "NullPointerException"); 607904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen e.printStackTrace(); 608904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen mStarted = false; 609904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen initTts(); 610904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen } catch (IllegalStateException e) { 611904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen // TTS died; restart it. 612904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen Log.e("TextToSpeech.java - addEarcon", "IllegalStateException"); 613904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen e.printStackTrace(); 614904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen mStarted = false; 615904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen initTts(); 616904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen } 617ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi return ERROR; 618904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen } 619904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen } 620904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen 621904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen 622904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen /** 623e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * Speaks the string using the specified queuing strategy and speech 624e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * parameters. Note that the speech parameters are not universally supported 625e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * by all engines and will be treated as a hint. The TTS library will try to 626e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * fulfill these parameters as much as possible, but there is no guarantee 627e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * that the voice used will have the properties specified. 628e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * 629e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @param text 630e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * The string of text to be spoken. 631e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @param queueMode 632679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi * The queuing strategy to use. 633ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * See QUEUE_ADD and QUEUE_FLUSH. 634e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @param params 635a8518c169bb34e540b7542ad5bd3891053d01a9fJean-Michel Trivi * The hashmap of speech parameters to be used. 6365c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * 637ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. 638e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi */ 6395c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen public int speak(String text, int queueMode, HashMap<String,String> params) 640a8518c169bb34e540b7542ad5bd3891053d01a9fJean-Michel Trivi { 64191bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi synchronized (mStartLock) { 642ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi int result = ERROR; 643e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi Log.i("TTS received: ", text); 64491bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi if (!mStarted) { 645c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen return result; 646e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 647e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi try { 648630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen if ((params != null) && (!params.isEmpty())) { 649ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi String extra = params.get(Engine.KEY_PARAM_STREAM); 650630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen if (extra != null) { 651ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_STREAM + 1] = extra; 652630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen } 653ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi extra = params.get(Engine.KEY_PARAM_UTTERANCE_ID); 654630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen if (extra != null) { 655ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID + 1] = extra; 656630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen } 657a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi } 658a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen result = mITts.speak(mPackageName, text, queueMode, mCachedParams); 659e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (RemoteException e) { 660e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 661630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - speak", "RemoteException"); 662630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 66391bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 664e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 665e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (NullPointerException e) { 666e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 667630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - speak", "NullPointerException"); 668630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 66991bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 670e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 671e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (IllegalStateException e) { 672e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 673630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - speak", "IllegalStateException"); 674630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 67591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 676e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 677c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen } finally { 678a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi resetCachedParams(); 679a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi return result; 680e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 681e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 682e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 683e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 684e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 685e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi /** 686e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * Plays the earcon using the specified queueing mode and parameters. 687e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * 688e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @param earcon 689e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * The earcon that should be played 690e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @param queueMode 691ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * See QUEUE_ADD and QUEUE_FLUSH. 692e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @param params 693a8518c169bb34e540b7542ad5bd3891053d01a9fJean-Michel Trivi * The hashmap of parameters to be used. 6945c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * 695ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. 696e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi */ 6975c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen public int playEarcon(String earcon, int queueMode, 698a8518c169bb34e540b7542ad5bd3891053d01a9fJean-Michel Trivi HashMap<String,String> params) { 69991bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi synchronized (mStartLock) { 700ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi int result = ERROR; 70191bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi if (!mStarted) { 702c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen return result; 703e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 704e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi try { 705a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi if ((params != null) && (!params.isEmpty())) { 706ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi String extra = params.get(Engine.KEY_PARAM_STREAM); 707a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi if (extra != null) { 708ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_STREAM + 1] = extra; 709a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi } 710ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi extra = params.get(Engine.KEY_PARAM_UTTERANCE_ID); 711a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi if (extra != null) { 712ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID + 1] = extra; 713a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi } 714a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi } 715a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen result = mITts.playEarcon(mPackageName, earcon, queueMode, null); 716e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (RemoteException e) { 717e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 718630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - playEarcon", "RemoteException"); 719630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 72091bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 721e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 722e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (NullPointerException e) { 723e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 724630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - playEarcon", "NullPointerException"); 725630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 72691bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 727e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 728e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (IllegalStateException e) { 729e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 730630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - playEarcon", "IllegalStateException"); 731630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 73291bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 733e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 734c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen } finally { 735a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi resetCachedParams(); 736a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi return result; 737e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 738e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 739e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 740679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi 7415c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen /** 7425c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * Plays silence for the specified amount of time using the specified 7435c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * queue mode. 7445c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * 7455c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * @param durationInMs 7465c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * A long that indicates how long the silence should last. 7475c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * @param queueMode 748ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * See QUEUE_ADD and QUEUE_FLUSH. 7495c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * 750ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. 7515c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen */ 75278c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen public int playSilence(long durationInMs, int queueMode, HashMap<String,String> params) { 753f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen synchronized (mStartLock) { 754ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi int result = ERROR; 755f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen if (!mStarted) { 756c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen return result; 757f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen } 758f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen try { 75978c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen if ((params != null) && (!params.isEmpty())) { 760ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi String extra = params.get(Engine.KEY_PARAM_UTTERANCE_ID); 76178c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen if (extra != null) { 762ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID + 1] = extra; 76378c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen } 76478c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen } 765a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen result = mITts.playSilence(mPackageName, durationInMs, queueMode, mCachedParams); 766f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen } catch (RemoteException e) { 767f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen // TTS died; restart it. 768630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - playSilence", "RemoteException"); 769630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 770f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen mStarted = false; 771f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen initTts(); 772f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen } catch (NullPointerException e) { 773f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen // TTS died; restart it. 774630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - playSilence", "NullPointerException"); 775630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 776f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen mStarted = false; 777f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen initTts(); 778f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen } catch (IllegalStateException e) { 779f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen // TTS died; restart it. 780630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - playSilence", "IllegalStateException"); 781630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 782f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen mStarted = false; 783f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen initTts(); 784c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen } finally { 785c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen return result; 786f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen } 787f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen } 788a8518c169bb34e540b7542ad5bd3891053d01a9fJean-Michel Trivi } 789e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 790e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 791e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi /** 792e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * Returns whether or not the TTS is busy speaking. 793e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * 794e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @return Whether or not the TTS is busy speaking. 795e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi */ 796e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi public boolean isSpeaking() { 79791bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi synchronized (mStartLock) { 79891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi if (!mStarted) { 799e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi return false; 800e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 801e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi try { 80291bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi return mITts.isSpeaking(); 803e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (RemoteException e) { 804e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 805630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - isSpeaking", "RemoteException"); 806630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 80791bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 808e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 809e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (NullPointerException e) { 810e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 811630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - isSpeaking", "NullPointerException"); 812630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 81391bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 814e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 815e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (IllegalStateException e) { 816e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 817630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - isSpeaking", "IllegalStateException"); 818630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 81991bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 820e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 821e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 822e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi return false; 823e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 824e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 825e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 826e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 827e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi /** 828e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * Stops speech from the TTS. 8295c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * 830ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. 831e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi */ 8325c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen public int stop() { 83391bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi synchronized (mStartLock) { 834ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi int result = ERROR; 83591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi if (!mStarted) { 836c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen return result; 837e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 838e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi try { 839a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen result = mITts.stop(mPackageName); 840e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (RemoteException e) { 841e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 842630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - stop", "RemoteException"); 843630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 84491bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 845e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 846e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (NullPointerException e) { 847e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 848630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - stop", "NullPointerException"); 849630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 85091bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 851e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 852e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (IllegalStateException e) { 853e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 854630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - stop", "IllegalStateException"); 855630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 85691bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 857e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 858c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen } finally { 859c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen return result; 860e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 861e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 862e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 863e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 864e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 865e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi /** 866e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * Sets the speech rate for the TTS engine. 867e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * 868e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * Note that the speech rate is not universally supported by all engines and 869e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * will be treated as a hint. The TTS library will try to use the specified 870e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * speech rate, but there is no guarantee. 871679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi * This has no effect on any pre-recorded speech. 872e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * 873e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @param speechRate 874679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi * The speech rate for the TTS engine. 1 is the normal speed, 875679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi * lower values slow down the speech (0.5 is half the normal speech rate), 876679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi * greater values accelerate it (2 is twice the normal speech rate). 8775c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * 878ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. 879e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi */ 8805c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen public int setSpeechRate(float speechRate) { 88191bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi synchronized (mStartLock) { 882ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi int result = ERROR; 88391bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi if (!mStarted) { 884c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen return result; 885e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 886e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi try { 887679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi if (speechRate > 0) { 888da7681e7b61dd450be72f2b4a80e6d1c86342e05Jean-Michel Trivi int rate = (int)(speechRate*100); 889ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_RATE + 1] = String.valueOf(rate); 8905e11a6ad00b062d604b30578e0fb412ae4586989Jean-Michel Trivi // the rate is not set here, instead it is cached so it will be associated 8915e11a6ad00b062d604b30578e0fb412ae4586989Jean-Michel Trivi // with all upcoming utterances. 8925e11a6ad00b062d604b30578e0fb412ae4586989Jean-Michel Trivi if (speechRate > 0.0f) { 893ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi result = SUCCESS; 8945e11a6ad00b062d604b30578e0fb412ae4586989Jean-Michel Trivi } else { 895ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi result = ERROR; 8965e11a6ad00b062d604b30578e0fb412ae4586989Jean-Michel Trivi } 897679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi } 898630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen } catch (NullPointerException e) { 899630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen // TTS died; restart it. 900630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - setSpeechRate", "NullPointerException"); 901630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 902630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen mStarted = false; 903630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen initTts(); 904630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen } catch (IllegalStateException e) { 905630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen // TTS died; restart it. 906630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - setSpeechRate", "IllegalStateException"); 907630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 90891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 909e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 910c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen } finally { 911c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen return result; 912e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 913e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 914e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 915e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 916e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 917e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi /** 9182ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi * Sets the speech pitch for the TTS engine. 9192ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi * 9202ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi * Note that the pitch is not universally supported by all engines and 9212ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi * will be treated as a hint. The TTS library will try to use the specified 9222ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi * pitch, but there is no guarantee. 9232ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi * This has no effect on any pre-recorded speech. 9242ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi * 9252ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi * @param pitch 9262ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi * The pitch for the TTS engine. 1 is the normal pitch, 9272ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi * lower values lower the tone of the synthesized voice, 9282ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi * greater values increase it. 9295c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * 930ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. 9312ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi */ 9325c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen public int setPitch(float pitch) { 9332ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi synchronized (mStartLock) { 934ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi int result = ERROR; 9352ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi if (!mStarted) { 936c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen return result; 9372ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi } 9382ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi try { 9392ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi if (pitch > 0) { 940a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen result = mITts.setPitch(mPackageName, (int)(pitch*100)); 9412ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi } 9422ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi } catch (RemoteException e) { 9432ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi // TTS died; restart it. 944630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - setPitch", "RemoteException"); 945630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 946630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen mStarted = false; 947630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen initTts(); 948630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen } catch (NullPointerException e) { 949630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen // TTS died; restart it. 950630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - setPitch", "NullPointerException"); 951630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 952630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen mStarted = false; 953630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen initTts(); 954630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen } catch (IllegalStateException e) { 955630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen // TTS died; restart it. 956630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - setPitch", "IllegalStateException"); 957630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 9582ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi mStarted = false; 9592ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi initTts(); 960c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen } finally { 961c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen return result; 9622ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi } 9632ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi } 9642ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi } 9652ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi 9662ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi 9672ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi /** 968e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * Sets the language for the TTS engine. 969e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * 970e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * Note that the language is not universally supported by all engines and 971e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * will be treated as a hint. The TTS library will try to use the specified 972679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi * language as represented by the Locale, but there is no guarantee. 973e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * 974679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi * @param loc 975679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi * The locale describing the language to be used. 9765c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * 977ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * @return code indicating the support status for the locale. See {@link #LANG_AVAILABLE}, 978ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * {@link #LANG_COUNTRY_AVAILABLE}, {@link #LANG_COUNTRY_VAR_AVAILABLE}, 979ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * {@link #LANG_MISSING_DATA} and {@link #LANG_NOT_SUPPORTED}. 980e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi */ 9815c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen public int setLanguage(Locale loc) { 98291bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi synchronized (mStartLock) { 983ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi int result = LANG_NOT_SUPPORTED; 98491bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi if (!mStarted) { 985c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen return result; 986e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 987e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi try { 988ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_LANGUAGE + 1] = loc.getISO3Language(); 989ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_COUNTRY + 1] = loc.getISO3Country(); 990ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_VARIANT + 1] = loc.getVariant(); 9919c53a5c01f7d9e2ffe93cc7ca03cac9c71968484Jean-Michel Trivi // the language is not set here, instead it is cached so it will be associated 9929c53a5c01f7d9e2ffe93cc7ca03cac9c71968484Jean-Michel Trivi // with all upcoming utterances. But we still need to report the language support, 9939c53a5c01f7d9e2ffe93cc7ca03cac9c71968484Jean-Michel Trivi // which is achieved by calling isLanguageAvailable() 9949c53a5c01f7d9e2ffe93cc7ca03cac9c71968484Jean-Michel Trivi result = mITts.isLanguageAvailable( 995ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_LANGUAGE + 1], 996ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_COUNTRY + 1], 997ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_VARIANT + 1] ); 998748efcc3fb1b369690ab4617a04f452b1832edf4Charles Chen } catch (RemoteException e) { 999e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 1000630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - setLanguage", "RemoteException"); 1001630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 1002630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen mStarted = false; 1003630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen initTts(); 1004630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen } catch (NullPointerException e) { 1005630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen // TTS died; restart it. 1006630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - setLanguage", "NullPointerException"); 1007630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 1008630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen mStarted = false; 1009630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen initTts(); 1010630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen } catch (IllegalStateException e) { 1011630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen // TTS died; restart it. 1012630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - setLanguage", "IllegalStateException"); 1013630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 101491bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 1015e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 1016c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen } finally { 1017c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen return result; 1018e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 1019e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 1020e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 1021e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 10225c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen 1023aaf842edbfe76990413d4c002acb394f855321b5Charles Chen /** 1024ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi * Returns a Locale instance describing the language currently being used by the TTS engine. 1025ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi * @return language, country (if any) and variant (if any) used by the engine stored in a Locale 1026ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi * instance, or null is the TTS engine has failed. 1027ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi */ 1028ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi public Locale getLanguage() { 1029ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi synchronized (mStartLock) { 1030ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi if (!mStarted) { 1031ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi return null; 1032ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi } 1033ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi try { 1034ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi String[] locStrings = mITts.getLanguage(); 1035ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi if (locStrings.length == 3) { 1036ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi return new Locale(locStrings[0], locStrings[1], locStrings[2]); 1037ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi } else { 1038ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi return null; 1039ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi } 1040ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi } catch (RemoteException e) { 1041ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi // TTS died; restart it. 1042630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - getLanguage", "RemoteException"); 1043630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 1044630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen mStarted = false; 1045630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen initTts(); 1046630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen } catch (NullPointerException e) { 1047630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen // TTS died; restart it. 1048630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - getLanguage", "NullPointerException"); 1049630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 1050630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen mStarted = false; 1051630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen initTts(); 1052630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen } catch (IllegalStateException e) { 1053630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen // TTS died; restart it. 1054630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - getLanguage", "IllegalStateException"); 1055630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 1056ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi mStarted = false; 1057ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi initTts(); 1058ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi } 1059ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi return null; 1060ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi } 1061ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi } 1062ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi 1063ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi /** 1064ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi * Checks if the specified language as represented by the Locale is available. 1065aaf842edbfe76990413d4c002acb394f855321b5Charles Chen * 1066aaf842edbfe76990413d4c002acb394f855321b5Charles Chen * @param loc 1067ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi * The Locale describing the language to be used. 10685c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * 1069ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * @return code indicating the support status for the locale. See {@link #LANG_AVAILABLE}, 1070ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * {@link #LANG_COUNTRY_AVAILABLE}, {@link #LANG_COUNTRY_VAR_AVAILABLE}, 1071ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * {@link #LANG_MISSING_DATA} and {@link #LANG_NOT_SUPPORTED}. 1072aaf842edbfe76990413d4c002acb394f855321b5Charles Chen */ 1073aaf842edbfe76990413d4c002acb394f855321b5Charles Chen public int isLanguageAvailable(Locale loc) { 1074ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi synchronized (mStartLock) { 1075ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi int result = LANG_NOT_SUPPORTED; 1076ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi if (!mStarted) { 1077c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen return result; 1078ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi } 1079ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi try { 1080c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen result = mITts.isLanguageAvailable(loc.getISO3Language(), 1081c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen loc.getISO3Country(), loc.getVariant()); 1082ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi } catch (RemoteException e) { 1083ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi // TTS died; restart it. 1084630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - isLanguageAvailable", "RemoteException"); 1085630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 1086630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen mStarted = false; 1087630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen initTts(); 1088630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen } catch (NullPointerException e) { 1089630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen // TTS died; restart it. 1090630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - isLanguageAvailable", "NullPointerException"); 1091630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 1092630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen mStarted = false; 1093630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen initTts(); 1094630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen } catch (IllegalStateException e) { 1095630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen // TTS died; restart it. 1096630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - isLanguageAvailable", "IllegalStateException"); 1097630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 1098ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi mStarted = false; 1099ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi initTts(); 1100c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen } finally { 1101c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen return result; 1102ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi } 1103ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi } 1104aaf842edbfe76990413d4c002acb394f855321b5Charles Chen } 1105aaf842edbfe76990413d4c002acb394f855321b5Charles Chen 1106aaf842edbfe76990413d4c002acb394f855321b5Charles Chen 1107e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi /** 1108d4989093ed708ddf9c799655ea0af7afda726426Charles Chen * Synthesizes the given text to a file using the specified parameters. 1109e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * 1110e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @param text 1111e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * The String of text that should be synthesized 1112e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @param params 1113a8518c169bb34e540b7542ad5bd3891053d01a9fJean-Michel Trivi * A hashmap of parameters. 1114e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @param filename 1115e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * The string that gives the full output filename; it should be 1116e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * something like "/sdcard/myappsounds/mysound.wav". 11175c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * 1118ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. 1119e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi */ 11205c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen public int synthesizeToFile(String text, HashMap<String,String> params, 1121e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi String filename) { 112291bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi synchronized (mStartLock) { 1123ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi int result = ERROR; 112491bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi if (!mStarted) { 1125c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen return result; 1126e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 1127e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi try { 1128630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen if ((params != null) && (!params.isEmpty())) { 1129630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen // no need to read the stream type here 1130ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi String extra = params.get(Engine.KEY_PARAM_UTTERANCE_ID); 1131630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen if (extra != null) { 1132ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID + 1] = extra; 1133630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen } 1134a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi } 1135a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi if (mITts.synthesizeToFile(mPackageName, text, mCachedParams, filename)){ 1136ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi result = SUCCESS; 11375c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen } 1138e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (RemoteException e) { 1139e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 1140630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - synthesizeToFile", "RemoteException"); 1141630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 114291bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 1143e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 1144e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (NullPointerException e) { 1145e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 1146630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - synthesizeToFile", "NullPointerException"); 1147630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 114891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 1149e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 1150e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (IllegalStateException e) { 1151e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 1152630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - synthesizeToFile", "IllegalStateException"); 1153630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 115491bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 1155e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 1156c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen } finally { 1157a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi resetCachedParams(); 1158a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi return result; 1159e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 1160e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 1161e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 1162e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 1163a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi 1164a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi /** 1165a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi * Convenience method to reset the cached parameters to the current default values 1166a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi * if they are not persistent between calls to the service. 1167a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi */ 1168a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi private void resetCachedParams() { 1169ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_STREAM + 1] = 1170ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi String.valueOf(Engine.DEFAULT_STREAM); 1171ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID+ 1] = ""; 1172a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi } 1173a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi 117478c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen /** 117578c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen * Sets the OnUtteranceCompletedListener that will fire when an utterance completes. 117678c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen * 117778c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen * @param listener 117878c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen * The OnUtteranceCompletedListener 117978c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen * 1180ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. 118178c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen */ 118278c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen public int setOnUtteranceCompletedListener( 118378c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen final OnUtteranceCompletedListener listener) { 118478c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen synchronized (mStartLock) { 1185ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi int result = ERROR; 118678c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen if (!mStarted) { 118778c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen return result; 118878c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen } 118978c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen mITtscallback = new ITtsCallback.Stub() { 119078c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen public void utteranceCompleted(String utteranceId) throws RemoteException { 119178c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen if (listener != null) { 119278c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen listener.onUtteranceCompleted(utteranceId); 119378c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen } 119478c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen } 119578c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen }; 119678c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen try { 119778c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen result = mITts.registerCallback(mPackageName, mITtscallback); 119878c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen } catch (RemoteException e) { 119978c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen // TTS died; restart it. 120078c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen Log.e("TextToSpeech.java - registerCallback", "RemoteException"); 120178c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen e.printStackTrace(); 120278c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen mStarted = false; 120378c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen initTts(); 120478c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen } catch (NullPointerException e) { 120578c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen // TTS died; restart it. 120678c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen Log.e("TextToSpeech.java - registerCallback", "NullPointerException"); 120778c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen e.printStackTrace(); 120878c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen mStarted = false; 120978c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen initTts(); 121078c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen } catch (IllegalStateException e) { 121178c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen // TTS died; restart it. 121278c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen Log.e("TextToSpeech.java - registerCallback", "IllegalStateException"); 121378c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen e.printStackTrace(); 121478c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen mStarted = false; 121578c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen initTts(); 121678c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen } finally { 121778c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen return result; 121878c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen } 121978c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen } 122078c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen } 122178c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen 1222e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi} 1223