#import <Speech/Speech.h>
@interface ViewController ()<SFSpeechRecognizerDelegate> @property (weak, nonatomic) IBOutlet UIButton *recordingBtn; @property (weak, nonatomic) IBOutlet UILabel *titleLab; @property (weak, nonatomic) IBOutlet UITextField *inPutTextField; @property(nonatomic,strong)SFSpeechRecognizer * recognizer ; //语音识别功能 @property(nonatomic,strong)SFSpeechAudioBufferRecognitionRequest * recognitionRequest ; @property(nonatomic,strong)SFSpeechRecognitionTask * recognitionTask ; @property(nonatomic,strong)AVAudioEngine * audioEngine ;
####3.将设备识别语音为中文xcode
NSLocale *cale = [[NSLocale alloc]initWithLocaleIdentifier:@"zh-CN"]; self.recognizer = [[SFSpeechRecognizer alloc]initWithLocale:cale]; self.recordingBtn.enabled = false; //设置代理 self.recognizer.delegate = self;
####4.发送语音认证请求(首先要判断设备是否支持语音识别功能)app
[SFSpeechRecognizer requestAuthorization:^(SFSpeechRecognizerAuthorizationStatus status) { bool isButtonEnabled = false; switch (status) { case SFSpeechRecognizerAuthorizationStatusAuthorized: isButtonEnabled = true; NSLog(@"能够语音识别"); break; case SFSpeechRecognizerAuthorizationStatusDenied: isButtonEnabled = false; NSLog(@"用户被拒绝访问语音识别"); break; case SFSpeechRecognizerAuthorizationStatusRestricted: isButtonEnabled = false; NSLog(@"不能在该设备上进行语音识别"); break; case SFSpeechRecognizerAuthorizationStatusNotDetermined: isButtonEnabled = false; NSLog(@"没有受权语音识别"); break; default: break; } self.recordingBtn.enabled = isButtonEnabled; }];
####5.建立录音引擎。框架
self.audioEngine = [[AVAudioEngine alloc]init];
####6.建立按钮点击事件atom
- (void)BtnClick:(UIButton *)sender { if ([self.audioEngine isRunning]) { [self.audioEngine stop]; [self.recognitionRequest endAudio]; self.recordingBtn.enabled = YES; [self.recordingBtn setTitle:@"开始录制" forState:UIControlStateNormal]; }else{ [self startRecording]; [self.recordingBtn setTitle:@"中止录制" forState:UIControlStateNormal]; } }
####7.开始录音代理
- (void)startRecording{ if (self.recognitionTask) { [self.recognitionTask cancel]; self.recognitionTask = nil; } AVAudioSession *audioSession = [AVAudioSession sharedInstance]; bool audioBool = [audioSession setCategory:AVAudioSessionCategoryRecord error:nil]; bool audioBool1= [audioSession setMode:AVAudioSessionModeMeasurement error:nil]; bool audioBool2= [audioSession setActive:true withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:nil]; if (audioBool || audioBool1|| audioBool2) { NSLog(@"能够使用"); }else{ NSLog(@"这里说明有的功能不支持"); } self.recognitionRequest = [[SFSpeechAudioBufferRecognitionRequest alloc]init]; AVAudioInputNode *inputNode = self.audioEngine.inputNode; self.recognitionRequest.shouldReportPartialResults = true; //开始识别任务 self.recognitionTask = [self.recognizer recognitionTaskWithRequest:self.recognitionRequest resultHandler:^(SFSpeechRecognitionResult * _Nullable result, NSError * _Nullable error) { bool isFinal = false; if (result) { self.inPutTextField.text = [[result bestTranscription] formattedString]; //语音转文本 isFinal = [result isFinal]; } if (error || isFinal) { [self.audioEngine stop]; [inputNode removeTapOnBus:0]; self.recognitionRequest = nil; self.recognitionTask = nil; self.recordingBtn.enabled = true; } }]; AVAudioFormat *recordingFormat = [inputNode outputFormatForBus:0]; [inputNode installTapOnBus:0 bufferSize:1024 format:recordingFormat block:^(AVAudioPCMBuffer * _Nonnull buffer, AVAudioTime * _Nonnull when) { [self.recognitionRequest appendAudioPCMBuffer:buffer]; }]; [self.audioEngine prepare]; bool audioEngineBool = [self.audioEngine startAndReturnError:nil]; NSLog(@"%d",audioEngineBool); self.inPutTextField.text = @"大妹砸。聊十块钱的"; }
- (void)speechRecognizer:(SFSpeechRecognizer *)speechRecognizer availabilityDidChange:(BOOL)available{ if (available) { self.recordingBtn.enabled = YES; }else{ self.recordingBtn.enabled = NO; } }