我正在使用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];
}
}
答案 0 :(得分:2)
Flite没有办法在什么时候看到正在说的是什么词。它的作用是使用文本生成音频文件并播放它。 您可以创建一个自定义类来处理传递给TextToSpeech的信息。该类将字符串分成单独的单词,然后将它们传递给flite。
如果查看fliteTTS.m,在speakText:方法中,您可以看到它创建了一个wav文件,然后让AVPlayer播放wav文件。您可以做的是更改该方法,以便它不会播放文件,而是将wav文件的URL返回到您的自定义类(可以将它们保存在数组中)。
然后让自定义类按顺序播放声音,每次播放下一个剪辑时,突出显示新的文本部分。
所以而不是发言文字:
-(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
完成后,不要忘记删除音频文件。