Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 文字到语音:为iphone逐字突出显示_Ios_Uitextview_Text To Speech_Flite - Fatal编程技术网

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

Ios 文字到语音:为iphone逐字突出显示,ios,uitextview,text-to-speech,flite,Ios,Uitextview,Text To Speech,Flite,我正在使用flite-1.4-iphone在UITextView上进行文本到语音转换。在阅读文本时,我想逐字自动突出显示文本 阅读时如何将语音与文本突出显示同步 如何在文本视图中高亮显示文本 以下是我当前的代码: -(IBAction)btnClick:(id)sender { [indicator startAnimating]; textToSpeech = [[TextToSpeech alloc] init]; [textToSpeech setVoice:@

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

  • 阅读时如何将语音与文本突出显示同步
  • 如何在文本视图中高亮显示文本
  • 以下是我当前的代码:

    -(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

    如果查看flitets.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;      
    }
    
    其中,SelectedRange是要高亮显示的字符串的范围

    我不熟悉AVPlayer,所以我不能真正帮助您设置它,但在苹果的开发者网站上有一些非常好的示例。这是您应该看到的:

    只是别忘了在处理完音频文件后删除它们

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