由于項(xiàng)目中很多模塊都需要語(yǔ)音識(shí)別功能 , 做了下簡(jiǎn)單的封裝記錄一下?
1.創(chuàng)建SpeechRecognizerManager工具類 繼承NSObject:SpeechRecognizerManager.h 代碼?
#import
#import
typedefvoid(^speechRecognizerBlock)(NSString*testStr);
@interfaceSpeechRecognizerManager :NSObject
@property(strong,nonatomic)SFSpeechRecognitionTask*recognitionTask;//語(yǔ)音識(shí)別任務(wù)
@property(strong,nonatomic)SFSpeechRecognizer*speechRecognizer;//語(yǔ)音識(shí)別器
@property (strong, nonatomic) SFSpeechAudioBufferRecognitionRequest *recognitionRequest; //識(shí)別請(qǐng)求
@property (strong, nonatomic)AVAudioEngine *audioEngine; //錄音引擎
// 單例類
+ (instancetype)sharedSpeechRecognizerManager;
- (void)getSpeechRecognizer:(speechRecognizerBlock)block;
2.#import "SpeechRecognizerManager.m"的 代碼
#import "SpeechRecognizerManager.h"
#import
staticSpeechRecognizerManager* speechRecognizerManager =nil;
@interface SpeechRecognizerManager()
@property (nonatomic, copy)speechRecognizerBlock block;
@end
@implementationSpeechRecognizerManager
+ (instancetype)sharedSpeechRecognizerManager{
? ? staticdispatch_once_tonceToken;
? ? dispatch_once(&onceToken, ^{
? ? ? ? if (speechRecognizerManager == nil) {
? ? ? ? ? ? speechRecognizerManager = [[SpeechRecognizerManager alloc] init];
? ? ? ? }
? ? });
? ? return speechRecognizerManager;
}
- (instancetype)init {
? ? self= [superinit];
? ? if(self) {
? ? ? ? //設(shè)備識(shí)別語(yǔ)言為中文
? ? ? ? NSLocale *cale = [[NSLocale alloc]initWithLocaleIdentifier:@"zh-CN"];
? ? ? ? self.speechRecognizer = [[SFSpeechRecognizer alloc]initWithLocale:cale];
? ? ? ? //發(fā)送語(yǔ)音認(rèn)證請(qǐng)求(首先要判斷設(shè)備是否支持語(yǔ)音識(shí)別功能)
? ? ? ? [SFSpeechRecognizer requestAuthorization:^(SFSpeechRecognizerAuthorizationStatus status) {
? ? ? ? ? ? boolisButtonEnabled =false;
? ? ? ? ? ? switch(status) {
? ? ? ? ? ? ? ? case SFSpeechRecognizerAuthorizationStatusAuthorized:
? ? ? ? ? ? ? ? ? ? isButtonEnabled =true;
? ? ? ? ? ? ? ? ? ? NSLog(@"可以語(yǔ)音識(shí)別");
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? case SFSpeechRecognizerAuthorizationStatusDenied:
? ? ? ? ? ? ? ? ? ? isButtonEnabled =false;
? ? ? ? ? ? ? ? ? ? NSLog(@"用戶被拒絕訪問(wèn)語(yǔ)音識(shí)別");
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? case SFSpeechRecognizerAuthorizationStatusRestricted:
? ? ? ? ? ? ? ? ? ? isButtonEnabled =false;
? ? ? ? ? ? ? ? ? ? NSLog(@"不能在該設(shè)備上進(jìn)行語(yǔ)音識(shí)別");
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? case SFSpeechRecognizerAuthorizationStatusNotDetermined:
? ? ? ? ? ? ? ? ? ? isButtonEnabled =false;
? ? ? ? ? ? ? ? ? ? NSLog(@"沒(méi)有授權(quán)語(yǔ)音識(shí)別");
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? default:
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }];
? ? ? ? //創(chuàng)建錄音引擎
? ? ? ? self.audioEngine = [[AVAudioEngine alloc]init];
? ? }
? ? return self;
}
-(void)startRecording{
? ? if (self.recognitionTask) {
? ? ? ? [self.recognitionTask cancel];
? ? ? ? self.recognitionTask = nil;
? ? }
? ? AVAudioSession *audioSession = [AVAudioSession sharedInstance];
? ? bool? audioBool = [audioSessionsetCategory:AVAudioSessionCategoryRecord error:nil];
? ? bool? audioBool1= [audioSessionsetMode:AVAudioSessionModeMeasurement error:nil];
? ? bool? audioBool2= [audioSessionsetActive:true withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:nil];
? ? if(audioBool || audioBool1||? audioBool2) {
? ? ? ? NSLog(@"可以使用");
? ? }else{
? ? ? ? NSLog(@"這里說(shuō)明有的功能不支持");
? ? }
? ? speechRecognizerManager.recognitionRequest = [[SFSpeechAudioBufferRecognitionRequest alloc]init];
? ? AVAudioInputNode *inputNode = speechRecognizerManager.audioEngine.inputNode;
? ? SFSpeechAudioBufferRecognitionRequest *recognitionRequest = [[SFSpeechAudioBufferRecognitionRequest alloc]init];
? ? recognitionRequest.shouldReportPartialResults=YES;
? ? self.recognitionRequest.shouldReportPartialResults = true;
? ? //開始識(shí)別任務(wù)
? ? self.recognitionTask = [speechRecognizerManager.speechRecognizer recognitionTaskWithRequest:speechRecognizerManager.recognitionRequest resultHandler:^(SFSpeechRecognitionResult * _Nullable result, NSError * _Nullable error) {
? ? ? ? boolisFinal =false;
? ? ? ? if(result) {
? ? ? ? ? ? SFTranscription*str? = [resultbestTranscription];
? ? ? ? ? ? self.block(str.formattedString);
? ? ? ? ? ? isFinal = [resultisFinal];
? ? ? ? }
? ? ? ? if(error || isFinal) {
? ? ? ? ? ? [self.audioEnginestop];
? ? ? ? ? ? [inputNoderemoveTapOnBus:0];
? ? ? ? ? ? self.recognitionRequest = nil;
? ? ? ? ? ? self.recognitionTask=nil;
?? ? ? }
? ? }];
? ? AVAudioFormat*recordingFormat = [inputNodeoutputFormatForBus:0];
? ? [inputNodeinstallTapOnBus:0 bufferSize:1024 format:recordingFormat block:^(AVAudioPCMBuffer * _Nonnull buffer, AVAudioTime * _Nonnull when) {
? ? ? ? [speechRecognizerManager.recognitionRequest appendAudioPCMBuffer:buffer];
? ? }];
? ? [speechRecognizerManager.audioEngine prepare];
? ? bool audioEngineBool = [speechRecognizerManager.audioEngine startAndReturnError:nil];
? ? NSLog(@"%d",audioEngineBool);
}
- (void)getSpeechRecognizer:(speechRecognizerBlock)block{
? ? self.block= block;
? ? [self startRecording];
}
3 ?viewcontroller應(yīng)用導(dǎo)入工具類的 頭文件#import "SpeechRecognizerManager.h" ?
簽代理<SFSpeechRecognizerDelegate>
//按鈕的點(diǎn)擊方法
- (void)microphoneTap:(UIButton*)sender {
? ?SpeechRecognizerManager *manager = [SpeechRecognizerManager sharedSpeechRecognizerManager];
? ? ? manager.speechRecognizer.delegate=self;
? ? if([manager.audioEngineisRunning]) {
? ? ? ? [manager.audioEnginestop];
? ? ? ? [manager.recognitionRequestendAudio];
? ? ? ? self.siriBtu.enabled=YES;
? ? ? ? [self.siriBtu setTitle:@"開始錄制" forState:UIControlStateNormal];
? ? }else{
// 調(diào)取工具類的方法返回語(yǔ)音識(shí)別的文字
? ? ? ? [managergetSpeechRecognizer:^(NSString*testStr) {
? ? ? ? ? ? _siriTextView.text = [NSString stringWithFormat:@"%@%@",_siriTextView.text, testStr];
? ? ? ? ? ? NSLog(@"%@",testStr);
? ? ? ? }];
? ? ? ? [self.siriBtu setTitle:@"停止錄制" forState:UIControlStateNormal];
? ? }
}