← 所有文章

无障碍即平台:个人语音、实时朗读、眼动追踪、音乐触觉

个人语音(iOS 17)、实时朗读(iOS 17)、眼动追踪(iOS 18)、音乐触觉(iOS 18)、声控快捷指令(iOS 18)。Apple近期无障碍功能发布的脉络始终如一:那些过去需要第三方应用、专用硬件或专门集成才能实现的功能,正逐步成为操作系统直接处理的平台能力。结果是:用户需要安装的应用更少,开发者的参与模式也截然不同——开发者不再亲自构建该功能,而是要么选择接入系统层面的接口(如个人语音授权),要么遵循每个应用本就应当满足的标准(如为眼动追踪准备恰当的无障碍标签和点击区域)。

本文逐一梳理每项功能的开发者接入面。视角是”我的应用要做什么才能参与”,而非”我该如何实现这项功能”。功能由Apple构建完成,问题在于应用是否做好了使用它的准备。

TL;DR

  • 个人语音(iOS 17+)允许用户录制15分钟音频,在设备本地生成合成语音,供AAC(辅助沟通)类应用使用。应用通过AVSpeechSynthesizer.requestPersonalVoiceAuthorization()接入,并检查voiceTraits中是否包含.isPersonalVoice1
  • 实时朗读(iOS 17+)是系统级功能:用户输入文本,设备代为朗读(可选用其个人语音)。应用无需直接集成实时朗读;该功能在操作系统层面跨通话、FaceTime及面对面交流场景运作。
  • 眼动追踪(iOS 18+)通过前置摄像头实现注视加停留控制操作设备。应用通过遵循无障碍标准(恰当的无障碍标签、点击区域尺寸、焦点顺序)参与其中;大多数应用无需专门的API2
  • 音乐触觉(iOS 18+)将音乐播放转换为与音频同步的Taptic Engine震动,通过MediaAccessibility.framework中的MAMusicHapticsManager API实现。任何音乐应用只需在Info.plist中设置MusicHapticsSupported、成为活跃的”正在播放”应用,并提供ISRC即可集成3
  • 声控快捷指令(iOS 18+)允许用户为Siri快捷指令分配自定义短语,包括第三方AppIntent动作。该功能与App Intents的采纳形成叠加效应(详见App Intents:Apple为你的应用打造的全新API)。

个人语音:授权模式

个人语音是开发者接入面最为直接的无障碍功能1。用户通过”设置 > 辅助功能 > 个人语音”选择启用,朗读随机生成的提示词录制约15分钟音频,设备便会利用端侧机器学习在本地生成合成语音。该语音对用户是私密的;除非用户主动选择与iCloud配对的设备共享,否则不会离开本机。

要让应用在AVSpeechSynthesizer中使用用户的个人语音,必须:

  1. 通过AVSpeechSynthesizer.requestPersonalVoiceAuthorization(completionHandler:)请求授权。
  2. 等待用户通过系统弹窗授予权限。
  3. 获批后,调用AVSpeechSynthesisVoice.speechVoices()并筛选出voiceTraits中包含.isPersonalVoice的语音。
  4. 将所得的AVSpeechSynthesisVoice像其他任何语音一样在AVSpeechUtterance中使用。
import AVFoundation

AVSpeechSynthesizer.requestPersonalVoiceAuthorization { status in
    guard status == .authorized else { return }

    let personalVoices = AVSpeechSynthesisVoice.speechVoices().filter { voice in
        voice.voiceTraits.contains(.isPersonalVoice)
    }

    if let voice = personalVoices.first {
        let utterance = AVSpeechUtterance(string: "Hello.")
        utterance.voice = voice
        synthesizer.speak(utterance)
    }
}

此项授权较为敏感。Apple的指引是:个人语音应主要服务于辅助及替代沟通(AAC)类应用以及类似的辅助场景。通用型语音朗读应用若请求个人语音授权,很可能被用户拒绝,且可能在App Store审核中遭到严格审视。

端侧优先的架构在此至关重要。用户的语音训练数据及生成的语音模型从不离开设备的安全隔区,除非用户主动选择启用iCloud共享。使用个人语音的应用在App Store隐私”营养标签”中应反映零数据收集,因为合成在本地进行,音频输出送往扬声器而非网络。

实时朗读:零集成的系统级功能

实时朗读是个人语音面向消费者的配套功能4。用户输入文本,设备代为朗读,可选用其个人语音。实时朗读在电话通话、FaceTime通话、Mac SharePlay以及通过设备扬声器进行的面对面对话中均可使用。

应用无需直接集成实时朗读。该功能在操作系统层面运作,截取系统实时朗读界面输入的文本,并通过音频栈进行路由。从应用的视角看,实时朗读是隐形的:通话中传出的音频流(或在面对面场景中由设备扬声器播放的音频流)听起来像用户本人,但其中没有任何应用代码参与。

这对应用开发者的含义是:如果你的应用涉及语音处理(通话应用、视频聊天应用、无障碍辅助应用),其音频管线必须遵循系统的音频路由,使实时朗读能通过相同通道输出。那些与音频会话对抗(声明独占控制而无视系统级叠加音)的应用会破坏实时朗读的运作。

眼动追踪:遵循标准的功能

iOS 18引入的眼动追踪让用户能通过注视方向加停留控制操作iPhone和iPad2。用户用前置摄像头进行几秒校准,然后通过注视界面元素进行导航;将目光停留在某个元素上达到设定的停留时长即可激活它(点击、滑动或其他手势,可在”切换控制”中配置)。

实现完全在端侧。前置摄像头通过端侧机器学习处理注视数据;数据不会离开设备。无需任何额外硬件。

对于大多数应用而言,支持眼动追踪无需专门的代码。该功能可在任何遵循标准无障碍约定的UI上运作:

  • 恰当的点击区域。 Apple的人机界面指南规定可点击元素的最小点击区域为44pt×44pt。眼动追踪遵循该规范。小于此最小尺寸的按钮难以通过停留精准命中。
  • 无障碍标签。 每个交互元素都应具备有意义的accessibilityLabel(SwiftUI)或accessibilityLabel属性(UIKit)。当用户停留在元素附近时,眼动追踪会以类似工具提示的形式呈现该标签。
  • 合乎逻辑的焦点顺序。 Mac上的Tab键和tvOS的焦点引擎所遵循的焦点顺序,与眼动追踪用于在元素间跳转的顺序相同。使用SwiftUI标准布局原语的应用可免费获得此特性;自行覆盖焦点行为的应用则需自行验证。
  • 对停留友好的模态模式。 在外部点击时自动消失的模态框可能会让眼动追踪用户感到困扰,因为他们的停留点可能短暂离开模态区域。带有模态UI的应用应提供明确的关闭按钮。

希望在特定视图(敏感内容、复杂的手势驱动游戏)中退出眼动追踪的应用,目前没有专门针对眼动追踪的官方退出API。该功能作用于任何可见内容之上,应用的责任是确保标准无障碍接口的正确性。

iOS应用的三个表面一文涵盖了更宏观的模式:可见UI是一个表面,App Intents是另一个,无障碍是第三个。眼动追踪参与的是可见UI表面;将这一表面做对,便能同时让眼动追踪、切换控制、VoiceOver和语音控制都正常运作。

音乐触觉:音频到触觉的桥梁

音乐触觉将音乐播放转换为与音频同步的Taptic Engine震动3。该功能由用户自行选择启用(”设置 > 辅助功能 > 音乐触觉”),适用于任何正确集成API的音乐应用,并不局限于Apple Music。

开发者接入面位于MediaAccessibility.frameworkMAMusicHapticsManager(iOS 18+)。音乐应用通过三个步骤集成音乐触觉:

  1. 在Info.plist中声明支持。 添加MusicHapticsSupported键,值为YES。系统据此判断该应用是否参与音乐触觉的渲染。
  2. 成为活跃的”正在播放”应用。 应用必须通过MPNowPlayingInfoCenter.default().nowPlayingInfo发布播放元数据,并掌控正在播放的音频会话。系统需要一个已知的活跃”正在播放”来源来驱动触觉合成。
  3. 为正在播放的曲目提供ISRC。 MPNowPlayingInfoPropertyInternationalStandardRecordingCode键(即国际标准录音代码)让系统能查找与该音频配对的触觉轨道。Apple维护着以ISRC为索引的触觉素材库;没有ISRC的曲目无法获得触觉,但其余的”正在播放”集成仍然可用。
import MediaPlayer
import MediaAccessibility

// Info.plist: MusicHapticsSupported = YES (boolean)

let info: [String: Any] = [
    MPMediaItemPropertyTitle: track.title,
    MPMediaItemPropertyArtist: track.artist,
    MPNowPlayingInfoPropertyInternationalStandardRecordingCode: track.isrc,
    // ... other now-playing properties
]
MPNowPlayingInfoCenter.default().nowPlayingInfo = info

该集成适用于任何音乐应用:基于AVAudioEngine构建的流媒体客户端、带有自定义解码器的DJ应用、带样本播放的音乐学习应用。约束在于ISRC和活跃的”正在播放”角色,而非底层的音频API。没有ISRC的应用(无元数据的用户上传音乐、生成式音乐)就是得不到触觉效果;其余的播放集成不受影响。

对于相邻领域的应用(节奏游戏、音乐可视化、音效引擎),其音频并非音乐触觉的设计目标。这类应用应直接使用CHHapticEngine,配合手工编排的、与其音频源同步的触觉模式。

声控快捷指令:无障碍与App Intents的交汇

声控快捷指令让用户能够为Siri快捷指令分配自定义语音短语,包括那些由第三方AppIntent类型支持的指令5。用户可以将”Marker”配置为触发某个待办应用注册的AddTodoIntent;无论身处何处,无需唤起Siri唤醒词,只要说出”Marker”即可触发该意图。

集成借助本系列已广泛覆盖的App Intents框架,但有一个易被忽视的结构性环节:应用必须声明一个AppShortcutsProvider,并暴露带有明确phrasesAppShortcut条目。一个孤立的AppIntent虽存在于系统中,但只能通过快捷指令编辑器调用,需要用户手动组装快捷指令。AppShortcutsProvider则注册了系统可见的快捷指令,用户可立即将其分配给声控快捷指令、操作按钮、Siri或Spotlight。

struct TodoShortcuts: AppShortcutsProvider {
    static var appShortcuts: [AppShortcut] {
        AppShortcut(
            intent: AddTodoIntent(),
            phrases: [
                "Add a todo in \(.applicationName)",
                "\(.applicationName) marker"
            ],
            shortTitle: "Add Todo",
            systemImageName: "checkmark.circle"
        )
    }
}

phrases数组就是系统暴露给Siri和声控快捷指令的内容。一旦该提供者就位,App Intent立即具备语音激活的资格。若没有它,意图仍可通过手动配置快捷指令来使用,但路径更长,许多用户根本不会走到那一步。

该模式与App IntentsApp Intents与MCP工具对比形成叠加。一个在用户的Apple Intelligence界面中赢得一席之地的App Intent,配合一个声明用户调用方式的AppShortcutsProvider,也就赢得了作为声控快捷指令目标的资格。本系列关于”App Intents是描述’应用能做什么’的跨系统契约”的论点同样适用于此:声控快捷指令是同一契约的另一类消费者。

横贯模式:标准即集成

上述无障碍功能共享一个结构性属性:每一项都建立在应用本就应满足的标准之上,仅在应用必须明确配合时才提供小巧的可选接入面(个人语音授权、通过MPMusicPlayerController接入音乐触觉)。

这对开发团队的含义是:无障碍工作不是应用上线后再单独开展的工作流。应用的无障碍标签、点击区域、焦点顺序和对标准系统API的使用,正是让眼动追踪正常运作、让实时朗读正确路由、让音乐触觉激活、让声控快捷指令呈现正确意图的根本。那些把无障碍当作开发周期末尾打勾事项的应用,最终交付的功能可能在VoiceOver下能用,却在眼动追踪下不行;或是以实时朗读无法跟随的方式路由音频。

本系列的我拒绝写的内容一文将”拒绝”视为一种定位姿态。无障碍上的拒绝则是反向的:不是”我拒绝添加这个”,而是”我拒绝交付一款达不到每个iOS应用本就应满足的标准的产品”。

何时应用需要自定义无障碍代码

有三种场景,遵循标准的模式无法覆盖一切:

自定义绘制表面。 绘图应用、图表、自定义渲染的游戏UI都绕过了SwiftUI/UIKit的无障碍树。应用必须使用UIAccessibilityCustomActionUIAccessibilityElement以及为每个有意义元素显式设置无障碍属性,自行构建无障碍树。眼动追踪、VoiceOver和切换控制都依赖填充完整的无障碍树。

实时手势交互。 带有连续手势输入(绘图、拖拽瞄准)的游戏并不天然契合基于停留或基于切换的输入方式。正确的做法是提供替代控制方案(例如可选的按钮式输入),而非与无障碍系统对抗。

专门的无障碍功能。 AAC应用、语音增强应用、手语翻译应用。这些应用本身就是无障碍产品,与系统框架(个人语音、Speech框架、用于手语识别的Vision框架)有深度集成。这些集成工作是真实而有意为之的。

这一模式对iOS 26+应用意味着什么

三点要义。

  1. 无障碍参与多在于遵循标准,而非构建功能。 Apple一直在将无障碍能力下沉到平台层。开发者要做的,是确保你的应用满足眼动追踪、切换控制、VoiceOver和语音控制都依赖的标准:恰当的标签、点击区域、焦点顺序、系统音频路由。

  2. 个人语音的集成颇为敏感。 如果你的应用具备真实的AAC使用场景(辅助沟通、语音增强、无障碍工具),那么个人语音授权是合适的集成方式。对于通用型应用而言,请求个人语音授权更可能让用户困惑,而非帮到他们。

  3. App Intents是无障碍基础设施。 一个干净的AppIntent自动具备声控快捷指令的资格,能通过快捷指令获得可访问的UI界面,并与系统的语音驱动和切换驱动控制模式集成。本系列推动采纳App Intents的论点同样适用于无障碍领域。

完整的Apple生态系列:类型化的App IntentsMCP服务器路由问题Foundation Models运行时与工具链SDK的区分三个表面单一信息源模式两个MCP服务器面向Apple开发的钩子实时活动watchOS运行时SwiftUI内部机制RealityKit的空间心智模型SwiftData模式纪律Liquid Glass模式多平台发布平台矩阵Vision框架Symbol EffectsCore ML推理Writing Tools APISwift Testing隐私清单我拒绝写的内容。系列总目录见Apple生态系列。如需了解更广义的”iOS与AI智能体”背景,请参阅iOS智能体开发指南

常见问题

我需要写代码来支持眼动追踪吗?

对大多数应用而言,无需。眼动追踪可在任何遵循标准无障碍约定的UI上自动运作:恰当的点击区域(最小44pt)、有意义的无障碍标签、合乎逻辑的焦点顺序,以及标准的系统控件。自绘UI(自定义视图、游戏、图表)的应用需要使用UIAccessibilityElement或SwiftUI的无障碍修饰符显式填充无障碍树;这项工作同样能让应用支持VoiceOver和切换控制。

我能在通用型语音朗读应用中使用个人语音吗?

系统通过AVSpeechSynthesizer.requestPersonalVoiceAuthorization()允许这样做,但Apple的指引和App Store审核流程都强调个人语音应用于辅助场景(AAC,辅助及替代沟通)。通用型语音朗读应用请求个人语音授权面临两重挑战:用户不太可能授权,审核也可能因不当使用而退回。如果你的使用场景确实是辅助性的,那么集成是合适的;如果只是通用型旁白,使用系统语音才是正确的工具。

实时朗读和个人语音有何区别?

个人语音是听起来像用户本人的端侧合成语音。实时朗读是让用户输入文字、由设备朗读出来的系统功能(可使用系统语音或用户的个人语音)。两者互为补充:个人语音提供声音,实时朗读提供输入到朗读的UI。应用通过Speech Synthesizer API集成个人语音;实时朗读对应用是隐形的,在操作系统层面运作。

如何为使用AVAudioEngine的音乐应用添加音乐触觉?

可以做到。音乐触觉并不局限于特定的播放API。集成方式是:在Info.plist中加入MusicHapticsSupported = YES,通过MPNowPlayingInfoCenter.default().nowPlayingInfo发布正在播放曲目的元数据(让系统识别你的应用为活跃的”正在播放”来源),并附上带有曲目ISRC的MPNowPlayingInfoPropertyInternationalStandardRecordingCode。系统会接手处理触觉合成。没有ISRC的曲目无法获得触觉,但其余的”正在播放”集成正常运作。

怎样的App Intent设计能带来最佳的声控快捷指令体验?

四个原则。其一,为应用声明一个AppShortcutsProvider,并为希望支持语音访问的意图注册AppShortcut条目。没有该提供者,意图只能通过手动编辑快捷指令才能进入声控快捷指令。其二,titleshortTitle应是简短的动词短语(”添加待办”、”启动计时器”),而非描述性文字。其三,参数应可选或具备默认值,以便用户在调用意图时无需指定每个字段。其四,description应是一句清晰说明意图效果的话;当用户挑选要分配的短语时,这会作为上下文呈现。

参考资料


  1. Apple Developer:Extend Speech Synthesis with personal and custom voices(WWDC 2023 session 10033)。介绍requestPersonalVoiceAuthorization.isPersonalVoice语音特征。 

  2. Apple Newsroom:Apple announces new accessibility features, including Eye Tracking。iOS 18无障碍功能发布公告,涵盖眼动追踪、音乐触觉和声控快捷指令。 

  3. Apple开发者文档:MAMusicHapticsManager,位于MediaAccessibility.framework中,是iOS 18+音乐触觉的集成接口。Info.plist中的MusicHapticsSupported键、MPNowPlayingInfoCenter的活跃来源角色,以及MPNowPlayingInfoPropertyInternationalStandardRecordingCode三者共同为发布正确元数据的任何音乐应用启用触觉合成。 

  4. Apple Support:Use Live Speech on your iPhone, iPad, and Mac。面向用户的实时朗读设置指南;该功能在系统层面运作,无需第三方应用集成。 

  5. Apple开发者文档:App Intents。该框架为声控快捷指令、Spotlight集成以及Apple Intelligence面向第三方应用的动作接口提供支撑。 

相关文章

Liquid Glass in SwiftUI: Three Patterns From Shipping Return on iOS 26

Apple's Liquid Glass is a one-line SwiftUI API. Three patterns from Return go beyond .glassEffect(): glass on text via C…

19 分钟阅读

HealthKit + SwiftUI on iOS 26: Authorization, Sample Types, and Cross-Platform Patterns

Real production patterns from Water (water tracking, HKQuantitySample) and Return (mindful sessions, HKCategorySample). …

17 分钟阅读

The Design Engineer's Agent Stack

Design engineers need agent infrastructure that enforces visual consistency, typography discipline, color compliance, an…

14 分钟阅读