语音命令:iOS App 交互的未来

语音指令从根本上重塑了用户如何与iOS应用程序打交道,超越简单的top-and-swipe接口,转向手无寸铁,直观控制. 通过借助iOS语音识别API,开发者可以整合实时语音对文本能力,使应用程序更方便,更高效,更能参与. 无论是允许对健身跟踪器进行语音控制导航,允许在生产力应用中进行无手无脚的记号,还是为有运动障碍的用户提供无障碍功能,语音识别API提供了一个强大的,生产准备的基础. 本篇文章探索了iOS应用程序中语音指令的完整实施过程,从初始设置和许可处理到高级优化,最佳做法,以及现实世界使用案例.

理解 iOS 语音识别 API

iOS语音识别API,是Speech框架的一部分,允许应用将活音或预录音频转换成文字,它支持超过60种语言和方言,识别引擎运行在在线(用于支持语言)或苹果服务器上. On-device识别优先处理隐私和离线工作,而基于服务器的识别往往为复杂句子提供更高的准确度. SFSpeech识别器[,管理识别过程,SFSpeechAudioBuffer识别请求,用于直播音频输入.

主要能力包括:

  • 实时部分结果(用于渐进指令检测).
  • 通过SFSpeechRecognizer的[]属性支持自定义词汇.
  • AVAudioEngine进行集成,用于音频捕捉和缓冲.

需要注意的是,API是针对用户启动的命令设计的,而不是针对连续,总是被征集的情景(Apple对单一识别任务强制了1分钟的最长限),这一限制鼓励有意接触并保持电池寿命,为了进一步阅读,请参考官方语音框架文件[WWDC 2019 Speech Accidence.

在您的应用程序中设置语音识别

综合语音识别需要仔细的许可处理和音频会话配置。下面是基本步骤,并扩展为最佳做法。

1. 准备您的项目

  • 在您的工程的签名和amp; 能力中添加 [[FLT: 0]] 语句 [[FLT: 1] 能力 。
  • 包含 ] NSMicrophoneUsageDescription [ 密钥 (例如"这个app需要麦克风访问处理语音命令").
  • 包含 NSSpeech Recognition Usage Description [ 密钥(例如,"本应用程序将您的演讲发送给苹果公司的服务器以识别命令").

注:即使计划只使用设备上的识别,两键都需要——苹果仍然需要用户同意.

2. 请求授权

调用 [[FLT: 0]] SFSpeechRecognizer. requestAuthorization [[FLT: 1]] 在您的应用程序流中早期(例如, 在 [[FLT: 2] ) 。 轻度处理每个授权状态 :

import Speech

SFSpeechRecognizer.requestAuthorization { authStatus in
 DispatchQueue.main.async {
 switch authStatus {
 case .authorized:
 // Enable voice command UI
 case .denied, .restricted:
 // Explain why speech recognition is unavailable
 case .notDetermined:
 // This should not occur after the request
 @unknown default:
 break
 }
 }
}

3. 创建 SFSpeech 识别实例

以一个与目标受众匹配的语境[ SFSpeechRecognizer[] 进行校验。对于默认设备语言,请通过:

let recognizer = SFSpeechRecognizer(locale: Locale(identifier: "en-US"))

4. 配置音频会话和引擎

设置 [ [FLT: 0]] AVAudioEngine [[FLT: 1]] 以获取麦克风输入。 使用 [[FLT: 2]]. record 分类和 . 度量 模式以强调语音质量 :

let audioEngine = AVAudioEngine()
let inputNode = audioEngine.inputNode

let recordingFormat = inputNode.outputFormat(forBus: 0)
inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer, _) in
 self.request.append(buffer)
}

audioEngine.prepare()
try? audioEngine.start()

总是在生产中从一个块开始包装音频引擎,以处理麦克风的不可用性.

执行语音命令:从发言到行动

一旦音频流出,您就会为命令创建识别任务并解析结果。关键是对部分结果作出反应,以便在用户完成发言之前检测到命令。

基本识别任务

let request = SFSpeechAudioBufferRecognitionRequest()
request.shouldReportPartialResults = true

let recognitionTask = recognizer?.recognitionTask(with: request) { result, error in
 guard let result = result else {
 // Handle error
 return
 }
 let transcript = result.bestTranscription.formattedString
 // Check for commands
 if transcript.lowercased().contains("next") {
 // Execute action
 }
}

高级命令解析

简单为小词汇工作,但对于强健的指令集则考虑:

  • 使用NSLinguisticTagger来提取关键词,过滤出噪音.
  • 创建命令词汇[],有同义词(如"skip","next","forward").
  • 等待更高的信任阈值:在采取行动前检查]。
  • ]实施冷却[,防止同一短语的多个触发.
func processTranscript(_ transcript: String) {
 let lowercased = transcript.lowercased()
 let commands: [String: () -> Void] = [
 "next": { self.showNextItem() },
 "go back": { self.showPreviousItem() },
 "stop": { self.stopPlayback() }
 ]
 for (command, action) in commands {
 if lowercased.contains(command) {
 action()
 break
 }
 }
}

处理结束语和沉默

默认情况下, 识别任务在用户停止发言并检测到暂停时结束。 您也可以手动调用 [[ FLT: 12] 或 [ [ [ FLT: 13] ] 来结束任务。 对于连续的命令体验( 如拼写、 多步骤动作) , 在每个结果后重新开始识别任务。 然而, 请记住 Apple 单项任务的 ~ 1分钟限制; 对于较长的会话, 链路任务 。

高级特性: 在线识别和自定义词汇

从iOS 13开始,苹果公司对一些特定语言(目前为英语,法语,德语,日语,韩语,普通话中文,西班牙语等)引入了在线语音识别. 优点包括没有网络依赖性,减少空闲性,增强隐私性——没有音频离开设备. 为了启用在线语音识别:

guard let recognizer = SFSpeechRecognizer() else { return }
if recognizer.supportsOnDeviceRecognition {
 request.requiresOnDeviceRecognition = true
}

注:在线数据准确度可能略低于服务器,特别是对于被命名的实体或不寻常的词汇。对于带有自定义词汇(例如医学术语、产品名称)的应用程序,考虑通过[SFSpeechRecognizer的[或通过通过Speech框架的[](例如[、]、))添加一个习惯词汇清单。

另一种先进技术是使用SFSpeech recognizerDelegate[]来监测可用性变化(例如用户取消权限,网络状态变化). 执行:

class YourViewController: UIViewController, SFSpeechRecognizerDelegate {
 func speechRecognizer(_ speechRecognizer: SFSpeechRecognizer, availabilityDidChange available: Bool) {
 // Disable or enable voice command button based on availability
 }
}

制作中语音命令的最佳做法

语音界面的行为不同于触摸。遵循这些指南来提供一个抛光的用户体验。

1. 提供明确的反馈

  • 监听时显示波形或脉冲指示器 。
  • 显示已识别的文本( 甚至是部分的) , 这样用户就可以知道系统正在工作 。
  • 在命令识别时使用随机反馈(通过]UIImpactFeedBackGenerator).

2. 处理错误

常见的错误包括没有麦克风访问,识别服务无法提供,或者音频质量差. 提醒用户使用可操作的信息(例如"请大声说话"或"检查您的互联网连接").

3. 优化不同角和环境

测试不同的演讲者群。 使用 [[ FLT: 0]] SFSpeechRecognizer [[ [FLT: 1]] 属性在背景线上运行识别。 执行 [[ FLT: 2] ] 语音活动检测 [ (VAD) 休眠记录 。

4. 隐私和透明度

明确解释为什么您需要麦克风和语音许可。 绝对不要录制或处理没有用户意图的语音 — 系统设计需要明确的窃听才能启动语音命令。 更多关于苹果的隐私指南, 请参见 [ [FLT: 0]] 请求授权 [[FLT: 1]] 。

5. 实施退缩

并非所有用户都能或想要使用语音。 总是提供其它的触摸或键盘输入。 对于访问, 确保语音命令可以通过Switch Control或Woice Over 引用 。

实际世界使用案例和启发

  • Navigation Apps:[] "带我回家"或使用地图SDKs"显示附近加油站".
  • 产能和amp; 注:[]"创建新注"或"添加任务",与核心数据或CloudKit集成.
  • 闪电家庭控制器:[]"关闭客厅灯"使用HomeKit.
  • 适配和amp; 工作:[]"开始5分钟冷却"或"Log 10俯卧撑".
  • 电子学习:[ 语音答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答答

对于更多想法,探索SFSpeechRecognizer API参考和来自苹果的SpeakToMe样本代码[.

结论:通过语音赋予用户权力

iOS Speech Conference API是一个成熟的,有详细记录的工具,它将语音指令的力量投入到任何应用中。 从登机到日常使用,音效良好的功能可以减少摩擦,改善无障碍性和快乐用户。 通过遵循文章中概述的设置步骤、最佳做法和先进技术,你可以以自然和无心的方式创建能倾听和回应的应用。

开始小: 在您的下次更新中整合一个单一命令(“ 帮助 ” 或“ 返回”) , 然后根据用户反馈扩展。 随着在线识别的改善和新语言的添加, 语音控制的iOS 体验的潜力只会增加。 应用交互的未来是被讲到的 —— 确保您的应用有一个声音 。