2012-08-02 18 views
5

Sto facendo il text to speech su un UITextView usando il flite-1.4-iphone. Durante la lettura del testo, voglio evidenziare automaticamente il testo parola per parola.Text to speech: evidenziare parola per parola per iphone

  1. Come posso sincronizzare la voce con l'evidenziazione del testo durante la lettura?
  2. Come è possibile evidenziare il testo sulla visualizzazione del testo?

Ecco il mio codice corrente:

-(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]; 
    } 
} 

risposta

2

Flite non dispone di un modo per legare per vedere quale parola che viene detto quando. Quello che fa è usare il testo per generare un file audio e semplicemente riprodurlo. È possibile creare una classe personalizzata per gestire le informazioni trasmesse a TextToSpeech. La classe separerebbe la stringa in parole separate e poi le passerebbe al flite.

Se si guarda in fliteTTS.m, nel metodo speakText: si può vedere che crea un file wav e quindi un AVPlayer riproduce il file wav. quello che potresti fare è cambiare quel metodo in modo che invece di riprodurre il file, restituirà l'URL al file wav alla tua classe personalizzata (che potrebbe salvarli in un array).

Quindi fare in modo che la classe personalizzata suoni i suoni in ordine e ogni volta che si riproduce il clip successivo, evidenziare la nuova sezione di testo.

Così, invece di 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;  
} 

per evidenziare il testo, come AVPlayer riproduce attraverso i file, utilizzare:

[textView select:self]; 
textView.selectedRange = aSelectedRange; 

Dove aSelectedRange è la gamma della stringa che si desidera evidenziare.

Non ho familiarità con AVPlayer, quindi non posso davvero aiutarti a configurarlo, ma ci sono alcuni esempi molto buoni sul sito degli sviluppatori di Apple. Ecco cosa dovresti guardare: link

Basta non dimenticare di cancellare i file audio quando hai finito con loro.

Problemi correlati