iOS开发——Siri语音识别
原理:先用系统的录音器录音,让后让siri识别语音转文字
第一步:在项目plist文件添加授权,如下图
第二步:导入头文件,添加协议,
#import
#import
@interfaceSiriViewController()
第三步:UI控件,实现siri识别方法,代码如下:
.h
#import@interfaceSiriViewController:UIViewController@end.m
////SiriViewController.m//ASR////Createdby刘成利on2017/2/28.//Copyright©2017年刘成利.Allrightsreserved.//#definesWith[UIScreenmainScreen].bounds.size.width#definesHeight[UIScreenmainScreen].bounds.size.height#import"SiriViewController.h"#import#import#import"LongPressButton.h"@interfaceSiriViewController()@property(nonatomic,strong)LongPressButton*longButton;//长按按钮@property(nonatomic,strong)UITextField*inputText;//语音转化成的文本//录音引擎@property(strong,nonatomic)AVAudioEngine*audioEngine;//语音识别任务@property(strong,nonatomic)SFSpeechRecognitionTask*recognitionTask;//语音识别器@property(strong,nonatomic)SFSpeechRecognizer*speechRecognizer;//识别请求@property(strong,nonatomic)SFSpeechAudioBufferRecognitionRequest*recognitionRequest;@end@implementationSiriViewController-(void)viewDidLoad{[superviewDidLoad];self.view.backgroundColor=[UIColorwhiteColor];//创建信息labelUILabel*textLabel=[[UILabelalloc]initWithFrame:CGRectMake(50,50,sWith-100,30)];textLabel.text=@"【Siri】语音识别转文字";textLabel.font=[UIFontfontWithName:@"HelveticaNeue"size:20.f];textLabel.textColor=[UIColorblackColor];textLabel.textAlignment=NSTextAlignmentCenter;[self.viewaddSubview:textLabel];//退出控制器{UIButton*dismissButton=[[UIButtonalloc]initWithFrame:CGRectMake(sWith/2-50,sHeight-100,100,50)];dismissButton.tag=10;dismissButton.backgroundColor=[UIColorlightGrayColor];dismissButton.titleLabel.font=[UIFontfontWithName:@"HelveticaNeue"size:16.f];[dismissButtonsetTitle:@"返回上一页"forState:UIControlStateNormal];[dismissButtonsetTitleColor:[UIColorblackColor]forState:UIControlStateNormal];[dismissButtonsetTitleColor:[UIColorgrayColor]forState:UIControlStateHighlighted];[dismissButtonaddTarget:selfaction:@selector(dismiss)forControlEvents:UIControlEventTouchUpInside];[self.viewaddSubview:dismissButton];}//语音识别self.inputText=[[UITextFieldalloc]initWithFrame:CGRectMake(50,200,sWith-100,100)];self.inputText.backgroundColor=[[UIColorblackColor]colorWithAlphaComponent:0.2];[self.viewaddSubview:self.inputText];//长按按钮self.longButton=[[LongPressButtonalloc]initWithFrame:CGRectMake(sWith/2-50,sHeight-300,sWith-300,sWith-300)];self.longButton.removeLoading=YES;//保持在视图最上面[[UIApplicationsharedApplication].keyWindowaddSubview:self.longButton];[[UIApplicationsharedApplication].keyWindowbringSubviewToFront:self.longButton];__weakSiriViewController*weakSelf=self;self.longButton.eventBlock=^(TouchTypeTouchType,NSTimeIntervaltime){switch(TouchType){caseLongTouchBegin:[weakSelfstartEvent];break;caseLongTouchEnd:[weakSelfendEvent];break;default:break;}};//基本设置[selfbasicSetup];}-(void)basicSetup{//设备识别语言为中文NSLocale*cale=[[NSLocalealloc]initWithLocaleIdentifier:@"zh-CN"];self.speechRecognizer=[[SFSpeechRecognizeralloc]initWithLocale:cale];//申请权限认证[SFSpeechRecognizerrequestAuthorization:^(SFSpeechRecognizerAuthorizationStatusstatus){dispatch_async(dispatch_get_main_queue(),^{switch(status){caseSFSpeechRecognizerAuthorizationStatusNotDetermined:self.longButton.userInteractionEnabled=NO;self.inputText.text=@"没有授权语音识别";break;caseSFSpeechRecognizerAuthorizationStatusDenied:self.longButton.userInteractionEnabled=NO;self.inputText.text=@"用户拒绝使用语音识别权限";break;caseSFSpeechRecognizerAuthorizationStatusRestricted:self.longButton.userInteractionEnabled=NO;self.inputText.text=@"不能在该设备上进行语音识别";break;caseSFSpeechRecognizerAuthorizationStatusAuthorized:self.longButton.userInteractionEnabled=YES;self.inputText.text=@"设备录音可用";break;default:break;}});}];//创建录音引擎self.audioEngine=[[AVAudioEnginealloc]init];}//语音按钮识别事件-(void)endEvent{if([self.audioEngineisRunning]){[self.audioEnginestop];[self.recognitionRequestendAudio];}[self.longButtonfinishAndRest];}//识别语音-(void)startEvent{if(self.recognitionTask){[self.recognitionTaskcancel];self.recognitionTask=nil;}AVAudioSession*audioSession=[AVAudioSessionsharedInstance];boolaudioBool=[audioSessionsetCategory:AVAudioSessionCategoryRecorderror:nil];boolaudioBool1=[audioSessionsetMode:AVAudioSessionModeMeasurementerror:nil];boolaudioBool2=[audioSessionsetActive:truewithOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivationerror:nil];if(audioBool||audioBool1||audioBool2){NSLog(@"可以使用");}else{NSLog(@"这里说明有的功能不支持");}self.recognitionRequest=[[SFSpeechAudioBufferRecognitionRequestalloc]init];AVAudioInputNode*inputNode=self.audioEngine.inputNode;self.recognitionRequest.shouldReportPartialResults=true;//开始识别任务self.recognitionTask=[self.speechRecognizerrecognitionTaskWithRequest:self.recognitionRequestresultHandler:^(SFSpeechRecognitionResult*_Nullableresult,NSError*_Nullableerror){boolisFinal=false;if(result){self.inputText.text=[[resultbestTranscription]formattedString];//语音转文本isFinal=[resultisFinal];}if(error||isFinal){[self.audioEnginestop];[inputNoderemoveTapOnBus:0];self.recognitionRequest=nil;self.recognitionTask=nil;//self.siriButton.enabled=true;}}];AVAudioFormat*recordingFormat=[inputNodeoutputFormatForBus:0];[inputNodeinstallTapOnBus:0bufferSize:1024format:recordingFormatblock:^(AVAudioPCMBuffer*_Nonnullbuffer,AVAudioTime*_Nonnullwhen){[self.recognitionRequestappendAudioPCMBuffer:buffer];}];[self.audioEngineprepare];boolaudioEngineBool=[self.audioEnginestartAndReturnError:nil];NSLog(@"%d",audioEngineBool);//self.inputText.text=@"正在录音。。。";}#pragmamark-SFSpeechRecognizerDelegate-(void)speechRecognizer:(SFSpeechRecognizer*)speechRecognizeravailabilityDidChange:(BOOL)available{if(available){self.inputText.text=@"语音识别可用";}else{self.inputText.text=@"语音识别不可用";}}//退出控制器-(void)dismiss{[selfdismissViewControllerAnimated:YEScompletion:^{}];}