diff --git a/api/current.txt b/api/current.txt index 6046026b16f12..1ab9c88854638 100644 --- a/api/current.txt +++ b/api/current.txt @@ -17455,21 +17455,23 @@ package android.speech { package android.speech.tts { - public abstract class SynthesisRequest { - ctor public SynthesisRequest(java.lang.String, android.os.Bundle); + public abstract interface SynthesisCallback { method public abstract int audioAvailable(byte[], int, int); method public abstract int completeAudioAvailable(int, int, int, byte[], int, int); method public abstract int done(); method public abstract void error(); + method public abstract int getMaxBufferSize(); + method public abstract int start(int, int, int); + } + + public final class SynthesisRequest { method public java.lang.String getCountry(); method public java.lang.String getLanguage(); - method public abstract int getMaxBufferSize(); method public android.os.Bundle getParams(); method public int getPitch(); method public int getSpeechRate(); method public java.lang.String getText(); method public java.lang.String getVariant(); - method public abstract int start(int, int, int); } public class TextToSpeech { @@ -17555,7 +17557,7 @@ package android.speech.tts { method protected abstract int onIsLanguageAvailable(java.lang.String, java.lang.String, java.lang.String); method protected abstract int onLoadLanguage(java.lang.String, java.lang.String, java.lang.String); method protected abstract void onStop(); - method protected abstract void onSynthesizeText(android.speech.tts.SynthesisRequest); + method protected abstract void onSynthesizeText(android.speech.tts.SynthesisRequest, android.speech.tts.SynthesisCallback); } } diff --git a/core/java/android/speech/tts/AbstractSynthesisCallback.java b/core/java/android/speech/tts/AbstractSynthesisCallback.java new file mode 100644 index 0000000000000..c7a4af0bf533d --- /dev/null +++ b/core/java/android/speech/tts/AbstractSynthesisCallback.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package android.speech.tts; + +/** + * Defines additional methods the synthesis callback must implement that + * are private to the TTS service implementation. + */ +abstract class AbstractSynthesisCallback implements SynthesisCallback { + /** + * Checks whether the synthesis request completed successfully. + */ + abstract boolean isDone(); + + /** + * Aborts the speech request. + * + * Can be called from multiple threads. + */ + abstract void stop(); +} diff --git a/core/java/android/speech/tts/FileSynthesisRequest.java b/core/java/android/speech/tts/FileSynthesisCallback.java similarity index 97% rename from core/java/android/speech/tts/FileSynthesisRequest.java rename to core/java/android/speech/tts/FileSynthesisCallback.java index 62be2bf7ca4b4..4f4b3fb6f2038 100644 --- a/core/java/android/speech/tts/FileSynthesisRequest.java +++ b/core/java/android/speech/tts/FileSynthesisCallback.java @@ -16,7 +16,6 @@ package android.speech.tts; import android.media.AudioFormat; -import android.os.Bundle; import android.util.Log; import java.io.File; @@ -29,7 +28,7 @@ import java.nio.ByteOrder; /** * Speech synthesis request that writes the audio to a WAV file. */ -class FileSynthesisRequest extends SynthesisRequest { +class FileSynthesisCallback extends AbstractSynthesisCallback { private static final String TAG = "FileSynthesisRequest"; private static final boolean DBG = false; @@ -48,8 +47,7 @@ class FileSynthesisRequest extends SynthesisRequest { private boolean mStopped = false; private boolean mDone = false; - FileSynthesisRequest(String text, Bundle params, File fileName) { - super(text, params); + FileSynthesisCallback(File fileName) { mFileName = fileName; } diff --git a/core/java/android/speech/tts/PlaybackSynthesisRequest.java b/core/java/android/speech/tts/PlaybackSynthesisCallback.java similarity index 95% rename from core/java/android/speech/tts/PlaybackSynthesisRequest.java rename to core/java/android/speech/tts/PlaybackSynthesisCallback.java index 34b263cb74ef4..1888dda9f3a36 100644 --- a/core/java/android/speech/tts/PlaybackSynthesisRequest.java +++ b/core/java/android/speech/tts/PlaybackSynthesisCallback.java @@ -15,14 +15,13 @@ */ package android.speech.tts; -import android.os.Bundle; import android.speech.tts.TextToSpeechService.UtteranceCompletedDispatcher; import android.util.Log; /** * Speech synthesis request that plays the audio as it is received. */ -class PlaybackSynthesisRequest extends SynthesisRequest { +class PlaybackSynthesisCallback extends AbstractSynthesisCallback { private static final String TAG = "PlaybackSynthesisRequest"; private static final boolean DBG = false; @@ -66,9 +65,9 @@ class PlaybackSynthesisRequest extends SynthesisRequest { private final UtteranceCompletedDispatcher mDispatcher; - PlaybackSynthesisRequest(String text, Bundle params, int streamType, float volume, float pan, - AudioPlaybackHandler audioTrackHandler, UtteranceCompletedDispatcher dispatcher) { - super(text, params); + PlaybackSynthesisCallback(int streamType, float volume, float pan, + AudioPlaybackHandler audioTrackHandler, + UtteranceCompletedDispatcher dispatcher) { mStreamType = streamType; mVolume = volume; mPan = pan; diff --git a/core/java/android/speech/tts/SynthesisCallback.java b/core/java/android/speech/tts/SynthesisCallback.java new file mode 100644 index 0000000000000..1b80e40e2582b --- /dev/null +++ b/core/java/android/speech/tts/SynthesisCallback.java @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package android.speech.tts; + +/** + * A callback to return speech data synthesized by a text to speech engine. + * + * The engine can provide streaming audio by calling + * {@link #start}, then {@link #audioAvailable} until all audio has been provided, then finally + * {@link #done}. + * + * Alternatively, the engine can provide all the audio at once, by using + * {@link #completeAudioAvailable}. + * + * {@link #error} can be called at any stage in the synthesis process to + * indicate that an error has occured, but if the call is made after a call + * to {@link #done} or {@link #completeAudioAvailable} it might be discarded. + */ +public interface SynthesisCallback { + /** + * @return the maximum number of bytes that the TTS engine can pass in a single call of + * {@link #audioAvailable}. This does not apply to {@link #completeAudioAvailable}. + * Calls to {@link #audioAvailable} with data lengths larger than this + * value will not succeed. + */ + public int getMaxBufferSize(); + + /** + * The service should call this when it starts to synthesize audio for this + * request. + * + * This method should only be called on the synthesis thread, + * while in {@link TextToSpeechService#onSynthesizeText}. + * + * @param sampleRateInHz Sample rate in HZ of the generated audio. + * @param audioFormat Audio format of the generated audio. Must be one of + * the ENCODING_ constants defined in {@link android.media.AudioFormat}. + * @param channelCount The number of channels. Must be {@code 1} or {@code 2}. + * @return {@link TextToSpeech#SUCCESS} or {@link TextToSpeech#ERROR}. + */ + public int start(int sampleRateInHz, int audioFormat, int channelCount); + + /** + * The service should call this method when synthesized audio is ready for consumption. + * + * This method should only be called on the synthesis thread, + * while in {@link TextToSpeechService#onSynthesizeText}. + * + * @param buffer The generated audio data. This method will not hold on to {@code buffer}, + * so the caller is free to modify it after this method returns. + * @param offset The offset into {@code buffer} where the audio data starts. + * @param length The number of bytes of audio data in {@code buffer}. This must be + * less than or equal to the return value of {@link #getMaxBufferSize}. + * @return {@link TextToSpeech#SUCCESS} or {@link TextToSpeech#ERROR}. + */ + public int audioAvailable(byte[] buffer, int offset, int length); + + /** + * The service can call this method instead of using {@link #start}, {@link #audioAvailable} + * and {@link #done} if all the audio data is available in a single buffer. + * + * @param sampleRateInHz Sample rate in HZ of the generated audio. + * @param audioFormat Audio format of the generated audio. Must be one of + * the ENCODING_ constants defined in {@link android.media.AudioFormat}. + * @param channelCount The number of channels. Must be {@code 1} or {@code 2}. + * @param buffer The generated audio data. This method will not hold on to {@code buffer}, + * so the caller is free to modify it after this method returns. + * @param offset The offset into {@code buffer} where the audio data starts. + * @param length The number of bytes of audio data in {@code buffer}. + * @return {@link TextToSpeech#SUCCESS} or {@link TextToSpeech#ERROR}. + */ + public int completeAudioAvailable(int sampleRateInHz, int audioFormat, + int channelCount, byte[] buffer, int offset, int length); + + /** + * The service should call this method when all the synthesized audio for a request has + * been passed to {@link #audioAvailable}. + * + * This method should only be called on the synthesis thread, + * while in {@link TextToSpeechService#onSynthesizeText}. + * + * @return {@link TextToSpeech#SUCCESS} or {@link TextToSpeech#ERROR}. + */ + public int done(); + + /** + * The service should call this method if the speech synthesis fails. + * + * This method should only be called on the synthesis thread, + * while in {@link TextToSpeechService#onSynthesizeText}. + */ + public void error(); + +} \ No newline at end of file diff --git a/core/java/android/speech/tts/SynthesisRequest.java b/core/java/android/speech/tts/SynthesisRequest.java index 57ae10d838b41..ef1704cae0889 100644 --- a/core/java/android/speech/tts/SynthesisRequest.java +++ b/core/java/android/speech/tts/SynthesisRequest.java @@ -18,17 +18,22 @@ package android.speech.tts; import android.os.Bundle; /** - * A request for speech synthesis given to a TTS engine for processing. + * Contains data required by engines to synthesize speech. This data is : + *