close
当前位置: 物联网在线 > 技术文库 > ios >

iOS原生语音识别使用的正确姿势

语音识别技术这几年在移动App上的应用越来越广,各种第三方语音识别SDK也是层出不穷,例如科大讯飞、百度语音等,同时引入语音识别技术也是一个提高App逼格的好方法:grin:。所以今年的WWDC上,苹果开放了他的语音识别的API  。有了语音识别技术我们开发者就可以开发出像Siri这样炫酷的应用。这不,最近我们也要上这个功能,所以我调研一些这方面的东西。本文主要介绍iOS语音识别SDK的用法。

首先需要在plist文件中申请语音识别和麦克风使用权限:

引入头文件 #import <Speech/Speech.h> #import <AVFoundation/AVFoundation.h>

申请权限

- (void)viewDidAppear:(BOOL)animated{ [super viewDidAppear:animated]; [SFSpeechRecognizer requestAuthorization:^(SFSpeechRecognizerAuthorizationStatus status) { dispatch_async(dispatch_get_main_queue(), ^{ switch (status) { case SFSpeechRecognizerAuthorizationStatusNotDetermined: self.recordButton.enabled = NO; [self.recordButton setTitle:@"语音识别未授权" forState:UIControlStateDisabled]; break; case SFSpeechRecognizerAuthorizationStatusDenied: self.recordButton.enabled = NO; [self.recordButton setTitle:@"用户未授权使用语音识别" forState:UIControlStateDisabled]; break; case SFSpeechRecognizerAuthorizationStatusRestricted: self.recordButton.enabled = NO; [self.recordButton setTitle:@"语音识别在这台设备上受到限制" forState:UIControlStateDisabled]; break; case SFSpeechRecognizerAuthorizationStatusAuthorized: self.recordButton.enabled = YES; [self.recordButton setTitle:@"开始录音" forState:UIControlStateNormal]; break; default: break; } }); }]; }

核心代码

识别实时音频流,如下

- (void)startRecording{ if (_recognitionTask) { [_recognitionTask cancel]; _recognitionTask = nil; } AVAudioSession *audioSession = [AVAudioSession sharedInstance]; NSError *error; [audioSession setCategory:AVAudioSessionCategoryRecord error:&error]; NSParameterAssert(!error); [audioSession setMode:AVAudioSessionModeMeasurement error:&error]; NSParameterAssert(!error); [audioSession setActive:YES withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&error]; NSParameterAssert(!error); _recognitionRequest = [[SFSpeechAudioBufferRecognitionRequest alloc] init]; AVAudioInputNode *inputNode = self.audioEngine.inputNode; NSAssert(inputNode, @"录入设备没有准备好"); NSAssert(_recognitionRequest, @"请求初始化失败"); _recognitionRequest.shouldReportPartialResults = YES; __weak typeof(self) weakSelf = self; _recognitionTask = [self.speechRecognizer recognitionTaskWithRequest:_recognitionRequest resultHandler:^(SFSpeechRecognitionResult * _Nullable result, NSError * _Nullable error) { __strong typeof(weakSelf) strongSelf = weakSelf; BOOL isFinal = NO; if (result) { strongSelf.resultStringLable.text = result.bestTranscription.formattedString; isFinal = result.isFinal; } if (error || isFinal) { [self.audioEngine stop]; [inputNode removeTapOnBus:0]; strongSelf.recognitionTask = nil; strongSelf.recognitionRequest = nil; strongSelf.recordButton.enabled = YES; [strongSelf.recordButton setTitle:@"开始录音" forState:UIControlStateNormal]; } }]; AVAudioFormat *recordingFormat = [inputNode outputFormatForBus:0]; [inputNode installTapOnBus:0 bufferSize:1024 format:recordingFormat block:^(AVAudioPCMBuffer * _Nonnull buffer, AVAudioTime * _Nonnull when) { __strong typeof(weakSelf) strongSelf = weakSelf; if (strongSelf.recognitionRequest) { [strongSelf.recognitionRequest appendAudioPCMBuffer:buffer]; } }]; [self.audioEngine prepare]; [self.audioEngine startAndReturnError:&error]; NSParameterAssert(!error); self.resultStringLable.text = @"正在录音。。。"; } - (SFSpeechRecognizer *)speechRecognizer{ if (!_speechRecognizer) { //要为语音识别对象设置语言,这里设置的是中文 NSLocale *local =[[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"]; _speechRecognizer =[[SFSpeechRecognizer alloc] initWithLocale:local]; _speechRecognizer.delegate = self; } return _speechRecognizer; }

识别本地音频文件,如下 - (IBAction)recognizeLocalAudioFile:(UIButton *)sender { NSLocale *local =[[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"]; SFSpeechRecognizer *localRecognizer =[[SFSpeechRecognizer alloc] initWithLocale:local]; NSURL *url =[[NSBundle mainBundle] URLForResource:@"录音.m4a" withExtension:nil]; if (!url) return; SFSpeechURLRecognitionRequest *res =[[SFSpeechURLRecognitionRequest alloc] initWithURL:url]; [localRecognizer recognitionTaskWithRequest:res resultHandler:^(SFSpeechRecognitionResult * _Nullable result, NSError * _Nullable error) { if (error) { NSLog(@"语音识别解析失败,%@",error); } else { self.resultStringLable.text = result.bestTranscription.formattedString; } }]; }

注意

iOS语音识别Api只支持iOS10SDK以及以后的版本,开发工具至少要Xcode8.0。


(责任编辑:ioter)

用户喜欢...

S32V234适用于ADAS、NCAP前视摄像头、异物检测和识别、环视、机器学习和传感器融合应用

概述 S32V234是我们的第二代视觉处理器系列,旨在支持图像处理的计算密集型应用,并提供了一个ISP、强大的3D GPU、双APEX-2视觉加速器和安全性,以及支持SafeAssure。S32V234适用于ADAS、NCAP前视摄...


Raspberry Pi智能语音助手应用程序的快速原型开发

语音助手已经迅速成为一个重要的产品功能,这要归功于流行的基于智能语音的产品,如Amazon Echo和Google Home。虽然语音服务提供商为开发人员提供了应用程序编程接口(API)支持,所以他们不...


2018年技术趋势:从家庭机器人到语音控制的电视

随着人们越来越习惯与智能扬声器设备交谈,专家们说,我们可以期待看到公司试验机器人,模糊了玩具和房子周围...


中国电信发布智能音箱,智能家居语音通道正式开启

随着语音交互技术及人工智能的不断发展,应用场景从语音助手、智能音箱等方面加速扩围。2014年11月,亚马逊推出...


金雅拓发布首款用于非接触式支付的生物识别EMV卡

数字安全领域全球领导者金雅拓日前已被塞浦路斯银行选中,发布全球首款接触式与非接触式的EMV生物识别双界面支...


红狐狸推出自带云台的全新口袋相机

目前市面上迷你尺寸的主流相机五花八门,最有代表性的当属运动相机。随着GoPro等运动相机的火热,各大品牌纷纷参...


用面部识别技术监测驾驶员生命体征?这家德国科研机构做到了

FZI信息技术研究中心是一家来自德国的科研机构,驾驶员状态监测系统目前还处于原型阶段,它使用了嵌入式以及传...


现代汽车将搭载AI语音助理,最快2019年上市

现代汽车将在2018年CES大会上展示智能个人助理系统,未来现代汽车驾驶将能以语音控制车内空调、车锁开关等,而智...


什么是人脸识别,主要的应用于哪些场景?

如今,在人与人相连的时代,围绕人提供的服务首先要解决的是辨识人的身份,为此人们发明了很多卡、证作为识别人身份的依据,这种身份识别本质上是“见物如见人,认物不认人”,它忽...


统计模式识别的原理与方法

1 统计模式识别的原理与方法简介 1.1 模式识别 什么是模式和模式识别? 广义地说,存在于时间和空间中可观察的事物,如果可以区别它们是否相同或相似,都可以称之为模式;狭义地说,模...