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)

用户喜欢...

为了合成让人类听懂的语音,机器做了哪些「深度学习」?

编者按:本文来自“极限元”,作者 马骥,极限元智能科技联合创始人,中科院-极限元“智能交互联合实验室”副主任。 深度学习在2006年开始崭露头脚后,近几年取得了飞速的发展,无论...


为了合成让人类听懂的语音,机器做了哪些“深度学习”?

作者:马骥 深度学习在2006年开始崭露头脚后,近几年取得了飞速的发展,无论是学术研究还是企业应用均呈现出指数...


基于深度学习的无人机识别算法研究

摘 要: 无人机的广泛运用,在给人们带来便利的同时,也引发了不良影响。比如,无人机飞入禁飞区引发安全问题,由于不正当的使用侵犯公民的隐私等,因此需要构建一个无人机警察系统...


Timothy Ngui加入AdvanIDe并担任首席运营官

面向智能卡、物联网(IoT)、机器对机器(M2M)和射频识别(RFID)领域提供半导体产品的领先独立供应商Advanced ID Electronics(...


IDC:数字化原生代返校季 PC手机不再是唯一选择

金秋送新风,中国消费IT市场迎来学生返校的采购季,而市场亮点也正转向新兴消费IT终端产品。IDC数据显示,AR/VR、...


从技术到产品,苹果Siri深度学习语音合成技术揭秘

Siri 是一个使用语音合成技术与人类进行交流的个人助手。从 iOS 10 开始,苹果已经在 Siri 的语音中用到了深度学习,...


破解人类识别文字之谜,对图像中的字母进行无监督学习

作者:Alberto Testolin,Ivilin Stoianov ,Marco Zorzi Nature 子刊 Nature Human Behavio...


巨头扎堆语音入口:三星计划推出智能音箱

三星即将推出一款智能音箱对抗亚马逊的Alexa、谷歌的Google Home,以及苹果的HomePod。IT经理网...


三分钟搞懂深度学习:物体的识别和检测,以「找椅子」为例

本文将介绍定义问题的方式,以及我解决问题的方式。 目录 为什么选择“椅子问题”? 问题简单化:在清晰的图像...


【破解人类识别文字之谜】对图像中的字母进行无监督学习

【导读】Nature 子刊 Nature Human Behavior 上最新发表了一篇关于人类行为的研究,通过对自然图像中的字母进行无监督学习,探讨了人类是如何获得文字识别能力的。研究人员提出了一个基于深度...