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

  • 在阅读时如何将语音与突出显示的文本同步?
  • 如何在文本 View 中突出显示文本?

  • 这是我当前的代码:
    -(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];
        }
    }
    

    最佳答案

    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不熟悉,因此我无法真正帮助您进行设置,但是Apple的开发人员站点上有一些非常好的示例。这是您应该查看的:link

    只是不要忘记在完成音频文件后删除它们。

    10-08 16:03