在 2016 年的 WWDC 上,Apple 介绍了一个十分有用的语音识别 API,那就是 Speech 框架。事实上,Siri 的语音识别正是由 Speech Kit 提供支持。就目前来说,可用的语音识别框架并非没有,但是它们要么太贵,要么不够好。在本教程中,我将会向你演示如何使用 Speech Kit 来创建一个像 Siri 一样的应用来进行语音到文本的转换。
应用界面设计
由于界面比较简单,就直接在这里下载初始工程,然后再继续进行完善。
使用 Speech 框架
要使用 Speech 框架,第一件要做的事自然是引入这个框架,并遵循 SFSpeechRecognizerDelegate 协议。所以,我们先引入该框架,然后将它的协议添加到 ViewController.swift 类中。此时 ViewController.swift 应该是这样的:
|
|
用户权限
在使用 Speech 框架进行语音识别之前,你必须先请求用户许可,原因是识别不仅发生在 iOS 设备本地,还需要依赖 Apple 的服务器。具体来说,所有音频数据都会被传输到苹果后台进行处理。因此需要获取用户的权限。
我们将在 ViewDidLoad方法中处理授权。其中包括用户必须允许应用使用的音频输入和语音识别权限。首先,声明一个名为 speechRecognizer 的变量:
private let speechRecognizer = SFSpeechRecognizer(locale: Locale.init(identifier: “en-US”))
然后将 ViewDidLoad 方法修改为下面这样:
提供授权信息
Apple 要求应用为所有请求的权限提供自定义消息,对于语音权限的情况,我们必须为两个行为请求授权:
- 麦克风的使用
- 语音的识别
要自定义消息,你需要在 info.plist 文件中定义这些消息。
让我们打开 info.plist 文件的源代码。方法是在 info.plist 上点击右键。然后选择 Open As > Source Code。最后,复制下面的 XML 代码并将它们插入到 标签前。
|
|
已经将两个 key 添加到 info.plist 中了:
NSMicrophoneUsageDescription – 音频输入授权请求的自定义信息。注意,音频输入授权请求只发生在用户点击麦克风按钮的时候。
NSSpeechRecognitionUsageDescription – 语音识别授权请求的自定义信息。
处理语音信息
首先,在 ViewController 中定义下述对象:
|
|
- recognitionRequest 对象用于处理语音识别请求,为语音识别提供音频输入。
- recognitionTask可以将识别请求的结果返回给你,它带来了极大的便利,必要时,可以取消或停止任务。
- 最后的 audioEngine 是音频引擎。它的存在使得你能够进行音频输入。
接下来,让我们创建一个名为 startRecording() 的新函数:
|
|
触发语音识别
在创建语音识别任务时,我们首先得确保语音识别的可用性,因此,需要向 ViewController 添加一个 delegate 方法。如果语音识别不可用,或是改变了状态,应随之设置 microphoneButton.enable 属性。针对这个方案,我们实现了 SFSpeechRecognizerDelegate 协议的 availabilityDidChange 方法。详细实现如下所示:
|
|
这个方法会在按钮的可用性改变时被调用。如果语音识别可用,录音按钮也将被启用。
最后,我们还需要更新一下 microphoneTapped(sender:) 方法:
|
|
总结
- 设计图形界面
- func viewDidLoad() :请求用户许可
- 将两个 key 添加到 info.plist :提供授权信息
- fuc startRecording() :处理语音信息
- func speechRecognizer :确保语音识别的可用性
- fuc microphoneTapped(sender:) : 启用录音按钮
Speech 框架使用的语音识别框架与 Siri 相同。该 API 虽小,但功能十分强大,为开发者创造像是获取音频文件记录一样震撼的东西提供了极大的便利。