我正在使用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。
如果您在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不熟悉,因此我无法真正帮助您进行设置,但是Apple的开发人员站点上有一些非常好的示例。这是您应该查看的:link
只是不要忘记在完成音频文件后删除它们。