iOS 系統(tǒng)自帶的語(yǔ)音識(shí)別封裝

由于項(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];

? ? }

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末柴钻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瑞躺,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)松蒜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)钥庇,“玉大人牍鞠,你說(shuō)我怎么就攤上這事∑酪蹋” “怎么了难述?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵萤晴,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我胁后,道長(zhǎng)店读,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任攀芯,我火速辦了婚禮屯断,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘侣诺。我一直安慰自己殖演,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布年鸳。 她就那樣靜靜地躺著趴久,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搔确。 梳的紋絲不亂的頭發(fā)上彼棍,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音膳算,去河邊找鬼座硕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛涕蜂,可吹牛的內(nèi)容都是我干的华匾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼宇葱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼瘦真!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起黍瞧,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤诸尽,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后印颤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體您机,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年年局,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了际看。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡矢否,死狀恐怖仲闽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情僵朗,我是刑警寧澤赖欣,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布屑彻,位于F島的核電站,受9級(jí)特大地震影響顶吮,放射性物質(zhì)發(fā)生泄漏社牲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一悴了、第九天 我趴在偏房一處隱蔽的房頂上張望搏恤。 院中可真熱鬧,春花似錦湃交、人聲如沸熟空。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)痛阻。三九已至,卻和暖如春腮敌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背俏扩。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工糜工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人录淡。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓捌木,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親嫉戚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子刨裆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容