Siri 语音识别 Speech
在 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 "Start Recording" button.</string><key>NSSpeechRecognitionUsageDescription</key> <string>Speech recognition will be used to determine which words you speak into this device'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:语音识别Speech recognition综述
名词约定: 语声识别----- VOICE RECOGNITION 语音识别-----SPEECH RECOGNITION 1 什么是语声识别VOICE RECOGNITION? 语音或说话者识别是程 ...
- 语音识别(Speech recognition)的核心内容是将语音转换成文字
https://www.bilibili.com/video/av16198207?from=search&seid=16570566229872205850 语音识别,又称为自动语音识别(A ...
- JS中的语音识别——Speech Recognition API
JS中的语音识别--Speech Recognition API 简介 HTML5中和Web Speech相关的API实际上有两类,一类是"语音识别(Speech Recognition)& ...
- python pytorch语音识别_PyTorch通过ASR实现语音到文本端的模型以及pytorch语音识别(speech) - pytorch中文网...
ASR,英文的全称是Automated Speech Recognition,即自动语音识别技术,它是一种将人的语音转换为文本的技术.今天我们主要了解pytorch实现语音到文本的端到端模型. spe ...
- WebServer应用示例2:Siri语音识别读取传感器数据 | ESP32轻松学(Arduino版)
本系列历史文章目录: ESP32 概述与 Arduino 软件准备 ESP32与掌控板IO接口编程入门 蓝牙翻页笔(PPT 控制器) B 站粉丝计数器 Siri 语音识别控制 LED 灯 Siri 语 ...
- 【幻灯片分享】Siri:I,robot! Siri语音识别系统详解 | 新浪 张俊林 | iOS DevCamp
iOS平台应用详解:<Siri:I,robot! Siri语音识别系统详解> | iOS DevCamp 话题简介:Siri是苹果公司发布的广受关注的iOS平台应用,它不仅仅是一套语音识别 ...
- 用Arduino玩转掌控板(ESP32):Siri语音识别读取传感器数据→WebServer应用示例2
众所周知,掌控板在创客教育中用的非常广泛,它是一块基于 ESP32 的学习开发板.大家对掌控板编程,用的比较多的都是图形化编程的方式,比如 mPython.Mind+ 等.但是,既然掌控板是基于 ES ...
- ios12 siri 语音识别
原理:先用系统的录音器录音,让后让siri识别语音转文字 第一步 :在项目plist文件添加授权如图 第二步:导入头文件,添加协议 #import <Speech/Speech.h> #i ...
- iOS开发——Siri语音识别
原理: 先用系统的录音器录音,让后让siri识别语音转文字 第一步 :在项目plist文件添加授权,如下图 第二步:导入头文件,添加协议, #import <Speech/Speech.h> ...
最新文章
- C++ 类中的static成员的初始化
- python实时得到cpu和内存的使用情况
- const和define 区别
- leetcode78. 子集(回溯)
- uni-app的事件传参
- 「大学生学编程系列」第六篇:如何学习C语言?
- python创建矩阵_python中Numpy的属性与创建矩阵
- jmeter连接并使用mysql数据库_jmeter连接MySQL数据库,并执行sql
- 在windows下编译gmplib并使用vs2010成功调用
- erp5 主要业务模块介绍
- 关于判断单峰数组的几种方法
- 基于AI的计算机视觉识别在Java项目中的使用(三) —— 搭建基于Docker的深度学习训练环境
- 传感器实训心得体会_传感器实训心得体会
- 华为、中兴短信网关最新3.0协议封装代码说明
- 用python爬取阳光电影的链接
- java中extends用法_java中extends和implements的区别,怎么用?
- 百万英雄类答题游戏的程序员打开方式
- 给定一个十进制数,将其转化为N进制数-----17年滴滴笔试题
- 【LNMP】部署php应用
- 华为路由器DHCP,为交换机划分不同网段实验