1754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath// Copyright 2011 Google Inc. All Rights Reserved. 2754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath 3754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamathpackage android.speech.tts; 4754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath 5c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egbertsimport android.media.AudioFormat; 6c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts 7754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath/** 8754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath * Listener for events relating to the progress of an utterance through 9754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath * the synthesis queue. Each utterance is associated with a call to 10754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath * {@link TextToSpeech#speak} or {@link TextToSpeech#synthesizeToFile} with an 11754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath * associated utterance identifier, as per {@link TextToSpeech.Engine#KEY_PARAM_UTTERANCE_ID}. 12754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath * 13754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath * The callbacks specified in this method can be called from multiple threads. 14754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath */ 15754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamathpublic abstract class UtteranceProgressListener { 16754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath /** 17754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath * Called when an utterance "starts" as perceived by the caller. This will 18754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath * be soon before audio is played back in the case of a {@link TextToSpeech#speak} 19c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * or before the first bytes of a file are written to the file system in the case 20754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath * of {@link TextToSpeech#synthesizeToFile}. 21754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath * 22c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * @param utteranceId The utterance ID of the utterance. 23754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath */ 24754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath public abstract void onStart(String utteranceId); 25754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath 26754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath /** 27754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath * Called when an utterance has successfully completed processing. 28754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath * All audio will have been played back by this point for audible output, and all 29754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath * output will have been written to disk for file synthesis requests. 30754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath * 31754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath * This request is guaranteed to be called after {@link #onStart(String)}. 32754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath * 33c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * @param utteranceId The utterance ID of the utterance. 34754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath */ 35754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath public abstract void onDone(String utteranceId); 36754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath 37754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath /** 38754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath * Called when an error has occurred during processing. This can be called 39754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath * at any point in the synthesis process. Note that there might be calls 40754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath * to {@link #onStart(String)} for specified utteranceId but there will never 41754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath * be a call to both {@link #onDone(String)} and {@link #onError(String)} for 42754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath * the same utterance. 43754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath * 44c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * @param utteranceId The utterance ID of the utterance. 45fc4b2890378eb1b6e0b11d60d703eb6854268064Przemyslaw Szczepaniak * @deprecated Use {@link #onError(String,int)} instead 46754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath */ 47fc4b2890378eb1b6e0b11d60d703eb6854268064Przemyslaw Szczepaniak @Deprecated 48754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath public abstract void onError(String utteranceId); 49754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath 50754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath /** 51fc4b2890378eb1b6e0b11d60d703eb6854268064Przemyslaw Szczepaniak * Called when an error has occurred during processing. This can be called 52fc4b2890378eb1b6e0b11d60d703eb6854268064Przemyslaw Szczepaniak * at any point in the synthesis process. Note that there might be calls 53fc4b2890378eb1b6e0b11d60d703eb6854268064Przemyslaw Szczepaniak * to {@link #onStart(String)} for specified utteranceId but there will never 54fc4b2890378eb1b6e0b11d60d703eb6854268064Przemyslaw Szczepaniak * be a call to both {@link #onDone(String)} and {@link #onError(String,int)} for 55fc4b2890378eb1b6e0b11d60d703eb6854268064Przemyslaw Szczepaniak * the same utterance. The default implementation calls {@link #onError(String)}. 56fc4b2890378eb1b6e0b11d60d703eb6854268064Przemyslaw Szczepaniak * 57c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * @param utteranceId The utterance ID of the utterance. 58fc4b2890378eb1b6e0b11d60d703eb6854268064Przemyslaw Szczepaniak * @param errorCode one of the ERROR_* codes from {@link TextToSpeech} 59fc4b2890378eb1b6e0b11d60d703eb6854268064Przemyslaw Szczepaniak */ 60fc4b2890378eb1b6e0b11d60d703eb6854268064Przemyslaw Szczepaniak public void onError(String utteranceId, int errorCode) { 61fc4b2890378eb1b6e0b11d60d703eb6854268064Przemyslaw Szczepaniak onError(utteranceId); 62fc4b2890378eb1b6e0b11d60d703eb6854268064Przemyslaw Szczepaniak } 63fc4b2890378eb1b6e0b11d60d703eb6854268064Przemyslaw Szczepaniak 64fc4b2890378eb1b6e0b11d60d703eb6854268064Przemyslaw Szczepaniak /** 654b73867a12a9339c7788e8949aac4a32d2eee22bPrzemyslaw Szczepaniak * Called when an utterance has been stopped while in progress or flushed from the 66f77b2de1a9affa877f35f3efb23dfd50a1e9af0aPrzemyslaw Szczepaniak * synthesis queue. This can happen if a client calls {@link TextToSpeech#stop()} 67f77b2de1a9affa877f35f3efb23dfd50a1e9af0aPrzemyslaw Szczepaniak * or uses {@link TextToSpeech#QUEUE_FLUSH} as an argument with the 684b73867a12a9339c7788e8949aac4a32d2eee22bPrzemyslaw Szczepaniak * {@link TextToSpeech#speak} or {@link TextToSpeech#synthesizeToFile} methods. 694b73867a12a9339c7788e8949aac4a32d2eee22bPrzemyslaw Szczepaniak * 70c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * @param utteranceId The utterance ID of the utterance. 71f77b2de1a9affa877f35f3efb23dfd50a1e9af0aPrzemyslaw Szczepaniak * @param interrupted If true, then the utterance was interrupted while being synthesized 72f77b2de1a9affa877f35f3efb23dfd50a1e9af0aPrzemyslaw Szczepaniak * and its output is incomplete. If false, then the utterance was flushed 734b73867a12a9339c7788e8949aac4a32d2eee22bPrzemyslaw Szczepaniak * before the synthesis started. 744b73867a12a9339c7788e8949aac4a32d2eee22bPrzemyslaw Szczepaniak */ 75f77b2de1a9affa877f35f3efb23dfd50a1e9af0aPrzemyslaw Szczepaniak public void onStop(String utteranceId, boolean interrupted) { 764b73867a12a9339c7788e8949aac4a32d2eee22bPrzemyslaw Szczepaniak } 774b73867a12a9339c7788e8949aac4a32d2eee22bPrzemyslaw Szczepaniak 784b73867a12a9339c7788e8949aac4a32d2eee22bPrzemyslaw Szczepaniak /** 79c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * Called when the TTS engine begins to synthesize the audio for a request. 80c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * 81c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * <p> 82c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * It provides information about the format of the byte array for subsequent 83c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * {@link #onAudioAvailable} calls. 84c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * </p> 85c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * 86c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * <p> 87c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * This is called when the TTS engine starts synthesizing audio for the request. If an 88c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * application wishes to know when the audio is about to start playing, {#onStart(String)} 89c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * should be used instead. 90c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * </p> 91c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * 92c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * @param utteranceId The utterance ID of the utterance. 93c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * @param sampleRateInHz Sample rate in hertz of the generated audio. 94c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * @param audioFormat Audio format of the generated audio. Should be one of 95c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * {@link AudioFormat#ENCODING_PCM_8BIT}, {@link AudioFormat#ENCODING_PCM_16BIT} or 96c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * {@link AudioFormat#ENCODING_PCM_FLOAT}. 97c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * @param channelCount The number of channels. 98c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts */ 99c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts public void onBeginSynthesis(String utteranceId, int sampleRateInHz, int audioFormat, int channelCount) { 100c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts } 101c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts 102c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts /** 103c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * This is called when a chunk of audio is ready for consumption. 104c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * 105c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * <p> 106c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * The audio parameter is a copy of what will be synthesized to the speakers (when synthesis was 107c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * initiated with a {@link TextToSpeech#speak} call) or written to the file system (for 108c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * {@link TextToSpeech#synthesizeToFile}). The audio bytes are delivered in one or more chunks; 109c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * if {@link #onDone} or {@link #onError} is called all chunks have been received. 110c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * </p> 111c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * 112c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * <p> 113c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * The audio received here may not be played for some time depending on buffer sizes and the 114c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * amount of items on the synthesis queue. 115c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * </p> 116c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * 117c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * @param utteranceId The utterance ID of the utterance. 118c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * @param audio A chunk of audio; the format can be known by listening to 119c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts * {@link #onBeginSynthesis(String, int, int, int)}. 120c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts */ 121c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts public void onAudioAvailable(String utteranceId, byte[] audio) { 122c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts } 123c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts 124c99ba1c3edf725e070383b27724c9ed63e1e5765Niels Egberts /** 125754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath * Wraps an old deprecated OnUtteranceCompletedListener with a shiny new 126754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath * progress listener. 127754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath * 128754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath * @hide 129754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath */ 130754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath static UtteranceProgressListener from( 131754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath final TextToSpeech.OnUtteranceCompletedListener listener) { 132754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath return new UtteranceProgressListener() { 133754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath @Override 134754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath public synchronized void onDone(String utteranceId) { 135754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath listener.onUtteranceCompleted(utteranceId); 136754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath } 137754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath 138754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath @Override 13940f71f0be3cefabde9dc066d7707a1e5ebaec820Narayan Kamath public void onError(String utteranceId) { 14040f71f0be3cefabde9dc066d7707a1e5ebaec820Narayan Kamath listener.onUtteranceCompleted(utteranceId); 14140f71f0be3cefabde9dc066d7707a1e5ebaec820Narayan Kamath } 142754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath 143754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath @Override 14440f71f0be3cefabde9dc066d7707a1e5ebaec820Narayan Kamath public void onStart(String utteranceId) { 14540f71f0be3cefabde9dc066d7707a1e5ebaec820Narayan Kamath // Left unimplemented, has no equivalent in the old 14640f71f0be3cefabde9dc066d7707a1e5ebaec820Narayan Kamath // API. 14740f71f0be3cefabde9dc066d7707a1e5ebaec820Narayan Kamath } 1484b73867a12a9339c7788e8949aac4a32d2eee22bPrzemyslaw Szczepaniak 1494b73867a12a9339c7788e8949aac4a32d2eee22bPrzemyslaw Szczepaniak @Override 150f77b2de1a9affa877f35f3efb23dfd50a1e9af0aPrzemyslaw Szczepaniak public void onStop(String utteranceId, boolean interrupted) { 1514b73867a12a9339c7788e8949aac4a32d2eee22bPrzemyslaw Szczepaniak listener.onUtteranceCompleted(utteranceId); 1524b73867a12a9339c7788e8949aac4a32d2eee22bPrzemyslaw Szczepaniak } 153754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath }; 154754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath } 155754c72ed9e8e83e5a913aa7552fc2e1b1b5277e0Narayan Kamath} 156