5 votes

Synthèse vocale sur iPhone

Quelle serait la difficulté d'implémenter quelque chose de similaire à la fonction AppleScript say "words" ?
En d'autres termes, s'agit-il simplement d'un lien binaire et d'un import, ou de quelque chose d'aussi compliqué qu'une implémentation libxml ?

Edit : Ma réponse résout ce problème.


  • Acapela
    • Une véritable arnaque
    • 250 € pour le SDK, sans compter les mises à jour.
  • Ivona
    • Le site ne présente pas une version iOS avec les autres
    • Pas intéressé
  • VoiceText
    • Le site est laid et difficile à naviguer
    • Pas intéressé
  • Oreilles ouvertes
    • Open source, un atout indéniable
    • De loin le meilleur TTS hors ligne dont j'ai entendu parler.
  • Flite
    • Super mauvaise qualité, ne vaut pas la peine d'être utilisé
    • Ça craint en l'état. L'OE l'a beaucoup amélioré.
  • Google TTS
    • Bon, mais nécessite une connexion réseau
    • Pas idéal

7voto

Jano Points 37593

J'ai étudié la question et malheureusement, les options sont soit très chères, soit de mauvaise qualité :

Dans le même ordre d'idées, voici comment vous pouvez utiliser le TTS en ligne de Google (code tiré de iPhone SDK - Google TTS et encodage ) :

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"file.mp3"];

NSString *text = @"You are one chromosome away from being a potato.";
NSString *urlString = [NSString stringWithFormat:@"http://www.translate.google.com/translate_tts?tl=en&q=%@",text];
NSURL *url = [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSMutableURLRequest* request = [[[NSMutableURLRequest alloc] initWithURL:url] autorelease];
[request setValue:@"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1" forHTTPHeaderField:@"User-Agent"];
NSURLResponse* response = nil;
NSError* error = nil;
NSData* data = [NSURLConnection sendSynchronousRequest:request
                                     returningResponse:&response
                                                 error:&error];
[data writeToFile:path atomically:YES];

AVAudioPlayer  *player;
NSError        *err;
if ([[NSFileManager defaultManager] fileExistsAtPath:path]) 
{    
    player = [[AVAudioPlayer alloc] initWithContentsOfURL:
              [NSURL fileURLWithPath:path] error:&err];
    player.volume = 0.4f;
    [player prepareToPlay];
    [player setNumberOfLoops:0];
    [player play];    
}

Le cadre de voix-off d'Apple est privé et ne peut être utilisé que pour l'accessibilité. Du moins si vous voulez que votre application soit approuvée. Mais si vous voulez l'utiliser pendant que vous décidez du système à utiliser, le voici :

// Not App Store safe. Only available in real devices.
// See http://arstechnica.com/apple/2010/02/iphone-voiceservices-looking-under-the-hood/

#define RTLD_LAZY 0x1
#define RTLD_NOW 0x2
#define RTLD_LOCAL 0x4
#define RTLD_GLOBAL 0x8

NSObject *voiceSynthesizer;
void *voiceServices;

-(void) say:(NSString*)text {
    if (!voiceSynthesizer)
    {
        NSString *vsLocation = @"/System/Library/PrivateFrameworks/VoiceServices.framework/VoiceServices";
        voiceServices = dlopen(vsLocation.UTF8String, RTLD_LAZY);
        voiceSynthesizer = [NSClassFromString(@"VSSpeechSynthesizer") new];
    }
    [voiceSynthesizer performSelector:@selector(startSpeakingString:) withObject:text];
}

1voto

Thromordyn Points 933

À partir d'une question posée sur SO (j'ai oublié laquelle, je ne la retrouve plus), j'ai obtenu un lien vers Oreilles Ouvertes .
Pour quelque chose d'aussi léger, je ne peux pas vraiment me plaindre.

C'est un peu déroutant à brancher, mais le documentation c'est tout pour Xcode 4. Sauf erreur de l'utilisateur, il ne fera pas exploser un projet. Il y a quelques avertissements (dont certains semblent devoir provoquer un plantage au moment de l'exécution), mais tout se passe bien jusqu'à présent.

Edit : La dernière version OE est BEAUCOUP plus facile à installer. Définitivement recommandé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X