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 不熟悉,所以我真的不能帮你设置它,但苹果的开发者网站上有一些非常好的示例。这是您应该查看的内容:链接
完成后不要忘记删除音频文件。