文本到语音:逐字突出显示iphone

时间:2012-08-02 09:45:17

标签: ios uitextview text-to-speech flite

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

  1. 如何在阅读时将语音与文本突出显示同步?
  2. 如何突出显示文字视图上的文字?
  3. 这是我目前的代码:

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

1 个答案:

答案 0 :(得分:2)

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

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

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

所以而不是发言文字:

-(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并不熟悉,所以我无法帮助你设置它,但苹果的开发者网站上有一些非常好的样本。这是你应该看到的:link

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