闲来无聊翻看苹果官方文档的时候看到一个 Speech 框架 ,之前并没有接触过这个框架,看了一下这个框架其实不大,于是决定研究一下。 Speech API可让我们扩展和增强应用程序中的语音识别体验,而无需键盘,就可以实现语音输入这样的功能。既然涉及到语音这些敏感的数据,必然是要通过用户授权的,也就是说 info.plist 文件中需要添加响应的键值来获取用户权限。因为语音识别并不是在iOS 设备本地进行识别,而是在苹果的伺服器上进行识别的。所有的语音数据都需要传给苹果的后台服务器进行处理。因此必须得到用户的授权。

    <key>NSMicrophoneUsageDescription</key><string>当你按下 开始 按钮,我们将使用麦克风进行录音</string><key>NSSpeechRecognitionUsageDescription</key><string>当你对着麦克风说话时,我们将开始语音识别</string>
复制代码

语音识别是基于网络的服务,因此强制执行限制,以便所有应用程序可以免费使用该服务。每个设备可能会限制每天可以执行的识别次数,并且每个应用程序可以根据每天的请求数量在全球范围内进行限制。例如,如果识别请求快速失败(在启动的一秒或两秒内),则识别服务可能暂时无法应用到您的应用程序中,您可能希望稍后再次请求用户。 此外语音识别可以为电池寿命和网络使用造成相对较高的负担。在iOS 10中,话音音频持续时间限制在约1分钟,这与键盘相关听写的限制相似。 对于Speech 的使用姿势官方是给出了案例的,可以来 这里看 。当然你也可以看我的 小 Demo ,欢迎 Star鼓励。

下面给出我的代码和一些代码注释:

//
//  ViewController.swift
//  YaHoYiSpeech
//
//  Created by 太阳在线YHY on 2017/6/10.
//  Copyright © 2017年 太阳在线. All rights reserved.
//import UIKit
import Speechclass ViewController: UIViewController {@IBOutlet weak var textView: UITextView!@IBOutlet weak var startBtn: UIButton!//  在进行语音识别之前,你必须获得用户的相应授权,因为语音识别并不是在iOS 设备本地进行识别,而是在苹果的伺服器上进行识别的。所有的语音数据都需要传给苹果的后台服务器进行处理。因此必须得到用户的授权。// 创建语音识别器,指定语音识别的语言环境 locale ,将来会转化为什么语言,这里是使用的当前区域,那肯定就是简体汉语啦private let speechRecognizer = SFSpeechRecognizer(locale: Locale.autoupdatingCurrent)// 使用 identifier 这里设置的区域是台湾,将来会转化为繁体汉语//  private let speechRecognizer = SFSpeechRecognizer(locale: Locale(identifier: "zh-TW"))// 发起语音识别请求,为语音识别器指定一个音频输入源,这里是在音频缓冲器中提供的识别语音。// 除 SFSpeechAudioBufferRecognitionRequest 之外还包括:// SFSpeechRecognitionRequest  从音频源识别语音的请求。// SFSpeechURLRecognitionRequest 在录制的音频文件中识别语音的请求。private var recognitionRequest: SFSpeechAudioBufferRecognitionRequest?// 语音识别任务,可监控识别进度。通过他可以取消或终止当前的语音识别任务private var recognitionTask: SFSpeechRecognitionTask?// 语音引擎,负责提供录音输入private let audioEngine = AVAudioEngine()override func viewDidLoad() {super.viewDidLoad()// 输出一下语音识别器支持的区域,就是上边初始化SFSpeechRecognizer 时 locale 所需要的 identifierprint(SFSpeechRecognizer.supportedLocales())startBtn.isEnabled = false// 设置语音识别器代理speechRecognizer?.delegate = self// 要求用户授予您的应用许可来执行语音识别。SFSpeechRecognizer.requestAuthorization { (status) invar isButtonenable = false// 识别器的授权状态switch status {// 经过授权case .authorized:// 经过授权之后就允许录音按钮点击isButtonenable = true// 拒绝授权case .denied:isButtonenable = falseprint("User denied access to speech recognition")// 保密,也就是不授权case .restricted:isButtonenable = falseprint("Speech recognition restricted on this device")// 未决定case .notDetermined:isButtonenable = falseprint("Speech recognition not yet authorized")}OperationQueue.main.addOperation() {self.startBtn.isEnabled = isButtonenable}}}func startRecordingPersonSpeech() {// 检查 recognitionTask 任务是否处于运行状态。如果是,取消任务开始新的任务if recognitionTask != nil {// 取消当前语音识别任务。recognitionTask?.cancel()// 语音识别任务的当前状态 是一个枚举值print(recognitionTask!.state)recognitionTask = nil}// 建立一个AVAudioSession 用于录音let audioSession = AVAudioSession.sharedInstance()do {// category 设置为 record,录音try audioSession.setCategory(AVAudioSessionCategoryRecord)// mode 设置为 measurementtry audioSession.setMode(AVAudioSessionModeMeasurement)// 开启 audioSessiontry audioSession.setActive(true, with: .notifyOthersOnDeactivation)} catch {print("audioSession properties weren't set because of an error.")}// 初始化RecognitionRequest,在后边我们会用它将录音数据转发给苹果服务器recognitionRequest = SFSpeechAudioBufferRecognitionRequest()// 检查 iPhone 是否有有效的录音设备guard let inputNode = audioEngine.inputNode else {fatalError("Audio engine has no input node")}//guard let recognitionRequest = recognitionRequest else {fatalError("Unable to create an SFSpeechAudioBufferRecognitionRequest object")}// 在用户说话的同时,将识别结果分批次返回recognitionRequest.shouldReportPartialResults = true// 使用recognitionTask方法开始识别。recognitionTask = speechRecognizer?.recognitionTask(with: recognitionRequest, resultHandler: { (result, error) in// 用于检查识别是否结束var isFinal = false// 如果 result 不是 nil,if result != nil {// 将 textView.text 设置为 result 的最佳音译self.textView.text = result?.bestTranscription.formattedString// 如果 result 是最终,将 isFinal 设置为 trueisFinal = (result?.isFinal)!}// 如果没有错误发生,或者 result 已经结束,停止audioEngine 录音,终止 recognitionRequest 和 recognitionTaskif error != nil || isFinal {self.audioEngine.stop()inputNode.removeTap(onBus: 0)self.recognitionRequest = nilself.recognitionTask = nil// 开始录音按钮可用self.startBtn.isEnabled = true}})// 向recognitionRequest加入一个音频输入let recordingFormat = inputNode.outputFormat(forBus: 0)inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer, when) inself.recognitionRequest?.append(buffer)}audioEngine.prepare()do {// 开始录音try audioEngine.start()} catch {print("audioEngine couldn't start because of an error.")}textView.text = "请讲话!"}@IBAction func startRecording(_ sender: UIButton) {if audioEngine.isRunning {// 停止录音audioEngine.stop()// 表示音频源已完成,并且不会再将音频附加到识别请求。recognitionRequest?.endAudio()startBtn.isEnabled = falsestartBtn.setTitle("开始", for: .normal)} else {startRecordingPersonSpeech()startBtn.setTitle("结束", for: .normal)}}
}extension ViewController: SFSpeechRecognizerDelegate {func speechRecognizer(_ speechRecognizer: SFSpeechRecognizer, availabilityDidChange available: Bool) {if available {startBtn.isEnabled = true}else {startBtn.isEnabled = false}}
}复制代码

iOS 语音识别,语音转文字的实现(Speech 框架的使用)相关推荐

  1. 【项目管理】Java离线版语音识别-语音转文字

    Java离线版语音识别-语音转文字 1.项目前言 2.Vosk介绍 3.项目开发 3.1 项目准备 3.2 model 准备 3.3 测试音频准备 3.4 代码实现 4.效果演示 4.1 界面效果 4 ...

  2. uniapp使用百度语音识别语音转文字

    HBuilderX已支持讯飞语音识别和百度语音识别,这里讲下百度语音接入 一:首先是百度语音识别申请 这个步骤暂且省略,可以直接移步百度语音api页面自行申请,主要是为了获取语音权限以及AppID.A ...

  3. 语音识别|语音转文字识别|在线语音识别

    什么是语音识别? 语音识别就是通过录音形式转化成文字,现在的语音识别技术可支持的语言有:普通话.粤语.四川话和英语. 语音识别的分类都有哪些? 语音识别分为在线识别.离线命令词和唤醒词 在线识别:即联 ...

  4. C++语音识别接口快速入门(Microsoft Speech SDK)——文字转语音

    C++语音识别接口快速入门(Microsoft Speech SDK) 尤其注意其中的宽字符串转化 #include <iostream> #include <sapi.h> ...

  5. react-native 使用百度语音识别极速版语音转文字

    项目有需求,需要集成语音转文字,于是开始研究,一步一个坑 1.集成录音 react-native-audio 2.集成文件操作 react-native-fs 3.集成音频格式转换 react-nat ...

  6. iOS 10 的 Speech 框架实现语音识别 (Swift)

    什么都不说先上效果 早在2011年iPhone4s 的上,iOS 5系统就有了语音识别. 但有以下缺陷 需要- 弹出键盘 只支持实时语音 无法自定义录音 单一的输出结果 不开放 在 2016 年的 W ...

  7. 【网赚工具】语音转文字神器,无需安装就能使用,支持长语音识别

    今天分享的网赚工具是一款语音转文字神器,众所周知,语音转文字工具主要就是科大讯飞.有道云.百度语音.云知声.阿里云.捷通华声(灵云识别)这些平台,有些平台针对个人版还按时长收费,简直蠢不可及. 对于任 ...

  8. 开源python语音识别_5 款不错的开源语音识别/语音文字转换系统

    语音文字转换(speech-to-text)(STT)系统就像它名字所蕴含的意思那样,是一种将说出的单词转换为文本文件以供后续用途的方式. 语音文字转换技术非常有用.它可以用到许多应用中,例如自动转录 ...

  9. 使用谷歌Cloud Speech API将语音转换为文字

    CSDN广告邮件太多了,邮箱已经屏蔽了CSDN,留言请转SegmentFault:https://segmentfault.com/a/1190000013591768 Google Cloud Sp ...

最新文章

  1. 图论 ---- C. Graph Transpositions(数据分阶段分层图最短路(二维) + 贪心)
  2. 【转】iOS开发-Protocol协议及委托代理(Delegate)传值
  3. 5中div标签有没有url属性_[网页编程]-03 CSS 常用属性
  4. Html 教程 (8)表单
  5. StackExchange.Redis 使用-配置
  6. CodeForces - 1491C Pekora and Trampoline(差分+贪心)
  7. HP DL388G5 安装64位linux虚拟系统出错!
  8. householder变换qr分解matlab_【基础教程】Matlab实现傅里叶变换
  9. js初步简单的编程代码
  10. Macbook Pro笔记本双系统MacOS和Windows切换默认启动
  11. 寒门难再出贵子(6),一篇值得思考的文章
  12. 自学PL/SQL 第一讲decalring variables
  13. php操作sqlserver视频教程,SQLServer数据库基础视频教程下载
  14. python合并多个txt文件
  15. Beats:如何在 Elastic Stack 中得到并使用 Root CA Certificate fingerprint
  16. 全新英特尔vPro平台,为数智时代保驾护航
  17. 利用dsp电机测速及详解
  18. excel中的CTRL+E格式选取
  19. 如何做一个靠谱的产品经理
  20. css如何去掉或修改浏览器默认滚动条

热门文章

  1. 获取repeater中的html控件,asp.net 中如何获取Repeater控件FooterTemplate内的控件?
  2. 2021年原生JS实现影集展示特效
  3. Lattice:2、MachXO3配置模式
  4. \t\t12种性格导致贫穷
  5. CSMA/CD协议和CSMA/CA协议有什么具体的区别
  6. excel文件保护密码如何删除
  7. 2021年下半年软件设计师上午真题答案及解析(六)
  8. 面试题 网络编程和并发、数据库和缓存
  9. 2019年12月9日
  10. Rasa 3.X 智能对话机器人案例开发硬核实战高手之路 (7大项目Expert版本)