弗萊特沒有辦法配合,以便查看正在講什麼話的時候。它所做的就是使用文本生成一個音頻文件並播放它。 你可以做一個自定義的類來處理被傳遞到文字轉語音的信息。該類將字符串分隔成單獨的單詞,然後將它們傳遞給過濾器。
如果您在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
只要不要忘記刪除音頻文件,當你完成它們。