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