Flite nie ma sposobu, aby związać się, by zobaczyć, co jest słowo mówione kiedy. To, co robi, wykorzystuje tekst do wygenerowania pliku audio i po prostu go odtwarza. Można utworzyć niestandardową klasę do obsługi informacji przekazywanych do TextToSpeech. Klasa rozdzieli ciąg na osobne słowa, a następnie przekaże je do flite.
Jeśli spojrzysz w fliteTTS.m, w metodzie speakText: zobaczysz, że tworzy plik WAV, a następnie AVPlayer odtwarza plik WAV. co możesz zrobić, to zmienić tę metodę, aby zamiast odtwarzać plik, zwrócił adres URL do pliku wav do twojej klasy niestandardowej (która mogłaby je zapisać w tablicy).
Następnie dodaj klasę niestandardową, aby odtworzyć dźwięki w kolejności i za każdym razem, gdy odtwarzasz następny klip, zaznacz nową sekcję tekstu.
Więc zamiast speakText:
-(NSString *)urlForSpeech:(NSString *)text
{
NSMutableString *cleanString;
cleanString = [NSMutableString stringWithString:@""];
if([text length] > 1)
{
int x = 0;
while (x < [text length])
{
unichar ch = [text characterAtIndex:x];
[cleanString appendFormat:@"%c", ch];
x++;
}
}
if(cleanString == nil)
{ // string is empty
cleanString = [NSMutableString stringWithString:@""];
}
sound = flite_text_to_wave([cleanString UTF8String], voice);
NSArray *filePaths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
NSString *recordingDirectory = [filePaths objectAtIndex: 0];
// Pick a file name
NSString *tempFilePath = [NSString stringWithFormat: @"%@/%s", recordingDirectory, "temp.wav"];
// save wave to disk
char *path;
path = (char*)[tempFilePath UTF8String];
cst_wave_save_riff(sound, path);
return tempFilePath;
}
Aby zaznaczyć tekst, jako AVPlayer odgrywa poprzez pliki, skorzystaj:
[textView select:self];
textView.selectedRange = aSelectedRange;
Gdzie aSelectedRange jest zakres łańcucha chcesz podświetlona.
Nie jestem zaznajomiony z AVPlayerem, więc naprawdę nie mogę pomóc ci go skonfigurować, ale jest kilka bardzo dobrych próbek na stronie dewelopera Apple'a. Oto, co powinieneś sprawdzić: link
Po prostu nie zapomnij skasować plików audio, gdy skończysz.