0

Good Morning,

I have the following iphone app that converts a string to audio using googleTTS, and am stuck on actually playing the downloaded data. Can someone please help me figure out why I cannot hear anything.

viewcontroller.h

#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
#import "RJGoogleTTS.h"


@interface ViewController : UIViewController <CLLocationManagerDelegate>

@property (weak, nonatomic) IBOutlet UILabel *userLabel;
@property (strong, nonatomic) CLLocationManager *locationManager;
@property (strong, nonatomic) CLGeocoder *geoCoder;

@property (strong, nonatomic) RJGoogleTTS *googleTTS;

- (IBAction)geoCodeLocation:(id)sender;

- (IBAction)rjGoogleButton:(id)sender;
@end

viewcontroller.m

- (IBAction)rjGoogleButton:(id)sender {

    googleTTS = [[RJGoogleTTS alloc]init];

    [googleTTS convertTextToSpeech:@"How are you today user?"];

}

rjgoogletts.h

#import <Foundation/Foundation.h>

@protocol RJGoogleTTSDelegate <NSObject>

@required
- (void)receivedAudio:(NSMutableData *)data;
- (void)sentAudioRequest;

@end

@interface RJGoogleTTS : NSObject {
    id <RJGoogleTTSDelegate> delegate;
    NSMutableData *downloadedData;
}

@property (nonatomic, retain) id <RJGoogleTTSDelegate> delegate;
@property (nonatomic, retain) NSMutableData *downloadedData;

- (void)convertTextToSpeech:(NSString *)searchString;

@end

rjgoogletts.m

#import "RJGoogleTTS.h"
#import <AVFoundation/AVFoundation.h>

@implementation RJGoogleTTS
@synthesize delegate, downloadedData;

- (id)init
{
    self = [super init];
    if (self) {
        // Initialization code here.
    }

    return self;
}

- (void)convertTextToSpeech:(NSString *)searchString {

    //NSString *search = [NSString stringWithFormat:@"http://translate.google.com/translate_tts?q=%@", searchString];
    NSString *search = [NSString stringWithFormat:@"http://translate.google.com/translate_tts?tl=en&q=%@", searchString];

    search = [search stringByReplacingOccurrencesOfString:@" " withString:@"%20"];
    NSLog(@"Search: %@", search);
    self.downloadedData = [[NSMutableData alloc] initWithLength:0];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:search]];
    [request setValue:@"Mozilla/5.0" forHTTPHeaderField:@"User-Agent"];
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
    //[delegate sentAudioRequest];




}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    NSLog(@"did you receive response user");
    [self.downloadedData setLength:0];

}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    NSLog(@"did you receive data user");
    [self.downloadedData appendData:data];



}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    NSLog(@"Failure");
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {

    NSLog(@"it worked user!!!");
    [delegate receivedAudio:self.downloadedData];
    NSLog(@"here are the bytes downloaded, %d", [self.downloadedData length]);


    NSString *txt = [[NSString alloc] initWithData:downloadedData encoding: NSASCIIStringEncoding];
    NSLog(@"%@hello",txt);

    AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc]initWithData:self.downloadedData error:nil];
    [audioPlayer prepareToPlay];
    [audioPlayer play];

}

@end
4

1 回答 1

2

Are you using ARC? If so, you will need to retain the audio so it doesn't automatically set to nil, add the following property into the header file of rjgoogletts and voila! @property (nonatomic, strong) AVAudioPlayer *audioPlayer; Hope this helps. Jim

于 2013-03-12T17:47:04.627 回答