Merge change 5447 into donut

* changes:
  Adding skeleton methods for IPA support.
This commit is contained in:
Android (Google) Code Review
2009-06-26 11:28:43 -07:00
2 changed files with 130 additions and 12 deletions

View File

@@ -33,6 +33,8 @@ interface ITts {
void speak(in String text, in int queueMode, in String[] params);
void speakIpa(in String ipaText, in int queueMode, in String[] params);
boolean isSpeaking();
void stop();
@@ -43,7 +45,9 @@ interface ITts {
void setLanguage(in String language, in String country, in String variant);
boolean synthesizeToFile(in String text, in String[] params, in String outputDirectory);
boolean synthesizeToFile(in String text, in String[] params, in String outputDirectory);
boolean synthesizeIpaToFile(in String ipaText, in String[] params, in String outputDirectory);
void playEarcon(in String earcon, in int queueMode, in String[] params);

View File

@@ -47,12 +47,13 @@ import java.util.concurrent.locks.ReentrantLock;
public class TtsService extends Service implements OnCompletionListener {
private static class SpeechItem {
public static final int SPEECH = 0;
public static final int EARCON = 1;
public static final int SILENCE = 2;
public static final int TEXT = 0;
public static final int IPA = 1;
public static final int EARCON = 2;
public static final int SILENCE = 3;
public String mText = null;
public ArrayList<String> mParams = null;
public int mType = SPEECH;
public int mType = TEXT;
public long mDuration = 0;
public SpeechItem(String text, ArrayList<String> params, int itemType) {
@@ -297,7 +298,29 @@ public class TtsService extends Service implements OnCompletionListener {
if (queueMode == 0) {
stop();
}
mSpeechQueue.add(new SpeechItem(text, params, SpeechItem.SPEECH));
mSpeechQueue.add(new SpeechItem(text, params, SpeechItem.TEXT));
if (!mIsSpeaking) {
processSpeechQueue();
}
}
/**
* Speaks the given IPA text using the specified queueing mode and parameters.
*
* @param ipaText
* The IPA text that should be spoken
* @param queueMode
* 0 for no queue (interrupts all previous utterances), 1 for
* queued
* @param params
* An ArrayList of parameters. This is not implemented for all
* engines.
*/
private void speakIpa(String ipaText, int queueMode, ArrayList<String> params) {
if (queueMode == 0) {
stop();
}
mSpeechQueue.add(new SpeechItem(ipaText, params, SpeechItem.IPA));
if (!mIsSpeaking) {
processSpeechQueue();
}
@@ -455,13 +478,13 @@ public class TtsService extends Service implements OnCompletionListener {
SpeechItem splitItem;
while (end < currentSpeechItem.mText.length()){
splitText = currentSpeechItem.mText.substring(start, end);
splitItem = new SpeechItem(splitText, null, SpeechItem.SPEECH);
splitItem = new SpeechItem(splitText, null, SpeechItem.TEXT);
splitItems.add(splitItem);
start = end;
end = start + MAX_SPEECH_ITEM_CHAR_LENGTH - 1;
}
splitText = currentSpeechItem.mText.substring(start);
splitItem = new SpeechItem(splitText, null, SpeechItem.SPEECH);
splitItem = new SpeechItem(splitText, null, SpeechItem.TEXT);
splitItems.add(splitItem);
mSpeechQueue.remove(0);
for (int i = splitItems.size() - 1; i >= 0; i--){
@@ -491,10 +514,12 @@ public class TtsService extends Service implements OnCompletionListener {
// processSpeechQueue to continue running the queue
Log.i("TTS processing: ", currentSpeechItem.mText);
if (sr == null) {
if (currentSpeechItem.mType == SpeechItem.SPEECH) {
if (currentSpeechItem.mType == SpeechItem.TEXT) {
currentSpeechItem = splitCurrentTextIfNeeded(currentSpeechItem);
speakInternalOnly(currentSpeechItem.mText,
currentSpeechItem.mParams);
} else if (currentSpeechItem.mType == SpeechItem.IPA) {
// TODO Implement IPA support
} else {
// This is either silence or an earcon that was missing
silence(currentSpeechItem.mDuration);
@@ -560,8 +585,7 @@ public class TtsService extends Service implements OnCompletionListener {
}
/**
* Synthesizes the given text using the specified queuing mode and
* parameters.
* Synthesizes the given text to a file using the specified parameters.
*
* @param text
* The String of text that should be synthesized
@@ -606,6 +630,52 @@ public class TtsService extends Service implements OnCompletionListener {
return true;
}
/**
* Synthesizes the given IPA text to a file using the specified parameters.
*
* @param ipaText
* The String of IPA text that should be synthesized
* @param params
* An ArrayList of parameters. The first element of this array
* controls the type of voice to use.
* @param filename
* The string that gives the full output filename; it should be
* something like "/sdcard/myappsounds/mysound.wav".
* @return A boolean that indicates if the synthesis succeeded
*/
private boolean synthesizeIpaToFile(String ipaText, ArrayList<String> params,
String filename, boolean calledFromApi) {
// Only stop everything if this is a call made by an outside app trying
// to
// use the API. Do NOT stop if this is a call from within the service as
// clearing the speech queue here would be a mistake.
if (calledFromApi) {
stop();
}
Log.i("TTS", "Synthesizing IPA to " + filename);
boolean synthAvailable = false;
try {
synthAvailable = synthesizerLock.tryLock();
if (!synthAvailable) {
return false;
}
// Don't allow a filename that is too long
// TODO use platform constant
if (filename.length() > 250) {
return false;
}
// TODO: Add nativeSynth.synthesizeIpaToFile(text, filename);
} finally {
// This check is needed because finally will always run; even if the
// method returns somewhere in the try block.
if (synthAvailable) {
synthesizerLock.unlock();
}
}
Log.i("TTS", "Completed synthesis for " + filename);
return true;
}
@Override
public IBinder onBind(Intent intent) {
if (ACTION.equals(intent.getAction())) {
@@ -651,6 +721,27 @@ public class TtsService extends Service implements OnCompletionListener {
mSelf.speak(text, queueMode, speakingParams);
}
/**
* Speaks the given IPA text using the specified queueing mode and
* parameters.
*
* @param ipaText
* The IPA text that should be spoken
* @param queueMode
* 0 for no queue (interrupts all previous utterances), 1 for
* queued
* @param params
* An ArrayList of parameters. The first element of this
* array controls the type of voice to use.
*/
public void speakIpa(String ipaText, int queueMode, String[] params) {
ArrayList<String> speakingParams = new ArrayList<String>();
if (params != null) {
speakingParams = new ArrayList<String>(Arrays.asList(params));
}
mSelf.speakIpa(ipaText, queueMode, speakingParams);
}
/**
* Plays the earcon using the specified queueing mode and parameters.
*
@@ -794,7 +885,7 @@ public class TtsService extends Service implements OnCompletionListener {
}
/**
* Speaks the given text using the specified queueing mode and
* Synthesizes the given text to a file using the specified
* parameters.
*
* @param text
@@ -815,6 +906,29 @@ public class TtsService extends Service implements OnCompletionListener {
}
return mSelf.synthesizeToFile(text, speakingParams, filename, true);
}
/**
* Synthesizes the given IPA text to a file using the specified
* parameters.
*
* @param ipaText
* The String of IPA text that should be synthesized
* @param params
* An ArrayList of parameters. The first element of this
* array controls the type of voice to use.
* @param filename
* The string that gives the full output filename; it should
* be something like "/sdcard/myappsounds/mysound.wav".
* @return A boolean that indicates if the synthesis succeeded
*/
public boolean synthesizeIpaToFile(String ipaText, String[] params,
String filename) {
ArrayList<String> speakingParams = new ArrayList<String>();
if (params != null) {
speakingParams = new ArrayList<String>(Arrays.asList(params));
}
return mSelf.synthesizeIpaToFile(ipaText, speakingParams, filename, true);
}
};
}