2010-06-23 3 views
0

내 프로젝트의 음성 엔진에 Flite 텍스트를 사용하고 있습니다. stated here. 나는 json URL로부터 가치를 얻고 그것을 연설로 변환하고있다. 그러나, 나는 audioPlayerDidFinishPlaying을 구현하는 방법을 알고 싶다. 성공적으로 : Flitetts 파일에서 호출 될 때 메소드를 위임하고 다음 청크를 재생한다. 오디오 플레이어는 다른 개체를 재생해야하며 첫 번째 값을 재생 한 후에 다음 값을 가져 와서이를 음성으로 변환해야합니다. 등 해당 이미지는 내가 얻을 수 있도록 여기에 audioPlayerDidFinishPlaying : successful : 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

audioPlayerDidFinishPlaying 대리자 메서드를 호출 할 수있는 유일한 방법은 텍스트 음성 변환 엔진이 AVAudioPlayer 개체를 사용하여 사운드를 재생하는 것입니다. 그렇지 않으면 대리자 메서드가 호출되지 않습니다. 대신 사운드를 직접 재생하지 않도록 설정하고 AVAudioPlayer 객체를 사용해야합니다.

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

+0

플라이트 엔진이 AVAudioPlayer 개체를 사용하여 첫 번째 문자열이 음성으로 변환 된 후도 audioPlayerDidFinishPlaying 호출지고 :

은 여기에의 예입니다. 내가 알고 싶은 유일한 것은이 문자열을 사용하여 첫 번째 문자열을 완성한 후 다음 문자열로 이동하는 방법입니다. –

+0

음, 한 가지 방법은 'audioPlayerDidFinishPlaying'에 다음 URL을로드하고 Flite 엔진을 통해 코드를 제공하는 코드를 넣는 것입니다. 기본적으로 : 처음 실행될 때 첫 번째 URL을 파싱합니다. 'audioPlayerDidFinishPlaying'에서 파싱 할 다른 URL이 있는지 확인한 후 파싱하고 재생하는 경우 검사합니다. 그래서 이런 식으로'audioPlayerDidFinishPlaying'을 루프로 사용할 수 있습니다. – iwasrobbed

+0

올바른 방향으로 가리킬 수도 있습니다. http://www.iphonedevsdk.com/forum/iphone-sdk-development/27285-play-sequence-audio-files-avaudioplayer.html – iwasrobbed

관련 문제