在 2016 年的 WWDC 上,Apple 介绍了一个十分有用的语音识别 API,那就是 Speech 框架。Speech 框架能够帮助你快速的集成语音输入的功能到APP。
2016 年的 WWDC Speech 框架视频

下面介绍一下简单的集成过程。
1 获取APP 授权信息
- 麦克风的使用 NSMicrophoneUsageDescription
- 语音的识别 NSSpeechRecognitionUsageDescription
可以通过Info 文件为以上两个Key 值设置请求授权提示信息,也可在info.plist 的原文件添加。

<key>NSMicrophoneUsageDescription</key>  <string>Your microphone will be used to record your speech when you press the &quot;Start Recording&quot; button.</string><key>NSSpeechRecognitionUsageDescription</key>  <string>Speech recognition will be used to determine which words you speak into this device&apos;s microphone.</string>

2 实现Speech
首先需要在swift文件中导入

import Foundation
import UIKit
import Speech
import AudioToolbox
import AVFoundation

然后创建用于语音识别的实例对象

// MARK: Propertiesprivate let speechRecognizer = SFSpeechRecognizer(locale: Locale(identifier: "zh_CN"))!private var recognitionRequest: SFSpeechAudioBufferRecognitionRequest?private var recognitionTask: SFSpeechRecognitionTask?private var audioEngine = AVAudioEngine()private var result = ""public var delegate: BDPSpeechDelegate?private var timer : Timer?

启动语语音识别

    public func startRecording() throws {self.checkSpeech()// Cancel the previous task if it's running.if let recognitionTask = recognitionTask {recognitionTask.cancel()self.recognitionTask = nil}let audioSession = AVAudioSession.sharedInstance()try audioSession.setCategory(AVAudioSessionCategoryRecord)try audioSession.setMode(AVAudioSessionModeMeasurement)try audioSession.setActive(true, with: .notifyOthersOnDeactivation)recognitionRequest = SFSpeechAudioBufferRecognitionRequest()guard let inputNode = audioEngine.inputNode else {print("Audio engine has no input node")return}guard let recognitionRequest = recognitionRequest else {print("Unable to created a SFSpeechAudioBufferRecognitionRequest object")return}if  inputNode.numberOfInputs > 0 {// Configure request so that results are returned before audio recording is finishedrecognitionRequest.shouldReportPartialResults = true// A recognition task represents a speech recognition session.// We keep a reference to the task so that it can be cancelled.recognitionTask = speechRecognizer.recognitionTask(with: recognitionRequest) { result, error invar isFinal = falseif let result = result {if !result.isFinal &&  result.bestTranscription.formattedString != "" {// if did't get any voice input after 1 second, auto end audioEngineself.timer = Timer.scheduledTimer(withTimeInterval: 2.0, repeats: false, block: { (timer) inself.audioEngine.stop()self.recognitionRequest?.endAudio()self.audioEngine.inputNode?.removeTap(onBus: 0)})} else {self.timer?.invalidate()self.timer = nil}isFinal = result.isFinalself.delegate?.voiceChanged(result: result.bestTranscription.formattedString)self.result = result.bestTranscription.formattedStringprint("---isFinal", isFinal, result.bestTranscription.formattedString, self.result == result.bestTranscription.formattedString)if isFinal {self.delegate?.didStopRecording(result: result.bestTranscription.formattedString)}}if error != nil || isFinal {self.audioEngine.stop()inputNode.removeTap(onBus: 0)self.recognitionRequest = nilself.recognitionTask = nilself.timer?.invalidate()self.timer = nilprint("---audioEngine stoped", isFinal)self.delegate?.speechTaskError()}}let recordingFormat = inputNode.outputFormat(forBus: 0)inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer: AVAudioPCMBuffer, when: AVAudioTime) inself.recognitionRequest?.append(buffer)}audioEngine.prepare()try audioEngine.start()self.result = ""}}始录音和停止录音的方法

// MARK: Start record

public func record() {try! startRecording()if audioEngine.isRunning {print("---- Speech start recording")}
}// MARK:  Stop recordpublic func stop() {if audioEngine.isRunning {audioEngine.stop()recognitionRequest?.endAudio()audioEngine.inputNode?.removeTap(onBus: 0)audioEngine.reset()self.timer?.invalidate()self.timer = nilprint("---- Speech end recording")}
}
public protocol SpeechDelegate {func didStopRecording(result: String)func voiceChanged(result: String)func authorizeDenied()func speechTaskError()
}

最后值得注意的是
Apple 对每台设备的识别有限制。详情未知,不过你可以尝试联系 Apple 获得更多信息。
Apple 对每个应用的识别也有限制。
如果你总是遭遇限制,务必联系 Apple,他们或许可以解决这个问题。
语音识别会消耗不少电量和流量。
语音识别每次只能持续大概一分钟。

Siri Speech对中文识别的准确率很差一些没有专业的词汇基本上听不出来
Siri Speech稳定性也很低, 在不同机型上面识别效率不一样,相同的条件下有时候能识别有时候不能识别。
Siri Speech对网络要求很高,由于服务器的原因,经常获取不到返回结果

Siri 语音识别 Speech相关推荐

  1. 语音识别系列1:语音识别Speech recognition综述

    名词约定: 语声识别----- VOICE RECOGNITION 语音识别-----SPEECH RECOGNITION 1 什么是语声识别VOICE RECOGNITION? 语音或说话者识别是程 ...

  2. 语音识别(Speech recognition)的核心内容是将语音转换成文字

    https://www.bilibili.com/video/av16198207?from=search&seid=16570566229872205850 语音识别,又称为自动语音识别(A ...

  3. JS中的语音识别——Speech Recognition API

    JS中的语音识别--Speech Recognition API 简介 HTML5中和Web Speech相关的API实际上有两类,一类是"语音识别(Speech Recognition)& ...

  4. python pytorch语音识别_PyTorch通过ASR实现语音到文本端的模型以及pytorch语音识别(speech) - pytorch中文网...

    ASR,英文的全称是Automated Speech Recognition,即自动语音识别技术,它是一种将人的语音转换为文本的技术.今天我们主要了解pytorch实现语音到文本的端到端模型. spe ...

  5. WebServer应用示例2:Siri语音识别读取传感器数据 | ESP32轻松学(Arduino版)

    本系列历史文章目录: ESP32 概述与 Arduino 软件准备 ESP32与掌控板IO接口编程入门 蓝牙翻页笔(PPT 控制器) B 站粉丝计数器 Siri 语音识别控制 LED 灯 Siri 语 ...

  6. 【幻灯片分享】Siri:I,robot! Siri语音识别系统详解 | 新浪 张俊林 | iOS DevCamp

    iOS平台应用详解:<Siri:I,robot! Siri语音识别系统详解> | iOS DevCamp 话题简介:Siri是苹果公司发布的广受关注的iOS平台应用,它不仅仅是一套语音识别 ...

  7. 用Arduino玩转掌控板(ESP32):Siri语音识别读取传感器数据→WebServer应用示例2

    众所周知,掌控板在创客教育中用的非常广泛,它是一块基于 ESP32 的学习开发板.大家对掌控板编程,用的比较多的都是图形化编程的方式,比如 mPython.Mind+ 等.但是,既然掌控板是基于 ES ...

  8. ios12 siri 语音识别

    原理:先用系统的录音器录音,让后让siri识别语音转文字 第一步 :在项目plist文件添加授权如图 第二步:导入头文件,添加协议 #import <Speech/Speech.h> #i ...

  9. iOS开发——Siri语音识别

    原理: 先用系统的录音器录音,让后让siri识别语音转文字 第一步 :在项目plist文件添加授权,如下图 第二步:导入头文件,添加协议, #import <Speech/Speech.h> ...

最新文章

  1. C++ 类中的static成员的初始化
  2. python实时得到cpu和内存的使用情况
  3. const和define 区别
  4. leetcode78. 子集(回溯)
  5. uni-app的事件传参
  6. 「大学生学编程系列」第六篇:如何学习C语言?
  7. python创建矩阵_python中Numpy的属性与创建矩阵
  8. jmeter连接并使用mysql数据库_jmeter连接MySQL数据库,并执行sql
  9. 在windows下编译gmplib并使用vs2010成功调用
  10. erp5 主要业务模块介绍
  11. 关于判断单峰数组的几种方法
  12. 基于AI的计算机视觉识别在Java项目中的使用(三) —— 搭建基于Docker的深度学习训练环境
  13. 传感器实训心得体会_传感器实训心得体会
  14. 华为、中兴短信网关最新3.0协议封装代码说明
  15. 用python爬取阳光电影的链接
  16. java中extends用法_java中extends和implements的区别,怎么用?
  17. 百万英雄类答题游戏的程序员打开方式
  18. 给定一个十进制数,将其转化为N进制数-----17年滴滴笔试题
  19. 【LNMP】部署php应用
  20. 华为路由器DHCP,为交换机划分不同网段实验

热门文章

  1. Cuba 设置studio的主题
  2. GUI 图形用户界面编程(七)-女友生气,你是选择亚索还是女友?
  3. 一句话木马 php asp,一句话木马源代码
  4. 桌宠必须要java吗_桌宠软件电脑版下载_桌面宠物软件免费版下载_3DM软件
  5. 春运赶火车小心这些骗术
  6. 楞严咒全文正确注音版_楞严咒全文注音
  7. 前端传来的图片并保存_前端处理后端接口传递过来的图片文件
  8. mysql 设置多个主码
  9. 开源数据计算引擎,实现媲美ElasticSearch的高性能并发查询
  10. iOS之常用第三方库的介绍