#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
|