5

我正在UITextView使用 flite-1.4-iphone 在 a 上进行文本转语音。在阅读文本时,我想逐字自动突出显示文本。

  1. 如何在阅读时将语音与文本突出显示同步?
  2. 如何突出显示文本视图上的文本?

这是我当前的代码:

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

1 回答 1

2

Flite 没有办法了解何时说出了什么单词。它所做的是使用文本生成音频文件并播放它。您可以创建一个自定义类来处理传递给 TextToSpeech 的信息。该类会将字符串分成单独的单词,然后将它们传递给 flite。

如果你查看 fliteTTS.m,在 speakText: 方法中,你可以看到它创建了一个 wav 文件,然后让 AVPlayer 播放 wav 文件。您可以做的是更改该方法,而不是播放文件,而是将指向 wav 文件的 URL 返回到您的自定义类(可以将它们保存在数组中)。

然后让自定义类按顺序播放声音,每次播放下一个剪辑时,突出显示新的文本部分。

所以代替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;      
}

要突出显示文本,当 AVPlayer 播放文件时,请使用:

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

其中 aSelectedRange 是要突出显示的字符串的范围。

我对 AVPlayer 不熟悉,所以我真的不能帮你设置它,但苹果的开发者网站上有一些非常好的示例。这是您应该查看的内容:链接

完成后不要忘记删除音频文件。

于 2012-08-12T16:56:06.830 回答