2010-06-23 59 views
0

我在我的项目stated here中使用Flite文本语音引擎。我从json网址获取值并将它们转换为语音。但是,我想知道如何实现audioPlayerDidFinishPlaying:成功:委托方法,并在Flitetts文件中调用时播放下一个块。音频播放器必须一个接一个地播放一个对象,并且在完成播放第一个值之后它必须获得下一个值并将其转换为语音。相应的图像等还必须加载...实现audioPlayerDidFinishPlaying:成功:在Flite引擎

这里,我迄今所做的代码...

SBJSON *json = [[SBJSON alloc]init]; 
fliteEngine = [[FliteTTS alloc] init]; 
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.sampleurl.txt"]]; 
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
NSString *jsonstring = [[NSString alloc]initWithData:response encoding:NSUTF8StringEncoding]; 

NSArray *asanasList = [json objectWithString:jsonstring error:nil]; 
NSArray *asanas =[asanasList objectForKey:@"yogagurubackpain"]; 


for(NSDictionary *test in asanas) 
{ 

    UrlValues *myasanas = [[UrlValues alloc]init]; 
    myasanas.asanatitle = [test objectForKey:@"asanatitle"]; 
    myasanas.asanatranscript = [test objectForKey:@"asanatranscript"]; 
    myasanas.asanapicture = [test objectForKey:@"asanapicture"]; 
    [data.yoga addObject:myasanas]; 
    [myasanas release]; 
} 


UrlValues *asana=[[data yoga]objectAtIndex:0]; 
self.AsanaName.text = [asana asanatitle]; 
self.AsanaTranscript.text = [asana asanatranscript]; 

NSString *imageUrl = [asana asanapicture]; 
NSString* mapUrl = [imageUrl stringByReplacingPercentEscapesUsingEncoding:NSASCIIStringEncoding]; 
NSData* imageData = [[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:mapUrl]]; 
UIImage* image = [[UIImage alloc] initWithData:imageData]; 
self.AsanaImage.image = image; 


NSString *speak = self.AsanaTranscript.text; 
[fliteEngine setVoice:@"cmu_us_rms"]; 
[fliteEngine speakText:speak]; 
[fliteEngine setPitch:100.0 variance:11.0 speed:0.4]; 
    [imageData release]; 
    [image release]; 

[jsonstring release]; 
[json release]; 

plz帮助我一些示例代码或教程,这样我可以得到任务完成...

回答

1

如果文本到语音引擎使用AVAudioPlayer对象播放声音,您可以调用audioPlayerDidFinishPlaying委托方法的唯一方法。如果没有,那么显然委托方法不会被调用。相反,您必须禁止它直接播放声音,而是使用AVAudioPlayer对象。

还有就是这里的例子:

http://artofsystems.blogspot.com/2009/02/speech-synthesis-on-iphone-with-flite.html

+0

的弗莱特引擎使用AVAudioPlayer对象和第一个字符串转换为语音后甚至audioPlayerDidFinishPlaying获取调用。我唯一想知道的是如何在完成第一个字符串后使用它来转到下一个字符串。 – 2010-06-24 04:48:17

+0

那么,一种方法是将代码放入'audioPlayerDidFinishPlaying'中,以加载下一个URL并通过Flite引擎提供。所以基本上:它第一次运行它解析第一个URL,在'audioPlayerDidFinishPlaying'中它检查是否另一个要解析的URL,如果是,则解析并播放它。所以这样,你可以使用'audioPlayerDidFinishPlaying'作为循环。 – iwasrobbed 2010-06-24 22:07:06

+0

这可能会让你指出正确的方向:http://www.iphonedevsdk.com/forum/iphone-sdk-development/27285-play-sequence-audio-files-avaudioplayer.html – iwasrobbed 2010-06-25 01:43:47