2010-06-23 8 views
0

J'utilise le moteur de synthèse vocale Flite dans mon projet stated here. J'obtiens des valeurs de json url et les convertis en discours. Mais, je veux savoir comment implémenter audioPlayerDidFinishPlaying: avec succès: déléguer la méthode et jouer le morceau suivant quand il est appelé dans le fichier Flitetts. Le lecteur audio doit jouer un objet après l'autre et après l'achèvement de la lecture de la première valeur, il doit obtenir la valeur suivante et la convertir en parole. Les images etc doivent également charger ...mise en œuvre audioPlayerDidFinishPlaying: avec succès: dans le moteur Flite

correspondant Voici le code que je l'ai fait jusqu'à présent ...

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 me aider avec quelques exemples de code ou un tutoriel afin que je puisse obtenir le tâche effectuée ...

Répondre

1

La seule méthode permettant d'appeler la méthode de délégation audioPlayerDidFinishPlaying est si le moteur de synthèse vocale utilise un objet AVAudioPlayer pour lire le son. Si ce n'est pas le cas, la méthode delegate ne sera évidemment pas appelée. Au lieu de cela, vous devrez le désactiver pour lire le son directement et utiliser un objet AVAudioPlayer à la place.

Il est un exemple de cela ici:

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

+0

Le moteur Flite utilise un objet AVAudioPlayer et même audioPlayerDidFinishPlaying est appelée après se la première chaîne est convertie à la parole. La seule chose que je veux savoir est comment utiliser ceci pour passer à la chaîne suivante après l'achèvement de la première chaîne. –

+0

Eh bien, une façon serait de mettre du code dans 'audioPlayerDidFinishPlaying' qui chargerait l'URL suivante et la transmettrait via le moteur Flite. Donc, fondamentalement: la première fois qu'il exécute la première URL analysée, dans 'audioPlayerDidFinishPlaying' il vérifie s'il existe une autre URL à analyser et si c'est le cas, il l'analyse et le lit. Donc de cette façon, vous pouvez utiliser 'audioPlayerDidFinishPlaying' comme une boucle. – iwasrobbed

+0

Cela pourrait vous faire pointer dans la bonne direction: http://www.iphonedevsdk.com/forum/iphone-sdk-development/27285-play-sequence-audio-files-avaudioplayer.html – iwasrobbed