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. 38a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * <p>A TextToSpeech instance can only be used to synthesize text once it has completed its 39a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * initialization. Implement the {@link TextToSpeech.OnInitListener} to be 40a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * notified of the completion of the initialization.<br> 41a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * When you are done using the TextToSpeech instance, call the {@link #shutdown()} method 42a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * to release the native resources used by the TextToSpeech engine. 43e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * 44e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi */ 45a8518c169bb34e540b7542ad5bd3891053d01a9fJean-Michel Trivipublic class TextToSpeech { 46e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 4791bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi /** 4891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi * Denotes a successful operation. 4991bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi */ 50ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final int SUCCESS = 0; 5191bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi /** 5291bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi * Denotes a generic operation failure. 5391bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi */ 54ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final int ERROR = -1; 5591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi 56679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi /** 57679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi * Queue mode where all entries in the playback queue (media to be played 58679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi * and text to be synthesized) are dropped and replaced by the new entry. 59679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi */ 60ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final int QUEUE_FLUSH = 0; 61679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi /** 62679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi * Queue mode where the new entry is added at the end of the playback queue. 63679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi */ 64ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final int QUEUE_ADD = 1; 65e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 66aaf842edbfe76990413d4c002acb394f855321b5Charles Chen 67aaf842edbfe76990413d4c002acb394f855321b5Charles Chen /** 689f5eadd2eed8b95c077a15d9e3e3c66fd151c215Jean-Michel Trivi * Denotes the language is available exactly as specified by the locale. 69aaf842edbfe76990413d4c002acb394f855321b5Charles Chen */ 70ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final int LANG_COUNTRY_VAR_AVAILABLE = 2; 71aaf842edbfe76990413d4c002acb394f855321b5Charles Chen 72aaf842edbfe76990413d4c002acb394f855321b5Charles Chen 73aaf842edbfe76990413d4c002acb394f855321b5Charles Chen /** 74aaf842edbfe76990413d4c002acb394f855321b5Charles Chen * Denotes the language is available for the language and country specified 75aaf842edbfe76990413d4c002acb394f855321b5Charles Chen * by the locale, but not the variant. 76aaf842edbfe76990413d4c002acb394f855321b5Charles Chen */ 77ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final int LANG_COUNTRY_AVAILABLE = 1; 78aaf842edbfe76990413d4c002acb394f855321b5Charles Chen 79aaf842edbfe76990413d4c002acb394f855321b5Charles Chen 80aaf842edbfe76990413d4c002acb394f855321b5Charles Chen /** 81aaf842edbfe76990413d4c002acb394f855321b5Charles Chen * Denotes the language is available for the language by the locale, 82aaf842edbfe76990413d4c002acb394f855321b5Charles Chen * but not the country and variant. 83aaf842edbfe76990413d4c002acb394f855321b5Charles Chen */ 84ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final int LANG_AVAILABLE = 0; 85aaf842edbfe76990413d4c002acb394f855321b5Charles Chen 86aaf842edbfe76990413d4c002acb394f855321b5Charles Chen /** 87aaf842edbfe76990413d4c002acb394f855321b5Charles Chen * Denotes the language data is missing. 88aaf842edbfe76990413d4c002acb394f855321b5Charles Chen */ 89ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final int LANG_MISSING_DATA = -1; 90aaf842edbfe76990413d4c002acb394f855321b5Charles Chen 91aaf842edbfe76990413d4c002acb394f855321b5Charles Chen /** 92a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * Denotes the language is not supported. 93aaf842edbfe76990413d4c002acb394f855321b5Charles Chen */ 94ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final int LANG_NOT_SUPPORTED = -2; 95ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi 96ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi 97ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi /** 98ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * Broadcast Action: The TextToSpeech synthesizer has completed processing 99ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * of all the text in the speech queue. 100ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi */ 101ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 102ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final String ACTION_TTS_QUEUE_PROCESSING_COMPLETED = 103ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi "android.speech.tts.TTS_QUEUE_PROCESSING_COMPLETED"; 104aaf842edbfe76990413d4c002acb394f855321b5Charles Chen 105aaf842edbfe76990413d4c002acb394f855321b5Charles Chen 106e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi /** 107a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * Interface definition of a callback to be invoked indicating the completion of the 108a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * TextToSpeech engine initialization. 109e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi */ 110e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi public interface OnInitListener { 111a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi /** 112a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * Called to signal the completion of the TextToSpeech engine initialization. 113a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * @param status {@link TextToSpeech#SUCCESS} or {@link TextToSpeech#ERROR}. 114a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi */ 11591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi public void onInit(int status); 116e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 117e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 118e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi /** 119a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * Interface definition of a callback to be invoked indicating the TextToSpeech engine has 120a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * completed synthesizing an utterance with an utterance ID set. 12178c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen * 12278c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen */ 123a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi public interface OnUtteranceCompletedListener { 124a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi /** 125a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * Called to signal the completion of the synthesis of the utterance that was identified 126a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * with the string parameter. This identifier is the one originally passed in the 127a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * parameter hashmap of the synthesis request in 128a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * {@link TextToSpeech#speak(String, int, HashMap)} or 129a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * {@link TextToSpeech#synthesizeToFile(String, HashMap, String)} with the 130a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * {@link TextToSpeech.Engine#KEY_PARAM_UTTERANCE_ID} key. 131a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * @param utteranceId the identifier of the utterance. 13260dd360640a400d9b4a602160733281d284aaee5Charles Chen */ 13360dd360640a400d9b4a602160733281d284aaee5Charles Chen public void onUtteranceCompleted(String utteranceId); 13478c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen } 13578c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen 13678c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen 13778c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen /** 138a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * Internal constants for the TextToSpeech functionality 139d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi * 140d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi */ 141d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi public class Engine { 142d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi // default values for a TTS engine when settings are not found in the provider 14362253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 14462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * {@hide} 14562253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 146ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final int DEFAULT_RATE = 100; // 1x 14762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 14862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * {@hide} 14962253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 150ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final int DEFAULT_PITCH = 100;// 1x 15162253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 15262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * {@hide} 15362253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 154ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final int USE_DEFAULTS = 0; // false 15562253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 15662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * {@hide} 15762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 158ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final String DEFAULT_SYNTH = "com.svox.pico"; 159d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi 160a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi // default values for rendering 161a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi /** 162a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * Default audio stream used when playing synthesized speech. 163a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi */ 164ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final int DEFAULT_STREAM = AudioManager.STREAM_MUSIC; 165a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi 166d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi // return codes for a TTS engine's check data activity 16762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 16862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * Indicates success when checking the installation status of the resources used by the 169a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * TextToSpeech engine with the {@link #ACTION_CHECK_TTS_DATA} intent. 17062253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 171d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi public static final int CHECK_VOICE_DATA_PASS = 1; 17262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 17362253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * Indicates failure when checking the installation status of the resources used by the 174a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * TextToSpeech engine with the {@link #ACTION_CHECK_TTS_DATA} intent. 17562253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 176d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi public static final int CHECK_VOICE_DATA_FAIL = 0; 17762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 17862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * Indicates erroneous data when checking the installation status of the resources used by 179a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * the TextToSpeech engine with the {@link #ACTION_CHECK_TTS_DATA} intent. 18062253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 181d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi public static final int CHECK_VOICE_DATA_BAD_DATA = -1; 18262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 18362253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * Indicates missing resources when checking the installation status of the resources used 184a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * by the TextToSpeech engine with the {@link #ACTION_CHECK_TTS_DATA} intent. 18562253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 186d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi public static final int CHECK_VOICE_DATA_MISSING_DATA = -2; 18762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 18862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * Indicates missing storage volume when checking the installation status of the resources 189a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * used by the TextToSpeech engine with the {@link #ACTION_CHECK_TTS_DATA} intent. 19062253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 19162253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi public static final int CHECK_VOICE_DATA_MISSING_VOLUME = -3; 19299a0feecd0f0aad314d7a4637d329b8a9e8c1150Charles Chen 193ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi // intents to ask engine to install data or check its data 194ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi /** 195a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * Activity Action: Triggers the platform TextToSpeech engine to 196ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * start the activity that installs the resource files on the device 197ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * that are required for TTS to be operational. Since the installation 198ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * of the data can be interrupted or declined by the user, the application 199ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * shouldn't expect successful installation upon return from that intent, 200ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * and if need be, should check installation status with 201ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * {@link #ACTION_CHECK_TTS_DATA}. 202ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi */ 2039f5eadd2eed8b95c077a15d9e3e3c66fd151c215Jean-Michel Trivi @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 204ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final String ACTION_INSTALL_TTS_DATA = 205ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi "android.speech.tts.engine.INSTALL_TTS_DATA"; 206ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi 207ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi /** 2089f5eadd2eed8b95c077a15d9e3e3c66fd151c215Jean-Michel Trivi * Broadcast Action: broadcast to signal the completion of the installation of 2099f5eadd2eed8b95c077a15d9e3e3c66fd151c215Jean-Michel Trivi * the data files used by the synthesis engine. Success or failure is indicated in the 2109f5eadd2eed8b95c077a15d9e3e3c66fd151c215Jean-Michel Trivi * {@link #EXTRA_TTS_DATA_INSTALLED} extra. 21177a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi */ 21277a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 21377a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi public static final String ACTION_TTS_DATA_INSTALLED = 21477a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi "android.speech.tts.engine.TTS_DATA_INSTALLED"; 21577a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi /** 216a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * Activity Action: Starts the activity from the platform TextToSpeech 217ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * engine to verify the proper installation and availability of the 218ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * resource files on the system. Upon completion, the activity will 219ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * return one of the following codes: 220ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * {@link #CHECK_VOICE_DATA_PASS}, 221ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * {@link #CHECK_VOICE_DATA_FAIL}, 222ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * {@link #CHECK_VOICE_DATA_BAD_DATA}, 223ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * {@link #CHECK_VOICE_DATA_MISSING_DATA}, or 224ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * {@link #CHECK_VOICE_DATA_MISSING_VOLUME}. 225ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * <p> Moreover, the data received in the activity result will contain the following 226ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * fields: 227ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * <ul> 228ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * <li>{@link #EXTRA_VOICE_DATA_ROOT_DIRECTORY} which 229a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * indicates the path to the location of the resource files,</li> 230ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * <li>{@link #EXTRA_VOICE_DATA_FILES} which contains 231a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * the list of all the resource files,</li> 232ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * <li>and {@link #EXTRA_VOICE_DATA_FILES_INFO} which 233ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * contains, for each resource file, the description of the language covered by 234ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * the file in the xxx-YYY format, where xxx is the 3-letter ISO language code, 235ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * and YYY is the 3-letter ISO country code.</li> 236ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * </ul> 237ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi */ 2389f5eadd2eed8b95c077a15d9e3e3c66fd151c215Jean-Michel Trivi @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 239ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final String ACTION_CHECK_TTS_DATA = 240ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi "android.speech.tts.engine.CHECK_TTS_DATA"; 241ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi 242ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi // extras for a TTS engine's check data activity 24362253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 244ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * Extra information received with the {@link #ACTION_CHECK_TTS_DATA} intent where 245a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * the TextToSpeech engine specifies the path to its resources. 24662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 247ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final String EXTRA_VOICE_DATA_ROOT_DIRECTORY = "dataRoot"; 24862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 249ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * Extra information received with the {@link #ACTION_CHECK_TTS_DATA} intent where 250a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * the TextToSpeech engine specifies the file names of its resources under the 25162253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * resource path. 25262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 253ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final String EXTRA_VOICE_DATA_FILES = "dataFiles"; 25462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 255ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * Extra information received with the {@link #ACTION_CHECK_TTS_DATA} intent where 256a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * the TextToSpeech engine specifies the locale associated with each resource file. 25762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 258ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final String EXTRA_VOICE_DATA_FILES_INFO = "dataFilesInfo"; 25976d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen /** 26076d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen * Extra information received with the {@link #ACTION_CHECK_TTS_DATA} intent where 26176d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen * the TextToSpeech engine returns an ArrayList<String> of all the available voices. 26276d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen * The format of each voice is: lang-COUNTRY-variant where COUNTRY and variant are 26376d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen * optional (ie, "eng" or "eng-USA" or "eng-USA-FEMALE"). 26476d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen */ 26576d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen public static final String EXTRA_AVAILABLE_VOICES = "availableVoices"; 26676d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen /** 26776d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen * Extra information received with the {@link #ACTION_CHECK_TTS_DATA} intent where 26876d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen * the TextToSpeech engine returns an ArrayList<String> of all the unavailable voices. 26976d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen * The format of each voice is: lang-COUNTRY-variant where COUNTRY and variant are 27076d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen * optional (ie, "eng" or "eng-USA" or "eng-USA-FEMALE"). 27176d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen */ 27276d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen public static final String EXTRA_UNAVAILABLE_VOICES = "unavailableVoices"; 27376d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen /** 27476d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen * Extra information sent with the {@link #ACTION_CHECK_TTS_DATA} intent where the 27576d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen * caller indicates to the TextToSpeech engine which specific sets of voice data to 27676d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen * check for by sending an ArrayList<String> of the voices that are of interest. 27776d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen * The format of each voice is: lang-COUNTRY-variant where COUNTRY and variant are 27876d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen * optional (ie, "eng" or "eng-USA" or "eng-USA-FEMALE"). 27976d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen */ 28076d9c3cb4f6f8c027959d2951e35a8b37762a1f3Charles Chen public static final String EXTRA_CHECK_VOICE_DATA_FOR = "checkVoiceDataFor"; 28199a0feecd0f0aad314d7a4637d329b8a9e8c1150Charles Chen 28277a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi // extras for a TTS engine's data installation 28377a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi /** 2849f5eadd2eed8b95c077a15d9e3e3c66fd151c215Jean-Michel Trivi * Extra information received with the {@link #ACTION_TTS_DATA_INSTALLED} intent. 2859f5eadd2eed8b95c077a15d9e3e3c66fd151c215Jean-Michel Trivi * It indicates whether the data files for the synthesis engine were successfully 2869f5eadd2eed8b95c077a15d9e3e3c66fd151c215Jean-Michel Trivi * installed. The installation was initiated with the {@link #ACTION_INSTALL_TTS_DATA} 2879f5eadd2eed8b95c077a15d9e3e3c66fd151c215Jean-Michel Trivi * intent. The possible values for this extra are 2889f5eadd2eed8b95c077a15d9e3e3c66fd151c215Jean-Michel Trivi * {@link TextToSpeech#SUCCESS} and {@link TextToSpeech#ERROR}. 28977a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi */ 29077a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi public static final String EXTRA_TTS_DATA_INSTALLED = "dataInstalled"; 29177a5d39343760d9950ca15a87db0ae778afb4f2bJean-Michel Trivi 29262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi // keys for the parameters passed with speak commands. Hidden keys are used internally 29362253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi // to maintain engine state for each TextToSpeech instance. 29462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 29562253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * {@hide} 29662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 297ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final String KEY_PARAM_RATE = "rate"; 29862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 29962253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * {@hide} 30062253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 301ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final String KEY_PARAM_LANGUAGE = "language"; 30262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 30362253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * {@hide} 30462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 305ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final String KEY_PARAM_COUNTRY = "country"; 30662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 30762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * {@hide} 30862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 309ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final String KEY_PARAM_VARIANT = "variant"; 31062253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 31160dd360640a400d9b4a602160733281d284aaee5Charles Chen * {@hide} 31260dd360640a400d9b4a602160733281d284aaee5Charles Chen */ 31360dd360640a400d9b4a602160733281d284aaee5Charles Chen public static final String KEY_PARAM_ENGINE = "engine"; 31460dd360640a400d9b4a602160733281d284aaee5Charles Chen /** 3151a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen * {@hide} 3161a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen */ 3171a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen public static final String KEY_PARAM_PITCH = "pitch"; 3181a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen /** 31962253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * Parameter key to specify the audio stream type to be used when speaking text 32062253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * or playing back a file. 321a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * @see TextToSpeech#speak(String, int, HashMap) 322a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * @see TextToSpeech#playEarcon(String, int, HashMap) 32362253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 324ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final String KEY_PARAM_STREAM = "streamType"; 32562253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 326a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * Parameter key to identify an utterance in the 327a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * {@link TextToSpeech.OnUtteranceCompletedListener} after text has been 32862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * spoken, a file has been played back or a silence duration has elapsed. 329a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * @see TextToSpeech#speak(String, int, HashMap) 330a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * @see TextToSpeech#playEarcon(String, int, HashMap) 331a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * @see TextToSpeech#synthesizeToFile(String, HashMap, String) 33262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 333ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi public static final String KEY_PARAM_UTTERANCE_ID = "utteranceId"; 33462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi 33562253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi // key positions in the array of cached parameters 33662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 33762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * {@hide} 33862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 339ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi protected static final int PARAM_POSITION_RATE = 0; 34062253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 34162253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * {@hide} 34262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 343ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi protected static final int PARAM_POSITION_LANGUAGE = 2; 34462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 34562253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * {@hide} 34662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 347ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi protected static final int PARAM_POSITION_COUNTRY = 4; 34862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 34962253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * {@hide} 35062253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 351ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi protected static final int PARAM_POSITION_VARIANT = 6; 35262253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 35362253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * {@hide} 35462253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 355ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi protected static final int PARAM_POSITION_STREAM = 8; 35662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 35762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * {@hide} 35862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 359ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi protected static final int PARAM_POSITION_UTTERANCE_ID = 10; 36060dd360640a400d9b4a602160733281d284aaee5Charles Chen 36160dd360640a400d9b4a602160733281d284aaee5Charles Chen /** 36260dd360640a400d9b4a602160733281d284aaee5Charles Chen * {@hide} 36360dd360640a400d9b4a602160733281d284aaee5Charles Chen */ 36460dd360640a400d9b4a602160733281d284aaee5Charles Chen protected static final int PARAM_POSITION_ENGINE = 12; 36560dd360640a400d9b4a602160733281d284aaee5Charles Chen 36662253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi /** 36762253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi * {@hide} 36862253a319d6359ce71c547d0b0aa36ba17789ab4Jean-Michel Trivi */ 3691a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen protected static final int PARAM_POSITION_PITCH = 14; 3701a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen 3711a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen /** 3721a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen * {@hide} 3731a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen */ 3741a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen protected static final int NB_CACHED_PARAMS = 8; 375d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi } 376d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi 377d146874d7341bc9602c93719582b4209e7b81f01Jean-Michel Trivi /** 378679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi * Connection needed for the TTS. 379e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi */ 380679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi private ServiceConnection mServiceConnection; 381e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 38291bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi private ITts mITts = null; 38378c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen private ITtsCallback mITtscallback = null; 38491bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi private Context mContext = null; 385a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen private String mPackageName = ""; 38691bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi private OnInitListener mInitListener = null; 38791bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi private boolean mStarted = false; 38891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi private final Object mStartLock = new Object(); 389da7681e7b61dd450be72f2b4a80e6d1c86342e05Jean-Michel Trivi /** 390da7681e7b61dd450be72f2b4a80e6d1c86342e05Jean-Michel Trivi * Used to store the cached parameters sent along with each synthesis request to the 391da7681e7b61dd450be72f2b4a80e6d1c86342e05Jean-Michel Trivi * TTS service. 392da7681e7b61dd450be72f2b4a80e6d1c86342e05Jean-Michel Trivi */ 39387c9684fd0fa31fd6ad7f7e9f4cfedddc4fdc4b0Jean-Michel Trivi private String[] mCachedParams; 394e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 395e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi /** 396a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * The constructor for the TextToSpeech class. 397a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * This will also initialize the associated TextToSpeech engine if it isn't already running. 398e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * 399e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @param context 400a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * The context this instance is running in. 40191bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi * @param listener 402a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * The {@link TextToSpeech.OnInitListener} that will be called when the 403a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * TextToSpeech engine has initialized. 404e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi */ 40591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi public TextToSpeech(Context context, OnInitListener listener) { 40691bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mContext = context; 407a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen mPackageName = mContext.getPackageName(); 40891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mInitListener = listener; 40987c9684fd0fa31fd6ad7f7e9f4cfedddc4fdc4b0Jean-Michel Trivi 410ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams = new String[2*Engine.NB_CACHED_PARAMS]; // store key and value 411ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_RATE] = Engine.KEY_PARAM_RATE; 412ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_LANGUAGE] = Engine.KEY_PARAM_LANGUAGE; 413ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_COUNTRY] = Engine.KEY_PARAM_COUNTRY; 414ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_VARIANT] = Engine.KEY_PARAM_VARIANT; 415ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_STREAM] = Engine.KEY_PARAM_STREAM; 416ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID] = Engine.KEY_PARAM_UTTERANCE_ID; 41760dd360640a400d9b4a602160733281d284aaee5Charles Chen mCachedParams[Engine.PARAM_POSITION_ENGINE] = Engine.KEY_PARAM_ENGINE; 4181a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen mCachedParams[Engine.PARAM_POSITION_PITCH] = Engine.KEY_PARAM_PITCH; 41987c9684fd0fa31fd6ad7f7e9f4cfedddc4fdc4b0Jean-Michel Trivi 4201a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen // Leave all defaults that are shown in Settings uninitialized/at the default 4211a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen // so that the values set in Settings will take effect if the application does 4226a8b73be572f37b471322e7d49b44c3783633d96Charles Chen // not try to change these settings itself. 4236a8b73be572f37b471322e7d49b44c3783633d96Charles Chen mCachedParams[Engine.PARAM_POSITION_RATE + 1] = ""; 4246a8b73be572f37b471322e7d49b44c3783633d96Charles Chen mCachedParams[Engine.PARAM_POSITION_LANGUAGE + 1] = ""; 4256a8b73be572f37b471322e7d49b44c3783633d96Charles Chen mCachedParams[Engine.PARAM_POSITION_COUNTRY + 1] = ""; 4266a8b73be572f37b471322e7d49b44c3783633d96Charles Chen mCachedParams[Engine.PARAM_POSITION_VARIANT + 1] = ""; 427ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_STREAM + 1] = 428ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi String.valueOf(Engine.DEFAULT_STREAM); 429ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID + 1] = ""; 4306a8b73be572f37b471322e7d49b44c3783633d96Charles Chen mCachedParams[Engine.PARAM_POSITION_ENGINE + 1] = ""; 4311a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen mCachedParams[Engine.PARAM_POSITION_PITCH + 1] = "100"; 432a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi 433da7681e7b61dd450be72f2b4a80e6d1c86342e05Jean-Michel Trivi initTts(); 434e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 435e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 436e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 437e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi private void initTts() { 43891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 439e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 440e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // Initialize the TTS, run the callback after the binding is successful 441679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi mServiceConnection = new ServiceConnection() { 442e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi public void onServiceConnected(ComponentName name, IBinder service) { 44391bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi synchronized(mStartLock) { 44491bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mITts = ITts.Stub.asInterface(service); 44591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = true; 4461a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen // Cache the default engine and current language 4471a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen setEngineByPackageName(getDefaultEngine()); 4481a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen setLanguage(getLanguage()); 44991bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi if (mInitListener != null) { 45091bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi // TODO manage failures and missing resources 451ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mInitListener.onInit(SUCCESS); 452e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 453e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 454e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 455e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 456e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi public void onServiceDisconnected(ComponentName name) { 45791bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi synchronized(mStartLock) { 45891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mITts = null; 45991bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mInitListener = null; 46091bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 461e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 462e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 463e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi }; 464e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 46552ae06521a8d4c48757b126cff233f037d0a16baCharles Chen Intent intent = new Intent("android.intent.action.START_TTS_SERVICE"); 466e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi intent.addCategory("android.intent.category.TTS"); 4671e13a02320aa165c22172d43b2b3c3cd8ad35cf7Jean-Michel Trivi boolean bound = mContext.bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE); 4681e13a02320aa165c22172d43b2b3c3cd8ad35cf7Jean-Michel Trivi if (!bound) { 4691e13a02320aa165c22172d43b2b3c3cd8ad35cf7Jean-Michel Trivi Log.e("TextToSpeech.java", "initTts() failed to bind to service"); 4701e13a02320aa165c22172d43b2b3c3cd8ad35cf7Jean-Michel Trivi if (mInitListener != null) { 4711e13a02320aa165c22172d43b2b3c3cd8ad35cf7Jean-Michel Trivi mInitListener.onInit(ERROR); 4721e13a02320aa165c22172d43b2b3c3cd8ad35cf7Jean-Michel Trivi } 4731e13a02320aa165c22172d43b2b3c3cd8ad35cf7Jean-Michel Trivi } else { 4741e13a02320aa165c22172d43b2b3c3cd8ad35cf7Jean-Michel Trivi // initialization listener will be called inside ServiceConnection 4751e13a02320aa165c22172d43b2b3c3cd8ad35cf7Jean-Michel Trivi Log.i("TextToSpeech.java", "initTts() successfully bound to service"); 4761e13a02320aa165c22172d43b2b3c3cd8ad35cf7Jean-Michel Trivi } 4771e13a02320aa165c22172d43b2b3c3cd8ad35cf7Jean-Michel Trivi // TODO handle plugin failures 478e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 479e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 480e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 481e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi /** 482a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * Releases the resources used by the TextToSpeech engine. 483a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * It is good practice for instance to call this method in the onDestroy() method of an Activity 484a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * so the TextToSpeech engine can be cleanly stopped. 485e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi */ 486e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi public void shutdown() { 487e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi try { 488679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi mContext.unbindService(mServiceConnection); 489e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (IllegalArgumentException e) { 490e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // Do nothing and fail silently since an error here indicates that 491e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // binding never succeeded in the first place. 492e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 493e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 494e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 495e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 496e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi /** 497e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * Adds a mapping between a string of text and a sound resource in a 498a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * package. After a call to this method, subsequent calls to 499a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * {@link #speak(String, int, HashMap)} will play the specified sound resource 500a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * if it is available, or synthesize the text it is missing. 501e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * 502e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @param text 503a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * The string of text. Example: <code>"south_south_east"</code> 504e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * 505e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @param packagename 506e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * Pass the packagename of the application that contains the 507e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * resource. If the resource is in your own application (this is 508e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * the most common case), then put the packagename of your 509e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * application here.<br/> 510e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * Example: <b>"com.google.marvin.compass"</b><br/> 511e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * The packagename can be found in the AndroidManifest.xml of 512e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * your application. 513e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * <p> 514e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * <code><manifest xmlns:android="..." 515e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * package="<b>com.google.marvin.compass</b>"></code> 516e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * </p> 517e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * 518e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @param resourceId 519a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * Example: <code>R.raw.south_south_east</code> 5205c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * 521ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. 522e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi */ 5235c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen public int addSpeech(String text, String packagename, int resourceId) { 52491bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi synchronized(mStartLock) { 52591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi if (!mStarted) { 526ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi return ERROR; 527e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 528e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi try { 529a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen mITts.addSpeech(mPackageName, text, packagename, resourceId); 530ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi return SUCCESS; 531e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (RemoteException e) { 532e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 533630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - addSpeech", "RemoteException"); 534630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 53591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 536e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 537e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (NullPointerException e) { 538e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 539630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - addSpeech", "NullPointerException"); 540630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 54191bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 542e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 543e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (IllegalStateException e) { 544e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 545630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - addSpeech", "IllegalStateException"); 546630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 54791bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 548e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 549e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 550ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi return ERROR; 551e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 552e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 553e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 554e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 555e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi /** 556e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * Adds a mapping between a string of text and a sound file. Using this, it 557a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * is possible to add custom pronounciations for a string of text. 558a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * After a call to this method, subsequent calls to {@link #speak(String, int, HashMap)} 559a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * will play the specified sound resource if it is available, or synthesize the text it is 560a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * missing. 561e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * 562e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @param text 563a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * The string of text. Example: <code>"south_south_east"</code> 564e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @param filename 565e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * The full path to the sound file (for example: 566e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * "/sdcard/mysounds/hello.wav") 5675c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * 568ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. 569e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi */ 5705c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen public int addSpeech(String text, String filename) { 57191bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi synchronized (mStartLock) { 57291bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi if (!mStarted) { 573ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi return ERROR; 574e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 575e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi try { 576a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen mITts.addSpeechFile(mPackageName, text, filename); 577ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi return SUCCESS; 578e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (RemoteException e) { 579e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 580630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - addSpeech", "RemoteException"); 581630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 58291bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 583e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 584e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (NullPointerException e) { 585e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 586630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - addSpeech", "NullPointerException"); 587630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 58891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 589e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 590e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (IllegalStateException e) { 591e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 592630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - addSpeech", "IllegalStateException"); 593630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 59491bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 595e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 596e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 597ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi return ERROR; 598e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 599e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 600e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 601e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 602e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi /** 603904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * Adds a mapping between a string of text and a sound resource in a 604a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * package. Use this to add custom earcons. 605904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * 606ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * @see #playEarcon(String, int, HashMap) 607904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * 608a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * @param earcon The name of the earcon. 609a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * Example: <code>"[tick]"</code><br/> 610904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * 611904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * @param packagename 612a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * the package name of the application that contains the 613a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * resource. This can for instance be the package name of your own application. 614904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * Example: <b>"com.google.marvin.compass"</b><br/> 615a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * The package name can be found in the AndroidManifest.xml of 616a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * the application containing the resource. 617904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * <p> 618904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * <code><manifest xmlns:android="..." 619904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * package="<b>com.google.marvin.compass</b>"></code> 620904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * </p> 621904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * 622904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * @param resourceId 623a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * Example: <code>R.raw.tick_snd</code> 624904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * 625ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. 626904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen */ 627904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen public int addEarcon(String earcon, String packagename, int resourceId) { 628904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen synchronized(mStartLock) { 629904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen if (!mStarted) { 630ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi return ERROR; 631904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen } 632904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen try { 633904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen mITts.addEarcon(mPackageName, earcon, packagename, resourceId); 634ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi return SUCCESS; 635904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen } catch (RemoteException e) { 636904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen // TTS died; restart it. 637904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen Log.e("TextToSpeech.java - addEarcon", "RemoteException"); 638904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen e.printStackTrace(); 639904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen mStarted = false; 640904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen initTts(); 641904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen } catch (NullPointerException e) { 642904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen // TTS died; restart it. 643904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen Log.e("TextToSpeech.java - addEarcon", "NullPointerException"); 644904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen e.printStackTrace(); 645904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen mStarted = false; 646904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen initTts(); 647904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen } catch (IllegalStateException e) { 648904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen // TTS died; restart it. 649904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen Log.e("TextToSpeech.java - addEarcon", "IllegalStateException"); 650904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen e.printStackTrace(); 651904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen mStarted = false; 652904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen initTts(); 653904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen } 654ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi return ERROR; 655904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen } 656904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen } 657904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen 658904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen 659904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen /** 660a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * Adds a mapping between a string of text and a sound file. 661a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * Use this to add custom earcons. 662a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * 663a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * @see #playEarcon(String, int, HashMap) 664904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * 665904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * @param earcon 666a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * The name of the earcon. 667a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * Example: <code>"[tick]"</code> 668904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * @param filename 669904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * The full path to the sound file (for example: 670904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * "/sdcard/mysounds/tick.wav") 671904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen * 672ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. 673904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen */ 674904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen public int addEarcon(String earcon, String filename) { 675904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen synchronized (mStartLock) { 676904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen if (!mStarted) { 677ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi return ERROR; 678904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen } 679904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen try { 680904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen mITts.addEarconFile(mPackageName, earcon, filename); 681ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi return SUCCESS; 682904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen } catch (RemoteException e) { 683904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen // TTS died; restart it. 684904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen Log.e("TextToSpeech.java - addEarcon", "RemoteException"); 685904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen e.printStackTrace(); 686904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen mStarted = false; 687904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen initTts(); 688904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen } catch (NullPointerException e) { 689904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen // TTS died; restart it. 690904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen Log.e("TextToSpeech.java - addEarcon", "NullPointerException"); 691904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen e.printStackTrace(); 692904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen mStarted = false; 693904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen initTts(); 694904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen } catch (IllegalStateException e) { 695904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen // TTS died; restart it. 696904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen Log.e("TextToSpeech.java - addEarcon", "IllegalStateException"); 697904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen e.printStackTrace(); 698904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen mStarted = false; 699904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen initTts(); 700904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen } 701ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi return ERROR; 702904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen } 703904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen } 704904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen 705904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen 706904dfa588431ff7c99c337d7797f5bef9ac12ce3Charles Chen /** 707e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * Speaks the string using the specified queuing strategy and speech 708a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * parameters. 709e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * 710e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @param text 711e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * The string of text to be spoken. 712e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @param queueMode 713679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi * The queuing strategy to use. 714a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * {@link #QUEUE_ADD} or {@link #QUEUE_FLUSH}. 715e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @param params 716a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * The list of parameters to be used. Can be null if no parameters are given. 717a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * They are specified using a (key, value) pair, where the key can be 718a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * {@link Engine#KEY_PARAM_STREAM} or 719a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * {@link Engine#KEY_PARAM_UTTERANCE_ID}. 7205c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * 721ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. 722e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi */ 7235c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen public int speak(String text, int queueMode, HashMap<String,String> params) 724a8518c169bb34e540b7542ad5bd3891053d01a9fJean-Michel Trivi { 72591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi synchronized (mStartLock) { 726ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi int result = ERROR; 7271e13a02320aa165c22172d43b2b3c3cd8ad35cf7Jean-Michel Trivi Log.i("TextToSpeech.java - speak", "speak text of length " + text.length()); 72891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi if (!mStarted) { 7291e13a02320aa165c22172d43b2b3c3cd8ad35cf7Jean-Michel Trivi Log.e("TextToSpeech.java - speak", "service isn't started"); 730c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen return result; 731e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 732e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi try { 733630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen if ((params != null) && (!params.isEmpty())) { 734ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi String extra = params.get(Engine.KEY_PARAM_STREAM); 735630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen if (extra != null) { 736ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_STREAM + 1] = extra; 737630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen } 738ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi extra = params.get(Engine.KEY_PARAM_UTTERANCE_ID); 739630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen if (extra != null) { 740ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID + 1] = extra; 741630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen } 74260dd360640a400d9b4a602160733281d284aaee5Charles Chen extra = params.get(Engine.KEY_PARAM_ENGINE); 74360dd360640a400d9b4a602160733281d284aaee5Charles Chen if (extra != null) { 74460dd360640a400d9b4a602160733281d284aaee5Charles Chen mCachedParams[Engine.PARAM_POSITION_ENGINE + 1] = extra; 74560dd360640a400d9b4a602160733281d284aaee5Charles Chen } 746a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi } 747a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen result = mITts.speak(mPackageName, text, queueMode, mCachedParams); 748e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (RemoteException e) { 749e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 750630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - speak", "RemoteException"); 751630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 75291bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 753e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 754e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (NullPointerException e) { 755e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 756630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - speak", "NullPointerException"); 757630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 75891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 759e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 760e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (IllegalStateException e) { 761e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 762630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - speak", "IllegalStateException"); 763630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 76491bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 765e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 766c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen } finally { 767a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi resetCachedParams(); 768a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi return result; 769e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 770e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 771e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 772e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 773e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 774e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi /** 775e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * Plays the earcon using the specified queueing mode and parameters. 776e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * 777e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @param earcon 778e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * The earcon that should be played 779e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @param queueMode 780a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * {@link #QUEUE_ADD} or {@link #QUEUE_FLUSH}. 781e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @param params 782a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * The list of parameters to be used. Can be null if no parameters are given. 783a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * They are specified using a (key, value) pair, where the key can be 784a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * {@link Engine#KEY_PARAM_STREAM} or 785a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * {@link Engine#KEY_PARAM_UTTERANCE_ID}. 7865c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * 787ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. 788e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi */ 7895c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen public int playEarcon(String earcon, int queueMode, 790a8518c169bb34e540b7542ad5bd3891053d01a9fJean-Michel Trivi HashMap<String,String> params) { 79191bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi synchronized (mStartLock) { 792ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi int result = ERROR; 79391bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi if (!mStarted) { 794c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen return result; 795e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 796e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi try { 797a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi if ((params != null) && (!params.isEmpty())) { 798ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi String extra = params.get(Engine.KEY_PARAM_STREAM); 799a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi if (extra != null) { 800ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_STREAM + 1] = extra; 801a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi } 802ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi extra = params.get(Engine.KEY_PARAM_UTTERANCE_ID); 803a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi if (extra != null) { 804ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID + 1] = extra; 805a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi } 806a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi } 807a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen result = mITts.playEarcon(mPackageName, earcon, queueMode, null); 808e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (RemoteException e) { 809e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 810630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - playEarcon", "RemoteException"); 811630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 81291bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 813e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 814e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (NullPointerException e) { 815e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 816630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - playEarcon", "NullPointerException"); 817630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 81891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 819e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 820e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (IllegalStateException e) { 821e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 822630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - playEarcon", "IllegalStateException"); 823630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 82491bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 825e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 826c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen } finally { 827a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi resetCachedParams(); 828a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi return result; 829e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 830e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 831e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 832679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi 8335c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen /** 8345c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * Plays silence for the specified amount of time using the specified 8355c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * queue mode. 8365c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * 8375c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * @param durationInMs 8385c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * A long that indicates how long the silence should last. 8395c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * @param queueMode 840a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * {@link #QUEUE_ADD} or {@link #QUEUE_FLUSH}. 841a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * @param params 842a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * The list of parameters to be used. Can be null if no parameters are given. 843a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * They are specified using a (key, value) pair, where the key can be 844a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * {@link Engine#KEY_PARAM_UTTERANCE_ID}. 8455c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * 846ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. 8475c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen */ 84878c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen public int playSilence(long durationInMs, int queueMode, HashMap<String,String> params) { 849f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen synchronized (mStartLock) { 850ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi int result = ERROR; 851f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen if (!mStarted) { 852c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen return result; 853f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen } 854f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen try { 85578c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen if ((params != null) && (!params.isEmpty())) { 856ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi String extra = params.get(Engine.KEY_PARAM_UTTERANCE_ID); 85778c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen if (extra != null) { 858ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID + 1] = extra; 85978c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen } 86078c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen } 861a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen result = mITts.playSilence(mPackageName, durationInMs, queueMode, mCachedParams); 862f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen } catch (RemoteException e) { 863f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen // TTS died; restart it. 864630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - playSilence", "RemoteException"); 865630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 866f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen mStarted = false; 867f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen initTts(); 868f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen } catch (NullPointerException e) { 869f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen // TTS died; restart it. 870630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - playSilence", "NullPointerException"); 871630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 872f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen mStarted = false; 873f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen initTts(); 874f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen } catch (IllegalStateException e) { 875f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen // TTS died; restart it. 876630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - playSilence", "IllegalStateException"); 877630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 878f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen mStarted = false; 879f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen initTts(); 880c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen } finally { 88160dd360640a400d9b4a602160733281d284aaee5Charles Chen return result; 882f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen } 883f032bc7da536774a0b6a1c77632c65b935eee6faCharles Chen } 884a8518c169bb34e540b7542ad5bd3891053d01a9fJean-Michel Trivi } 885e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 886e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 887e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi /** 888a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * Returns whether or not the TextToSpeech engine is busy speaking. 889e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * 890a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * @return Whether or not the TextToSpeech engine is busy speaking. 891e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi */ 892e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi public boolean isSpeaking() { 89391bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi synchronized (mStartLock) { 89491bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi if (!mStarted) { 895e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi return false; 896e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 897e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi try { 89891bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi return mITts.isSpeaking(); 899e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (RemoteException e) { 900e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 901630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - isSpeaking", "RemoteException"); 902630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 90391bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 904e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 905e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (NullPointerException e) { 906e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 907630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - isSpeaking", "NullPointerException"); 908630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 90991bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 910e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 911e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (IllegalStateException e) { 912e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 913630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - isSpeaking", "IllegalStateException"); 914630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 91591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 916e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 917e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 918e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi return false; 919e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 920e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 921e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 922e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 923e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi /** 924a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * Interrupts the current utterance (whether played or rendered to file) and discards other 925a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * utterances in the queue. 9265c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * 927ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. 928e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi */ 9295c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen public int stop() { 93091bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi synchronized (mStartLock) { 931ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi int result = ERROR; 93291bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi if (!mStarted) { 933c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen return result; 934e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 935e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi try { 936a9c5e4bf2639f8f09be8bace4230613b7b689f0eCharles Chen result = mITts.stop(mPackageName); 937e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (RemoteException e) { 938e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 939630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - stop", "RemoteException"); 940630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 94191bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 942e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 943e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (NullPointerException e) { 944e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 945630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - stop", "NullPointerException"); 946630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 94791bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 948e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 949e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (IllegalStateException e) { 950e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 951630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - stop", "IllegalStateException"); 952630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 95391bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 954e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 955c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen } finally { 95660dd360640a400d9b4a602160733281d284aaee5Charles Chen return result; 957e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 958e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 959e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 960e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 961e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 962e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi /** 963a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * Sets the speech rate for the TextToSpeech engine. 964e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * 965679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi * This has no effect on any pre-recorded speech. 966e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * 967e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @param speechRate 968a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * The speech rate for the TextToSpeech engine. 1 is the normal speed, 969679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi * lower values slow down the speech (0.5 is half the normal speech rate), 970679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi * greater values accelerate it (2 is twice the normal speech rate). 9715c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * 972ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. 973e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi */ 9745c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen public int setSpeechRate(float speechRate) { 97591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi synchronized (mStartLock) { 976ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi int result = ERROR; 97791bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi if (!mStarted) { 978c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen return result; 979e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 980e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi try { 981679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi if (speechRate > 0) { 982da7681e7b61dd450be72f2b4a80e6d1c86342e05Jean-Michel Trivi int rate = (int)(speechRate*100); 983ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_RATE + 1] = String.valueOf(rate); 9845e11a6ad00b062d604b30578e0fb412ae4586989Jean-Michel Trivi // the rate is not set here, instead it is cached so it will be associated 9855e11a6ad00b062d604b30578e0fb412ae4586989Jean-Michel Trivi // with all upcoming utterances. 9865e11a6ad00b062d604b30578e0fb412ae4586989Jean-Michel Trivi if (speechRate > 0.0f) { 987ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi result = SUCCESS; 9885e11a6ad00b062d604b30578e0fb412ae4586989Jean-Michel Trivi } else { 989ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi result = ERROR; 9905e11a6ad00b062d604b30578e0fb412ae4586989Jean-Michel Trivi } 991679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi } 992630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen } catch (NullPointerException e) { 993630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen // TTS died; restart it. 994630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - setSpeechRate", "NullPointerException"); 995630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 996630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen mStarted = false; 997630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen initTts(); 998630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen } catch (IllegalStateException e) { 999630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen // TTS died; restart it. 1000630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - setSpeechRate", "IllegalStateException"); 1001630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 100291bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 1003e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 1004c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen } finally { 100560dd360640a400d9b4a602160733281d284aaee5Charles Chen return result; 1006e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 1007e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 1008e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 1009e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 1010e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 1011e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi /** 1012a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * Sets the speech pitch for the TextToSpeech engine. 10132ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi * 10142ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi * This has no effect on any pre-recorded speech. 10152ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi * 10162ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi * @param pitch 1017a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * The pitch for the TextToSpeech engine. 1 is the normal pitch, 10182ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi * lower values lower the tone of the synthesized voice, 10192ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi * greater values increase it. 10205c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * 1021ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. 10222ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi */ 10235c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen public int setPitch(float pitch) { 10242ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi synchronized (mStartLock) { 1025ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi int result = ERROR; 10262ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi if (!mStarted) { 1027c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen return result; 10282ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi } 10292ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi try { 10301a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen // the pitch is not set here, instead it is cached so it will be associated 10311a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen // with all upcoming utterances. 10322ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi if (pitch > 0) { 10331a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen int p = (int)(pitch*100); 10341a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen mCachedParams[Engine.PARAM_POSITION_PITCH + 1] = String.valueOf(p); 10351a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen result = SUCCESS; 10362ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi } 1037630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen } catch (NullPointerException e) { 1038630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen // TTS died; restart it. 1039630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - setPitch", "NullPointerException"); 1040630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 1041630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen mStarted = false; 1042630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen initTts(); 1043630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen } catch (IllegalStateException e) { 1044630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen // TTS died; restart it. 1045630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - setPitch", "IllegalStateException"); 1046630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 10472ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi mStarted = false; 10482ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi initTts(); 1049c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen } finally { 105060dd360640a400d9b4a602160733281d284aaee5Charles Chen return result; 10512ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi } 10522ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi } 10532ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi } 10542ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi 10552ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi 10562ea5349583de4a505501530d04133524bb6d5d38Jean-Michel Trivi /** 1057a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * Sets the language for the TextToSpeech engine. 1058a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * The TextToSpeech engine will try to use the closest match to the specified 1059a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * language as represented by the Locale, but there is no guarantee that the exact same Locale 1060a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * will be used. Use {@link #isLanguageAvailable(Locale)} to check the level of support 1061a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * before choosing the language to use for the next utterances. 1062e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * 1063679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi * @param loc 1064679d728f09eeab2f8b882e42f6e081db1ac74996Jean-Michel Trivi * The locale describing the language to be used. 10655c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * 1066ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * @return code indicating the support status for the locale. See {@link #LANG_AVAILABLE}, 1067ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * {@link #LANG_COUNTRY_AVAILABLE}, {@link #LANG_COUNTRY_VAR_AVAILABLE}, 1068ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * {@link #LANG_MISSING_DATA} and {@link #LANG_NOT_SUPPORTED}. 1069e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi */ 10705c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen public int setLanguage(Locale loc) { 107191bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi synchronized (mStartLock) { 1072ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi int result = LANG_NOT_SUPPORTED; 107391bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi if (!mStarted) { 10744a60d61887a20d349e5eb38900dfbcaab06630fcJean-Michel Trivi return result; 10754a60d61887a20d349e5eb38900dfbcaab06630fcJean-Michel Trivi } 10764a60d61887a20d349e5eb38900dfbcaab06630fcJean-Michel Trivi if (loc == null) { 1077c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen return result; 1078e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 1079e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi try { 10801a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen String language = loc.getISO3Language(); 10811a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen String country = loc.getISO3Country(); 10821a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen String variant = loc.getVariant(); 10831a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen // Check if the language, country, variant are available, and cache 10841a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen // the available parts. 10851a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen // Note that the language is not actually set here, instead it is cached so it 10861a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen // will be associated with all upcoming utterances. 10871a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen result = mITts.isLanguageAvailable(language, country, variant, mCachedParams); 10881a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen if (result >= LANG_AVAILABLE){ 10891a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen mCachedParams[Engine.PARAM_POSITION_LANGUAGE + 1] = language; 10901a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen if (result >= LANG_COUNTRY_AVAILABLE){ 10911a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen mCachedParams[Engine.PARAM_POSITION_COUNTRY + 1] = country; 10921a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen } else { 10931a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen mCachedParams[Engine.PARAM_POSITION_COUNTRY + 1] = ""; 10941a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen } 10951a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen if (result >= LANG_COUNTRY_VAR_AVAILABLE){ 10961a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen mCachedParams[Engine.PARAM_POSITION_VARIANT + 1] = variant; 10971a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen } else { 10981a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen mCachedParams[Engine.PARAM_POSITION_VARIANT + 1] = ""; 10991a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen } 11001a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen } 1101748efcc3fb1b369690ab4617a04f452b1832edf4Charles Chen } catch (RemoteException e) { 1102e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 1103630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - setLanguage", "RemoteException"); 1104630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 1105630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen mStarted = false; 1106630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen initTts(); 1107630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen } catch (NullPointerException e) { 1108630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen // TTS died; restart it. 1109630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - setLanguage", "NullPointerException"); 1110630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 1111630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen mStarted = false; 1112630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen initTts(); 1113630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen } catch (IllegalStateException e) { 1114630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen // TTS died; restart it. 1115630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - setLanguage", "IllegalStateException"); 1116630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 111791bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 1118e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 1119c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen } finally { 112060dd360640a400d9b4a602160733281d284aaee5Charles Chen return result; 1121e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 1122e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 1123e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 1124e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 11255c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen 1126aaf842edbfe76990413d4c002acb394f855321b5Charles Chen /** 1127a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * Returns a Locale instance describing the language currently being used by the TextToSpeech 1128a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * engine. 1129ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi * @return language, country (if any) and variant (if any) used by the engine stored in a Locale 1130a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * instance, or null is the TextToSpeech engine has failed. 1131ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi */ 1132ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi public Locale getLanguage() { 1133ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi synchronized (mStartLock) { 1134ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi if (!mStarted) { 1135ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi return null; 1136ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi } 1137ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi try { 11381a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen // Only do a call to the native synth if there is nothing in the cached params 11391a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen if (mCachedParams[Engine.PARAM_POSITION_LANGUAGE + 1].length() < 1){ 11401a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen String[] locStrings = mITts.getLanguage(); 11411a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen if ((locStrings != null) && (locStrings.length == 3)) { 11421a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen return new Locale(locStrings[0], locStrings[1], locStrings[2]); 11431a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen } else { 11441a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen return null; 11451a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen } 1146ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi } else { 11471a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen return new Locale(mCachedParams[Engine.PARAM_POSITION_LANGUAGE + 1], 11481a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen mCachedParams[Engine.PARAM_POSITION_COUNTRY + 1], 11491a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen mCachedParams[Engine.PARAM_POSITION_VARIANT + 1]); 1150ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi } 1151ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi } catch (RemoteException e) { 1152ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi // TTS died; restart it. 1153630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - getLanguage", "RemoteException"); 1154630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 1155630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen mStarted = false; 1156630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen initTts(); 1157630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen } catch (NullPointerException e) { 1158630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen // TTS died; restart it. 1159630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - getLanguage", "NullPointerException"); 1160630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 1161630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen mStarted = false; 1162630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen initTts(); 1163630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen } catch (IllegalStateException e) { 1164630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen // TTS died; restart it. 1165630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - getLanguage", "IllegalStateException"); 1166630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 1167ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi mStarted = false; 1168ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi initTts(); 1169ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi } 1170ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi return null; 1171ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi } 1172ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi } 1173ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi 1174ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi /** 1175a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * Checks if the specified language as represented by the Locale is available and supported. 1176aaf842edbfe76990413d4c002acb394f855321b5Charles Chen * 1177aaf842edbfe76990413d4c002acb394f855321b5Charles Chen * @param loc 1178ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi * The Locale describing the language to be used. 11795c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * 1180ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * @return code indicating the support status for the locale. See {@link #LANG_AVAILABLE}, 1181ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * {@link #LANG_COUNTRY_AVAILABLE}, {@link #LANG_COUNTRY_VAR_AVAILABLE}, 1182ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * {@link #LANG_MISSING_DATA} and {@link #LANG_NOT_SUPPORTED}. 1183aaf842edbfe76990413d4c002acb394f855321b5Charles Chen */ 1184aaf842edbfe76990413d4c002acb394f855321b5Charles Chen public int isLanguageAvailable(Locale loc) { 1185ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi synchronized (mStartLock) { 1186ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi int result = LANG_NOT_SUPPORTED; 1187ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi if (!mStarted) { 1188c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen return result; 1189ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi } 1190ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi try { 1191c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen result = mITts.isLanguageAvailable(loc.getISO3Language(), 11921a2712ce2a18eba6809d984d2f7443fbdccaa7edCharles Chen loc.getISO3Country(), loc.getVariant(), mCachedParams); 1193ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi } catch (RemoteException e) { 1194ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi // TTS died; restart it. 1195630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - isLanguageAvailable", "RemoteException"); 1196630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 1197630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen mStarted = false; 1198630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen initTts(); 1199630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen } catch (NullPointerException e) { 1200630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen // TTS died; restart it. 1201630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - isLanguageAvailable", "NullPointerException"); 1202630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 1203630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen mStarted = false; 1204630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen initTts(); 1205630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen } catch (IllegalStateException e) { 1206630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen // TTS died; restart it. 1207630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - isLanguageAvailable", "IllegalStateException"); 1208630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 1209ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi mStarted = false; 1210ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi initTts(); 1211c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen } finally { 121260dd360640a400d9b4a602160733281d284aaee5Charles Chen return result; 1213ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi } 1214ddb0a803fd353fbaf0139cc8804499bc9dce7403Jean-Michel Trivi } 1215aaf842edbfe76990413d4c002acb394f855321b5Charles Chen } 1216aaf842edbfe76990413d4c002acb394f855321b5Charles Chen 1217aaf842edbfe76990413d4c002acb394f855321b5Charles Chen 1218e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi /** 1219d4989093ed708ddf9c799655ea0af7afda726426Charles Chen * Synthesizes the given text to a file using the specified parameters. 1220e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * 1221e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @param text 1222e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * The String of text that should be synthesized 1223e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @param params 1224a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * The list of parameters to be used. Can be null if no parameters are given. 1225a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * They are specified using a (key, value) pair, where the key can be 1226a9b417e9bfea3da908884c726ffc9bf4f64691cfJean-Michel Trivi * {@link Engine#KEY_PARAM_UTTERANCE_ID}. 1227e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * @param filename 1228e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * The string that gives the full output filename; it should be 1229e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi * something like "/sdcard/myappsounds/mysound.wav". 12305c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen * 1231ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. 1232e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi */ 12335c22f516be7753859f62ca3ff5327c453ee26faaCharles Chen public int synthesizeToFile(String text, HashMap<String,String> params, 1234e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi String filename) { 123591bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi synchronized (mStartLock) { 1236ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi int result = ERROR; 12371e13a02320aa165c22172d43b2b3c3cd8ad35cf7Jean-Michel Trivi Log.i("TextToSpeech.java - synthesizeToFile", "synthesizeToFile text of length " 12381e13a02320aa165c22172d43b2b3c3cd8ad35cf7Jean-Michel Trivi + text.length()); 123991bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi if (!mStarted) { 12401e13a02320aa165c22172d43b2b3c3cd8ad35cf7Jean-Michel Trivi Log.e("TextToSpeech.java - synthesizeToFile", "service isn't started"); 1241c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen return result; 1242e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 1243e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi try { 1244630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen if ((params != null) && (!params.isEmpty())) { 1245630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen // no need to read the stream type here 1246ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi String extra = params.get(Engine.KEY_PARAM_UTTERANCE_ID); 1247630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen if (extra != null) { 1248ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID + 1] = extra; 1249630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen } 125060dd360640a400d9b4a602160733281d284aaee5Charles Chen extra = params.get(Engine.KEY_PARAM_ENGINE); 125160dd360640a400d9b4a602160733281d284aaee5Charles Chen if (extra != null) { 125260dd360640a400d9b4a602160733281d284aaee5Charles Chen mCachedParams[Engine.PARAM_POSITION_ENGINE + 1] = extra; 125360dd360640a400d9b4a602160733281d284aaee5Charles Chen } 1254a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi } 1255b21651c10ca833e073337ae6a0ee55fcc39c32f1Jean-Michel Trivi result = mITts.synthesizeToFile(mPackageName, text, mCachedParams, filename) ? 1256b21651c10ca833e073337ae6a0ee55fcc39c32f1Jean-Michel Trivi SUCCESS : ERROR; 1257e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (RemoteException e) { 1258e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 1259630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - synthesizeToFile", "RemoteException"); 1260630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 126191bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 1262e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 1263e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (NullPointerException e) { 1264e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 1265630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - synthesizeToFile", "NullPointerException"); 1266630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 126791bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 1268e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 1269e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } catch (IllegalStateException e) { 1270e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi // TTS died; restart it. 1271630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen Log.e("TextToSpeech.java - synthesizeToFile", "IllegalStateException"); 1272630a8de44fa0ca855c4a87d939432f831e8ed531Charles Chen e.printStackTrace(); 127391bf30a4779146a14b2c9c5ce168d641cd31cb8eJean-Michel Trivi mStarted = false; 1274e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi initTts(); 1275c8ba3b560ce0ce5944939a50d61f639fdcaa0015Charles Chen } finally { 1276a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi resetCachedParams(); 1277a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi return result; 1278e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 1279e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 1280e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi } 1281e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi 1282a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi 1283a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi /** 1284a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi * Convenience method to reset the cached parameters to the current default values 1285a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi * if they are not persistent between calls to the service. 1286a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi */ 1287a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi private void resetCachedParams() { 1288ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_STREAM + 1] = 1289ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi String.valueOf(Engine.DEFAULT_STREAM); 1290ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi mCachedParams[Engine.PARAM_POSITION_UTTERANCE_ID+ 1] = ""; 1291a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi } 1292a981013aa7315e13c6c5f6aad489813c419031eaJean-Michel Trivi 129378c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen /** 129478c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen * Sets the OnUtteranceCompletedListener that will fire when an utterance completes. 129578c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen * 129678c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen * @param listener 129778c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen * The OnUtteranceCompletedListener 129878c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen * 1299ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. 130078c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen */ 130160dd360640a400d9b4a602160733281d284aaee5Charles Chen public int setOnUtteranceCompletedListener( 130260dd360640a400d9b4a602160733281d284aaee5Charles Chen final OnUtteranceCompletedListener listener) { 130378c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen synchronized (mStartLock) { 1304ed06578eddde07abe325fa4c92910bb7246cd49fJean-Michel Trivi int result = ERROR; 130578c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen if (!mStarted) { 130678c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen return result; 130778c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen } 130878c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen mITtscallback = new ITtsCallback.Stub() { 130960dd360640a400d9b4a602160733281d284aaee5Charles Chen public void utteranceCompleted(String utteranceId) throws RemoteException { 131060dd360640a400d9b4a602160733281d284aaee5Charles Chen if (listener != null) { 131160dd360640a400d9b4a602160733281d284aaee5Charles Chen listener.onUtteranceCompleted(utteranceId); 131260dd360640a400d9b4a602160733281d284aaee5Charles Chen } 131360dd360640a400d9b4a602160733281d284aaee5Charles Chen } 131478c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen }; 131578c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen try { 131678c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen result = mITts.registerCallback(mPackageName, mITtscallback); 131778c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen } catch (RemoteException e) { 131878c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen // TTS died; restart it. 131978c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen Log.e("TextToSpeech.java - registerCallback", "RemoteException"); 132078c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen e.printStackTrace(); 132178c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen mStarted = false; 132278c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen initTts(); 132378c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen } catch (NullPointerException e) { 132478c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen // TTS died; restart it. 132578c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen Log.e("TextToSpeech.java - registerCallback", "NullPointerException"); 132678c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen e.printStackTrace(); 132778c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen mStarted = false; 132878c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen initTts(); 132978c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen } catch (IllegalStateException e) { 133078c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen // TTS died; restart it. 133178c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen Log.e("TextToSpeech.java - registerCallback", "IllegalStateException"); 133278c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen e.printStackTrace(); 133378c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen mStarted = false; 133478c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen initTts(); 133578c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen } finally { 133678c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen return result; 133778c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen } 133860dd360640a400d9b4a602160733281d284aaee5Charles Chen } 133978c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen } 134078c9d0d2c5eb4d5687ae7cbe41155159329ad68fCharles Chen 1341b4fbe768f8bfb2550dec100e29d0edc09b8a051aCharles Chen /** 1342b4fbe768f8bfb2550dec100e29d0edc09b8a051aCharles Chen * Sets the speech synthesis engine to be used by its packagename. 1343b4fbe768f8bfb2550dec100e29d0edc09b8a051aCharles Chen * 1344b4fbe768f8bfb2550dec100e29d0edc09b8a051aCharles Chen * @param enginePackageName 1345b4fbe768f8bfb2550dec100e29d0edc09b8a051aCharles Chen * The packagename for the synthesis engine (ie, "com.svox.pico") 1346b4fbe768f8bfb2550dec100e29d0edc09b8a051aCharles Chen * 1347b4fbe768f8bfb2550dec100e29d0edc09b8a051aCharles Chen * @return Code indicating success or failure. See {@link #ERROR} and {@link #SUCCESS}. 1348b4fbe768f8bfb2550dec100e29d0edc09b8a051aCharles Chen */ 134960dd360640a400d9b4a602160733281d284aaee5Charles Chen public int setEngineByPackageName(String enginePackageName) { 135060dd360640a400d9b4a602160733281d284aaee5Charles Chen synchronized (mStartLock) { 135160dd360640a400d9b4a602160733281d284aaee5Charles Chen int result = TextToSpeech.ERROR; 135260dd360640a400d9b4a602160733281d284aaee5Charles Chen if (!mStarted) { 135360dd360640a400d9b4a602160733281d284aaee5Charles Chen return result; 135460dd360640a400d9b4a602160733281d284aaee5Charles Chen } 135560dd360640a400d9b4a602160733281d284aaee5Charles Chen try { 135660dd360640a400d9b4a602160733281d284aaee5Charles Chen result = mITts.setEngineByPackageName(enginePackageName); 135760dd360640a400d9b4a602160733281d284aaee5Charles Chen if (result == TextToSpeech.SUCCESS){ 135860dd360640a400d9b4a602160733281d284aaee5Charles Chen mCachedParams[Engine.PARAM_POSITION_ENGINE + 1] = enginePackageName; 135960dd360640a400d9b4a602160733281d284aaee5Charles Chen } 136060dd360640a400d9b4a602160733281d284aaee5Charles Chen } catch (RemoteException e) { 136160dd360640a400d9b4a602160733281d284aaee5Charles Chen // TTS died; restart it. 136260dd360640a400d9b4a602160733281d284aaee5Charles Chen Log.e("TextToSpeech.java - setEngineByPackageName", "RemoteException"); 136360dd360640a400d9b4a602160733281d284aaee5Charles Chen e.printStackTrace(); 136460dd360640a400d9b4a602160733281d284aaee5Charles Chen mStarted = false; 136560dd360640a400d9b4a602160733281d284aaee5Charles Chen initTts(); 136660dd360640a400d9b4a602160733281d284aaee5Charles Chen } catch (NullPointerException e) { 136760dd360640a400d9b4a602160733281d284aaee5Charles Chen // TTS died; restart it. 136860dd360640a400d9b4a602160733281d284aaee5Charles Chen Log.e("TextToSpeech.java - setEngineByPackageName", "NullPointerException"); 136960dd360640a400d9b4a602160733281d284aaee5Charles Chen e.printStackTrace(); 137060dd360640a400d9b4a602160733281d284aaee5Charles Chen mStarted = false; 137160dd360640a400d9b4a602160733281d284aaee5Charles Chen initTts(); 137260dd360640a400d9b4a602160733281d284aaee5Charles Chen } catch (IllegalStateException e) { 137360dd360640a400d9b4a602160733281d284aaee5Charles Chen // TTS died; restart it. 137460dd360640a400d9b4a602160733281d284aaee5Charles Chen Log.e("TextToSpeech.java - setEngineByPackageName", "IllegalStateException"); 137560dd360640a400d9b4a602160733281d284aaee5Charles Chen e.printStackTrace(); 137660dd360640a400d9b4a602160733281d284aaee5Charles Chen mStarted = false; 137760dd360640a400d9b4a602160733281d284aaee5Charles Chen initTts(); 137860dd360640a400d9b4a602160733281d284aaee5Charles Chen } finally { 137960dd360640a400d9b4a602160733281d284aaee5Charles Chen return result; 138060dd360640a400d9b4a602160733281d284aaee5Charles Chen } 138160dd360640a400d9b4a602160733281d284aaee5Charles Chen } 1382b4fbe768f8bfb2550dec100e29d0edc09b8a051aCharles Chen } 1383b4fbe768f8bfb2550dec100e29d0edc09b8a051aCharles Chen 1384def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen 1385def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen /** 1386def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen * Gets the packagename of the default speech synthesis engine. 1387def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen * 1388def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen * @return Packagename of the TTS engine that the user has chosen as their default. 1389def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen */ 1390def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen public String getDefaultEngine() { 1391def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen synchronized (mStartLock) { 1392def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen String engineName = ""; 1393def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen if (!mStarted) { 1394def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen return engineName; 1395def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen } 1396def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen try { 1397def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen engineName = mITts.getDefaultEngine(); 1398def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen } catch (RemoteException e) { 1399def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen // TTS died; restart it. 1400def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen Log.e("TextToSpeech.java - setEngineByPackageName", "RemoteException"); 1401def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen e.printStackTrace(); 1402def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen mStarted = false; 1403def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen initTts(); 1404def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen } catch (NullPointerException e) { 1405def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen // TTS died; restart it. 1406def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen Log.e("TextToSpeech.java - setEngineByPackageName", "NullPointerException"); 1407def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen e.printStackTrace(); 1408def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen mStarted = false; 1409def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen initTts(); 1410def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen } catch (IllegalStateException e) { 1411def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen // TTS died; restart it. 1412def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen Log.e("TextToSpeech.java - setEngineByPackageName", "IllegalStateException"); 1413def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen e.printStackTrace(); 1414def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen mStarted = false; 1415def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen initTts(); 1416def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen } finally { 1417def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen return engineName; 1418def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen } 1419def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen } 1420def7185cf19d48c95b50c2b83503d5cd21a613bfCharles Chen } 142142229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen 142242229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen 142342229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen /** 142442229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen * Returns whether or not the user is forcing their defaults to override the 142542229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen * Text-To-Speech settings set by applications. 142642229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen * 142742229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen * @return Whether or not defaults are enforced. 142842229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen */ 142942229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen public boolean areDefaultsEnforced() { 143042229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen synchronized (mStartLock) { 143142229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen boolean defaultsEnforced = false; 143242229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen if (!mStarted) { 143342229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen return defaultsEnforced; 143442229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen } 143542229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen try { 143642229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen defaultsEnforced = mITts.areDefaultsEnforced(); 143742229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen } catch (RemoteException e) { 143842229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen // TTS died; restart it. 143942229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen Log.e("TextToSpeech.java - areDefaultsEnforced", "RemoteException"); 144042229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen e.printStackTrace(); 144142229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen mStarted = false; 144242229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen initTts(); 144342229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen } catch (NullPointerException e) { 144442229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen // TTS died; restart it. 144542229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen Log.e("TextToSpeech.java - areDefaultsEnforced", "NullPointerException"); 144642229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen e.printStackTrace(); 144742229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen mStarted = false; 144842229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen initTts(); 144942229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen } catch (IllegalStateException e) { 145042229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen // TTS died; restart it. 145142229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen Log.e("TextToSpeech.java - areDefaultsEnforced", "IllegalStateException"); 145242229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen e.printStackTrace(); 145342229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen mStarted = false; 145442229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen initTts(); 145542229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen } finally { 145642229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen return defaultsEnforced; 145742229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen } 145842229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen } 145942229259a6fca8851db74dc1c0ecbab2d3fb788dCharles Chen } 1460e74d507d171de60cc028e6176fe08cc9cdd8b701Jean-Michel Trivi} 1461