2010-06-23 31 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