Ios 文字到语音:为iphone逐字突出显示
我正在使用flite-1.4-iphone在Ios 文字到语音:为iphone逐字突出显示,ios,uitextview,text-to-speech,flite,Ios,Uitextview,Text To Speech,Flite,我正在使用flite-1.4-iphone在UITextView上进行文本到语音转换。在阅读文本时,我想逐字自动突出显示文本 阅读时如何将语音与文本突出显示同步 如何在文本视图中高亮显示文本 以下是我当前的代码: -(IBAction)btnClick:(id)sender { [indicator startAnimating]; textToSpeech = [[TextToSpeech alloc] init]; [textToSpeech setVoice:@
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 如果查看flitets.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;
}
其中,SelectedRange是要高亮显示的字符串的范围
我不熟悉AVPlayer,所以我不能真正帮助您设置它,但在苹果的开发者网站上有一些非常好的示例。这是您应该看到的:
只是别忘了在处理完音频文件后删除它们
[textView select:self];
textView.selectedRange = aSelectedRange;