#import <UIKit/UIKit.h> #import <AVFoundation/AVFoundation.h> #import <QuartzCore/QuartzCore.h> @interface RootViewController : UIViewController<AVAudioRecorderDelegate,UIAlertViewDelegate> { AVAudioRecorder *recoder; NSURLConnection *urlConnection; NSMutableData *receiveData; NSTimer *timer; NSTimeInterval bInterval; UIAlertView *wAlertView; } @end // // RootViewController.m // asr // // Created by cat on 14-3-20. // Copyright (c) 2014年 cat. All rights reserved. // #import "RootViewController.h" @interfaceRootViewController () @end @implementation RootViewController - (void)viewDidLoad { [superviewDidLoad]; // Do any additional setup after loading the view. } - (void)didReceiveMemoryWarning { [superdidReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (void)dealloc { if(recoder) { [recoder stop]; [recoder release]; } [urlConnectionrelease]; [super dealloc]; } - (void)loadView { [super loadView]; NSString *str[] = {@"Record", @"Play"}; float y = 64.0f; for(int i = 0;i < sizeof(str) / sizeof(str[0]); i++) { UIButton *button = [UIButtonbuttonWithType:UIButtonTypeRoundedRect]; button.frame = CGRectMake(160.0f - 40.0f, y, 80.0f, 80.0f); button.tag = 100 + i; button.layer.masksToBounds = YES; button.layer.cornerRadius = 40.0f; button.layer.borderColor = [[UIColor redColor] CGColor]; [button setTitle:str[i] forState:UIControlStateNormal]; if(i != 0) [button addTarget:selfaction:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button]; if(i == 0) { UILongPressGestureRecognizer *gestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)]; [button addGestureRecognizer:gestureRecognizer]; [gestureRecognizer release]; } y += button.bounds.size.width + 40.0f; } receiveData = [[NSMutableData alloc] init]; [[AVAudioSessionsharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecorderror: nil]; } - (void)longPress:(UILongPressGestureRecognizer *)gestureRecognizer { if([gestureRecognizer state] == UIGestureRecognizerStateBegan) { [self record]; } elseif([gestureRecognizer state] == UIGestureRecognizerStateEnded) { [selfparseStringFromWav]; } } - (void)parseStringFromWav { wAlertView = [[UIAlertViewalloc] initWithTitle:@"Please Wait"message:nildelegate:selfcancelButtonTitle:nilotherButtonTitles:nil]; [wAlertViewshow]; UIActivityIndicatorView *aiv = [[UIActivityIndicatorViewalloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; aiv.center = CGPointMake(wAlertView.bounds.size.width / 2.0f, wAlertView.bounds.size.height - 40.0f); [aiv startAnimating]; [wAlertView addSubview:aiv]; [aiv release]; [wAlertViewrelease]; if(recoder) { [recoder stop]; } if(timer) { [timer invalidate]; timer = nil; } NSURL *url = [NSURLURLWithString:@"http://www.google.com/speech-api/v1/recognize?xjerr=1&client=chromium&lang=zh"]; //Create the request NSMutableURLRequest *request = [[[NSMutableURLRequestalloc] init] autorelease]; //头部设置 NSDictionary *headField = [NSDictionarydictionaryWithObjectsAndKeys:@"audio/L16; rate=16000",@"Content-Type", nil]; [request setAllHTTPHeaderFields:headField]; //要post的网址 [request setURL:url]; [request setHTTPMethod:@"POST"]; [request setHTTPBody:[NSDatadataWithContentsOfFile:[selfrecordTmpPath]]]; if(urlConnection) { [urlConnectioncancel]; [urlConnectionrelease]; urlConnection = nil; } urlConnection = [[NSURLConnectionalloc] initWithRequest:request delegate:selfstartImmediately:YES]; [urlConnectionstart]; } - (void)buttonPressed:(UIButton *)sender { if(sender.tag == 101) { NSError *error; NSURL *url = [NSURL fileURLWithPath:[self recordTmpPath]]; AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error]; if(!audioPlayer) { NSLog(@">>>>>>>>>>audioplayer cant not init"); return; } if(![audioPlayer prepareToPlay]) { NSLog(@">>>>>>>>>>not prepareToPlay"); return; } if(![audioPlayer play]) { NSLog(@">>>>>>>>>>not play"); } } } - (NSString *)recordTmpPath { return [NSTemporaryDirectory() stringByAppendingFormat:@"voice.wav"]; } - (BOOL)record { NSError *error; NSMutableDictionary *settings = [NSMutableDictionarydictionary]; [settings setValue:[NSNumbernumberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey]; [settings setValue:[NSNumbernumberWithFloat:16000] forKey:AVSampleRateKey]; [settings setValue:[NSNumbernumberWithInt:1] forKey:AVNumberOfChannelsKey]; [settings setValue:[NSNumbernumberWithInt:AVAudioQualityHigh] forKey:AVEncoderAudioQualityKey]; NSLog(@">>>>>>>>>>path %@", [selfrecordTmpPath]); NSURL *url = [NSURL fileURLWithPath:[self recordTmpPath]]; if(recoder) { [recoder release]; recoder = nil; } recoder = [[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error]; if(!recoder) { NSLog(@">>>>>>Error %@", [error localizedDescription]); return NO; } recoder.delegate = self; if(![recoderprepareToRecord]) { [selfshowAlert:@"Error while preparing recording..."]; return NO; } if(![recoder record]) { [selfshowAlert:@"Error while attempting to record audio..."]; return NO; } if(timer) { [timer invalidate]; timer = nil; } bInterval = [[NSDatedate] timeIntervalSince1970]; timer = [NSTimerscheduledTimerWithTimeInterval:1.0ftarget:selfselector:@selector(update) userInfo:nilrepeats:YES]; returnYES; } - (void)update { int sec = [[NSDatedate] timeIntervalSince1970] - bInterval; self.title = [NSString stringWithFormat:@"%ds", sec]; } - (void)viewWillDisappear:(BOOL)animated { if(timer) { [timer invalidate]; timer = nil; } } - (void)updateMeters { [recoderupdateMeters]; float peakPowerForChannel = pow(10, 0.05 * [recoder peakPowerForChannel:0]); float averagePowerForChannel = pow(10, 0.05*[recoder averagePowerForChannel:0]); NSLog(@"Average input: %f Peak input: %f", peakPowerForChannel,averagePowerForChannel); } - (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag { NSLog(@">>>>>>>>>>audioRecorderDidFinishRecording"); } /* if an error occurs while encoding it will be reported to the delegate. */ - (void)audioRecorderEncodeErrorDidOccur:(AVAudioRecorder *)recorder error:(NSError *)error { NSLog(@">>>>>>>>>>audioRecorderEncodeErrorDidOccur %@", [error localizedDescription]); } - (void)showAlert:(NSString *)aMessage { UIAlertView *alertView = [[UIAlertViewalloc] initWithTitle:@"提示"message:aMessage delegate:nilcancelButtonTitle:@"确定"otherButtonTitles:nil]; [alertView show]; [alertView release]; } #pragma mark - #pragma mark NSURLConnection delegate Methods - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { [receiveDatasetLength:0]; } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { if(data) [receiveData appendData:data]; } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { NSLog(@">>>>>>>>>>connectionDidFinishLoading"); [wAlertViewdismissWithClickedButtonIndex:0animated:NO]; NSString *result = [[[NSStringalloc] initWithData:receiveDataencoding:NSUTF8StringEncoding] autorelease]; [self showAlert:result]; } - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { NSLog(@">>>>>>>>>>didFailWithError %@",[error localizedDescription]); [wAlertViewdismissWithClickedButtonIndex:0animated:YES]; } @end