Flag dəyişkən olaraq istifadə edirdim onu, canPlay olacaqdı adı, amma işimə yaramadı, oxuyub qurtardığını, bir sonrakı cümləni oxuya bilərmi yoxlamaq üçün idi.
Problemi isə həll etdim 2 gün fikirləşdikdən sonra, bəlkə kiməsə lazım olar nə vaxtsa:
[code]
static int counter=0;
public List<String> sentences = new ArrayList<String>();
private void prepareTTSEngine() {
try {
synthesis = SpeechSynthesis.getInstance(this);
synthesis.setSpeechSynthesisEvent(new SpeechSynthesisEvent() {
public void onPlaySuccessful() {
Log.i(TAG, "onPlaySuccessful");
try {
if(counter!=sentences.size()-1)
{
synthesis.speak(sentences.get(counter));
counter++;
}
} catch (BusyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoNetworkException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void onPlayStopped() {
Log.i(TAG, "onPlayStopped");
playing=false;
}
public void onPlayFailed(Exception e) {
Log.e(TAG, "onPlayFailed");
e.printStackTrace();
playing=false;
}
public void onPlayStart() {
Log.i(TAG, "onPlayStart");
//playing=true;
}
@Override
public void onPlayCanceled() {
Log.i(TAG, "onPlayCanceled");
playing=false;
}
});
//synthesis.setVoiceType("usenglishfemale1"); // All the values available to you can be found in the developer portal under your account
} catch (InvalidApiKeyException e) {
Log.e(TAG, "Invalid API key\n" + e.getStackTrace());
Toast.makeText(_context, "ERROR: Invalid API key", Toast.LENGTH_LONG).show();
}
}
BreakIterator iterator = BreakIterator.getSentenceInstance(Locale.US);
iterator.setText(speech);
int start = iterator.first();
for (int end = iterator.next();end != BreakIterator.DONE; start = end, end = iterator.next())
{
if(speech !=null && speech.substring(start,end).compareTo("")!=0)
{
final String sentence_next=speech.substring(start,end);
sentences.add(sentence_next);
// //set ready flag to true (so isReady returns true)
//
//
//
// try {
// synthesis.speak("first sentence");
//
// } catch (BusyException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (NoNetworkException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//
//
//
// // break;
}
}
try {
counter=0;
synthesis.speak("The text");
} catch (BusyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoNetworkException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}[/code]
Koda üzdən baxdım. Aşağıdakı kodda niyə false yox true yazılıb?
[code]
public void onPlaySuccessful() {
Log.i(TAG, "onPlaySuccessful");
playing=true;
}
[/code]
Diqqətə görə çox sağ ol. Amma məndə TTS obyekti hazır bir kitabxana sinfinin obyektidir. Yəni Androidin öz TTS motorunu istifadə etmirəm. (Səbəb türk dili dəstəyinin olmaması.) Mənim tts obyektim org.ispeech.SpeechSynthesis class-ını istifadə edir. Dolayısı ilə speak methodu da tək parametr istəyir, əlavə parametrlər qəbul etmir. onplaysuccessful methodundan başa düşmək olar cümləni oxuyub qurtardığını (preparettsengine funksiyası içindəki). Yeganə yol ordan istifadə etmək kimi görünür.
Ardıcıl olaraq səsləndirmək üçün Android Developer dakumentasiyasında TTS üçün ola bu məqalədəki "Making your application speak" hissəsinə baxın. Hər bir cümləni ayrı-ayrı səsləndirmək əvəzinə. Bir TTS obyektinə cümlələri növbə şəklində təqdim edə bilərsiniz. Bu nümunədə olduğu kimi:
[code]
String myText1 = "Bu mövbənin ilk cümləsidir. ";
String myText2 = "Bu isə ikinci növbəyə əlavə olunan ikinci cümlədir.";
mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, null);
mTts.speak(myText2, TextToSpeech.QUEUE_ADD, null);
[/code]
Bu kod istədiyim kimi işləmir hazırda, sadəcə indiki halı budur.
[code] public boolean playing=false;
private void prepareTTSEngine() {
try {
synthesis = SpeechSynthesis.getInstance(this);
synthesis.setSpeechSynthesisEvent(new SpeechSynthesisEvent() {
public void onPlaySuccessful() {
Log.i(TAG, "onPlaySuccessful");
playing=true;
}
public void onPlayStopped() {
Log.i(TAG, "onPlayStopped");
playing=false;
}
public void onPlayFailed(Exception e) {
Log.e(TAG, "onPlayFailed");
e.printStackTrace();
playing=false;
}
public void onPlayStart() {
Log.i(TAG, "onPlayStart");
//playing=true;
}
@Override
public void onPlayCanceled() {
Log.i(TAG, "onPlayCanceled");
playing=false;
}
});
]
} catch (InvalidApiKeyException e) {
Log.e(TAG, "Invalid API key\n" + e.getStackTrace());
Toast.makeText(_context, "ERROR: Invalid API key", Toast.LENGTH_LONG).show();
}
}
prepareTTSEngine();
String speech= MapLocationOverlay.mSelectedMapLocation.getShortDesc();
synthesis.setVoiceType("usenglishfemale");
BreakIterator iterator = BreakIterator.getSentenceInstance(Locale.US);
iterator.setText(speech);
int start = iterator.first();
for (int end = iterator.next();end != BreakIterator.DONE; start = end, end = iterator.next()) {
if(speech !=null && speech.substring(start,end).compareTo("")!=0)
{
String sentence_next=speech.substring(start,end);
//set ready flag to true (so isReady returns true)
while(playing==true)
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
synthesis.speak(sentence_next);
} catch (BusyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoNetworkException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}[/code]
kodunuzun loop hissəsini bura yazsanız daha rahat olardı kömək etmək
Java təcrübə qazanmaq – Java təcrübə proqramları
Java proqramlaşdırma dili üçün Az-dilində Material lazımdı
Android 2.3-də Java JAR problemi