2012-08-02 8 views
5

Robię tekst na mowę na UITextView przy użyciu flite-1.4-iphone. Podczas czytania tekstu chcę automatycznie podświetlić tekst słowo po słowie.Tekst na mowę: podświetlanie słowo po słowie dla iPhone

  1. Jak mogę zsynchronizować głos z podświetlaniem tekstu podczas czytania?
  2. Jak wyróżnić tekst w widoku tekstowym?

Oto mój bieżący kod:

-(IBAction)btnClick:(id)sender 
{ 
    [indicator startAnimating]; 
    textToSpeech = [[TextToSpeech alloc] init]; 
    [textToSpeech setVoice:@"cmu_us_awb"]; 
    [textToSpeech speakText:txtview.text]; 
    if ([txtview.text isEqualToString:@""]) 
    { 
     [textToSpeech stopTalking]; 
     [self animate]; 
    } 
} 

Odpowiedz

2

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.

Powiązane problemy