我在视图控制器的底部设置了一个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中使用语音框架构建语音转文本应用程序