2012-08-02 76 views
5

我用FLITE-1.4-iphone做文本到語音上UITextView突出字。在閱讀文本時,我想要逐字自動突出顯示文本。文本到語音:通過詞的iPhone

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

回答

2

弗萊特沒有辦法配合,以便查看正在講什麼話的時候。它所做的就是使用文本生成一個音頻文件並播放它。 你可以做一個自定義的類來處理被傳遞到文字轉語音的信息。該類將字符串分隔成單獨的單詞,然後將它們傳遞給過濾器。

如果您在fliteTTS.m看,在speakText:方法,你可以看到,它創建了一個wav文件,然後有一個AVPlayer播放的wav文件。你可以做的,就是改變這種方法,這樣,而不是播放文件,它會將該網址返回WAV文件到您的自定義類(可以將它們保存在一個數組)。

然後讓自定義類的順序播放聲音,每次播放下一個剪輯時,突出顯示文本的新的部分。

所以不是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並不熟悉,所以我不能真正幫你設置,但在蘋果的開發者網站上有一些非常好的樣本。這是你應該看看:link

只要不要忘記刪除音頻文件,當你完成它們。