Swift和iOS 10语音识别

我在视图控制器的底部设置了一个UIView,当检测到颜色名称并将其更改为相应的颜色时,它将做出反应。

进行下一步之前,请使用助手编辑器将标签,按钮和视图连接到视图控制器类。

2.接下来,转到您的视图控制器。 导入语音框架:

import Speech

稍后可能需要使用一些便捷的语音识别器委托方法,因此,使视图控制器遵循SFSpeechRecognizerDelegate

到目前为止,您的代码应如下所示:

启动语音识别之前的用户权限

现在我们已经设置了项目的基本组成部分,让我们设置用户权限提示。

3. 转到您的Info.plist文件。 添加两个键:NSSpeechRecognitionUsageDescription和NSMicrophoneUsageDescription。 这些将是一般警报,要求您的用户允许使用语音识别并允许该应用访问麦克风。 在每个字符串中添加一个句子,以String值的形式向用户说明语音识别的目的。 对于此演示,可能是“说出并观看您的单词成为文本或说出一种颜色以查看框是否变色。”和“点击开始按钮后将检测到您的讲话。”

最终看起来像这样:

注意:一旦您输入NSSpeechRecognitionUsageDescription和NSMicrophoneUsageDescription作为新密钥,“ Privacy-”一词将自动出现。

现在,当您的应用使用涉及语音识别的任何API并尝试访问麦克风时,语音识别权限和麦克风权限提示将自动出现。

由于我们在主视图控制器中使用的是Speech框架,因此提示会在应用打开并点击启动按钮后立即发生。

一旦用户同意让该应用访问麦克风并识别他们的语音,提示将不再显示。

语音识别实现

4.接下来,在视图控制器类中声明四个变量:

首先,是AVAudioEngine类的实例 。 这将处理音频流。 麦克风正在接收音频时,它将进行更新。

let audioEngine = AVAudioEngine()

第二,语音识别器的实例。 这将进行实际的语音识别。 它可能无法识别语音并返回nil,因此最好将其设置为可选。

let speechRecognizer: SFSpeechRecognizer? = SFSpeechRecognizer()

旁注:默认情况下,语音识别器将检测设备的语言环境,并作为响应识别适合该地理位置的语言。 还可以通过传入语言环境参数和标识符来设置默认语言。 像这样: let speechRecognizer: SFSpeechRecognizer(locale: Locale.init(identifier: "en-US"))

第三,识别请求为SFSpeechAudioBufferRecognitionRequest。 当用户实时讲话时,这将分配语音,并控制缓冲。 如果音频已预先录制并存储在内存中,则应使用SFSpeechURLRecognitionRequest

let request = SFSpeechAudioBufferRecognitionRequest()

第四,识别任务实例。 这将用于管理,取消或停止当前的识别任务。

var recognitionTask: SFSpeechRecognitionTask?

识别器方法

5.现在,让我们编写执行语音识别的方法。 它将记录并处理语音。

创建一个没有参数或返回值的空函数,并将其recordAndRecognizeSpeech()

6.在身体内部添加音频引擎和语音识别器的设置。 它是这样的:

有关此处发生的情况的详细说明,请查看audioEngine的文档。 总而言之,音频引擎使用所谓的节点来处理音频位。 在这里.inputNode为传入的音频创建一个单例。 如Apple所述: “节点具有输入和输出总线,可以将其视为连接点。 例如,效果通常具有一个输入总线和一个输出总线。 混合器通常具有多个输入总线和一个输出总线。” InstallTap配置节点,并在适当的总线上使用适当的缓冲区设置请求实例。

7.接下来,准备并使用音频引擎开始录制。 “ Do-catch”语句对于错误检查/处理很有用,但这可以通过其他方式完成。

8.然后,再进行一些检查,以确保识别器可用于该设备和区域设置 ,因为它将考虑位置以获取语言。

您还希望完全处理警报消息或其他UI发生的潜在错误。

9.接下来,在识别器上调用ognitionTask方法。 这就是识别发生的地方。 如前所述,音频将被发送到Apple服务器,然后作为具有属性的结果对象返回。

10.将结果分配给标签或变量。

对于此示例,我们将输入的文本分配给detectedTextLabel。 它将识别任务的结果显示为单词。

11.使用: result.bestTranscription.formattedString 将结果格式化为字符串值。

该字符串值将显示到目前为止已经说出并识别出的所有单词。 这将使新单词看起来被附加到主字符串上,而无需在幕后进行任何附加操作。

12.接下来在startButtonTapped IBAction中,调用 recordAndRecognizeSpeech()

基本功能现在应该可以使用了! 在真实的设备上测试您的代码。 Simulator不提供对OS上麦克风的访问。

说话,当您对着麦克风说话时,您应该会看到文本显示为detectedTextLabel。

恭喜,您刚刚使用了语音识别框架来捕获语音!

13. for segment in result.bestTranscription.segments {进行循环以分析每个新的段/结果字符串。

14. let indexTo = bestString.index(bestString.startIndex, offsetBy: segment.substringRange.location)构成一个子串范围,该范围包括直到最后一个单词开始为止的所有内容。

15. lastString = bestString.substring(from: indexTo)创建一个从该索引到结果结尾的子字符串。

16. self.checkForColorsSaid(resultString: lastString)最后,在循环外部调用颜色检查方法(如下所示),并输入最后一个字符串作为要检查的参数。

您完整的ognitionTask方法调用应如下所示:

现在,您完全完成的recordAndRecognizeSpeech()方法应如下所示:

17.编写checkForColorsSaid方法的实现,该方法将在UIView收到颜色String时更改其背景颜色。

使用简单的switch语句,如下所示:

colorView的背景色将分配给该颜色。

14.现在运行您的应用程序。 您应该能够通过在switch语句中说出颜色名称来更改UIView的颜色。

最好完全处理所有情况,并且不要让您的应用无法使用或使用户感到困惑,从而拒绝使用语音识别。

最后,在viewDidLoad函数中调用requestSpeechAuthorization方法。

有用的SFSpeechRecognitionTaskDelegate方法

苹果提供了一些有用的委托方法以及语音识别。 我没有在本演示中使用这些,但是值得一试。

特别是其中的speechRecognitionTaskFinishedReadingAudio(SFSpeechRecognitionTask)告诉委托人,即使正在进行最终处理,该任务何时不再接受新的音频输入。 添加UI可能会很好,让用户知道何时不再接受音频。 并且请记住,连续接收音频的时间限制为大约1分钟。

查看其他委托方法,以进一步自定义语音识别。 最后,不要忘记添加UI来让用户知道何时以及为什么识别语音。

我希望这可以帮助您在应用程序中实现语音识别。 如果是这样,请在下面发表评论并参考这篇文章!

在Github上 查看完整的项目文件

感谢您的阅读!

资源/其他阅读:

https://developer.apple.com/reference/speech

https://developer.apple.com/reference/speech/sfspeechrecognizer

https://developer.apple.com/reference/speech/sfspeechrecognitiontaskdelegate

https://developer.apple.com/library/prerelease/content/releasenotes/General/WhatsNewIniOS/Articles/iOS10.html#//apple_ref/doc/uid/TP40017084-DontLinkElementID_3

https://github.com/jhuerkamp/SpeechRecognizerDemo

https://code.tutsplus.com/tutorials/using-the-speech-recognition-api-in-ios-10–cms-28032

在iOS 10中使用语音框架构建语音转文本应用程序