2012-08-02 12 views
5

Estoy haciendo texto a voz en un UITextView usando flite-1.4-iphone. Mientras leo el texto, quiero resaltar automáticamente el texto palabra por palabra.Texto a voz: resaltando palabra por palabra para iphone

  1. ¿Cómo puedo sincronizar la voz con el texto resaltado durante la lectura?
  2. ¿Cómo puedo resaltar el texto en la vista de texto?

Aquí está mi código actual:

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

Respuesta

2

Flite no tiene manera de atar para ver qué palabra se está hablando cuando. Lo que hace es usar el texto para generar un archivo de audio y simplemente lo reproduce. Puede crear una clase personalizada para manejar la información que se pasa a TextToSpeech. La clase separaría la cadena en palabras separadas y luego las pasaría a flite.

Si miras en fliteTTS.m, en el método speakText: puedes ver que crea un archivo wav, y luego tiene un AVPlayer que reproduce el archivo wav. Lo que podría hacer es cambiar ese método para que, en lugar de reproducir el archivo, devuelva la URL del archivo wav a su clase personalizada (lo que podría guardarlos en una matriz).

Luego haga que la clase personalizada reproduzca los sonidos en orden, y cada vez que reproduzca el siguiente clip, resalte la nueva sección de texto.

Así que en lugar de 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;  
} 

para resaltar el texto, como un AVPlayer reproduce a través de los archivos, utilice:

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

Dónde aSelectedRange es el rango de la cadena que desea resaltada.

No estoy familiarizado con AVPlayer, así que no puedo ayudarte a configurarlo, pero hay algunas muestras muy buenas en el sitio para desarrolladores de apple. Esto es lo que debe ver: link

Simplemente no se olvide de eliminar los archivos de audio cuando haya terminado con ellos.

Cuestiones relacionadas