Highlight
Apple 在 iOS 27、macOS 27、tvOS 27 和 visionOS 27 上推出了设备端 AI 生成字幕功能,视频播放时系统会自动将语音转写为字幕或将字幕翻译为其他语言,无需开发者编写任何代码;同时新增了字幕样式实时预览 API,让用户在播放界面直接切换和预览字幕样式。
核心内容
字幕的痛点:内容有了,语言不通
你做了一个视频 App,内容覆盖全球用户。但一个现实问题是:你的视频可能只有一种语言的字幕,甚至没有字幕。用户听不懂,只能放弃。
过去解决这个问题,要么在内容制作阶段手动添加多语言字幕(成本高、周期长),要么在 App 里接入第三方语音识别和翻译服务(需要服务器、有隐私顾虑、还得自己处理字幕渲染)。
Apple 这次直接把设备端 AI 模型塞进了 AVFoundation 的播放管道。
AI 生成字幕的两种工作模式
(02:14)系统提供两种生成字幕的方式:
语音转写(Speech transcription):源音频进入设备端的 Speech-To-Text 模型,实时生成字幕。适合原始视频没有字幕的场景。
字幕翻译(Language translation):源字幕(比如英语)进入设备端的翻译模型,生成另一种语言的字幕(比如意大利语)。适合视频有字幕但缺少目标语言的场景。
这两种方式都在设备本地完成,不需要网络请求,也没有数据离开设备。
零代码接入,但人工字幕始终优先
(03:03)最好的消息是:你什么都不用做。只要用户在播放视频时选择了 AI 生成的字幕选项,系统就会自动处理。
系统会优先使用内容作者提供的人工字幕(Authored subtitles)。只有当人工字幕缺少用户需要的语言时,才会 fallback 到 AI 生成字幕。人工字幕的内容和时序不会被修改。
支持的设备和场景
(04:03)从 iOS 27、macOS 27 开始,英语音频可以生成英语字幕。tvOS 27 和 visionOS 27 也同步支持。多语言字幕翻译(从英语字幕翻译为其他语言)在 iOS 和 macOS 上可用。
覆盖的播放场景包括:
- HLS 直播流(如电视频道)
- 视频点播(电影、剧集、旅行视频、体育赛事)
- 本地文件(App 内嵌视频、已下载的媒体)
内容类型也没有限制,专业制作内容和用户原创内容(如 iPhone 拍摄的视频、社交媒体视频)都支持。
字幕样式预览:从设置 App 搬到播放界面
(05:45)以前用户想改字幕样式,必须退出 App,去「设置 -> 辅助功能」里调整,改完再回来看效果。流程割裂,体验很差。
现在用户可以在播放界面的字幕菜单里直接切换样式,并且实时看到预览效果。系统内置了几种预设样式,用户也可以创建自定义样式(比如「粗体黄色」这种带边框的样式)。
AI 生成的字幕在菜单中会标有 Sparkle(✨)图标,翻译生成的还会带有 “Translated” 标签,方便用户区分。
详细内容
字幕选择 UI 的三种实现方式
(04:37)Apple 提供了三种接入字幕选择的方式,按集成复杂度从低到高排列:
AVPlayerViewController(iOS)/ AVPlayerView(macOS):自带完整的字幕选择和播放器控制,零代码即可使用 AI 生成字幕和样式预览。
AVLegibleMediaOptionsMenuController:只提供字幕选择控件,不带播放器控制。适合已有自定义播放器 UI 的 App。
自定义控件:完全自己实现媒体选择 UI,需要手动处理所有逻辑。
字幕样式预览的 API 实现
(07:25)对于使用自定义播放器的开发者,AVPlayerLayer 提供了直接显示样式预览的 API。
每个字幕样式在系统中都有一个 profile ID。实现流程分为四步:
import AVFoundation
import MediaAccessibility
// 1. 获取系统中所有字幕样式的 profile ID
func updateProfileList() {
subtitleStyleProfileIDs = MACaptionAppearanceCopyProfileIDs() as? [String] ?? []
}
// 2. 用户选中某个样式时,在播放器上显示预览
func showPreviewStyle(subtitleStyleProfileID: String) {
// text 传 nil 时显示系统默认的本地化预览文本
// position 是相对于默认位置的偏移,用来避开 UI 控件
playerLayer.setCaptionPreviewProfileID(subtitleStyleProfileID, position: .zero, text: nil)
}
// 3. 用户选定后,停止预览
func stopPreviewStyle() {
// 移除预览文本,恢复原本活跃的字幕
playerLayer.stopShowingCaptionPreview()
}
// 4. 将选中的样式设为系统活动样式
func setSubtitleStyle(subtitleStyleProfileID: CFString) {
// 这会影响到设备上所有支持该特性的 App
MACaptionAppearanceSetActiveProfileID(subtitleStyleProfileID)
}
关键点:
MACaptionAppearanceCopyProfileIDs()返回系统预设和用户自定义的所有样式 ID,类型是CFArray,需要桥接到 Swift 的[String]setCaptionPreviewProfileID(_:position:text:)调用后,系统会自动隐藏当前视频中的字幕,显示预览文本position是CGPoint偏移量,如果播放器底部有控制栏,给 Y 轴一个负值可以避免预览文本被遮挡text传nil时,系统会显示本地化的默认预览文本(如 “Subtitle Preview”)stopShowingCaptionPreview()会移除预览文本并恢复原本的字幕显示MACaptionAppearanceSetActiveProfileID()是全局设置,影响整个系统的字幕样式,应在用户明确确认后才调用
一个完整的用户场景
(08:55)演讲者演示了一个实际场景:观看一段英语露营视频,想要意大利语字幕来练习语言。
用户打开字幕菜单 -> 选择 Language -> 看到多个字幕选项(人工字幕和 AI 生成字幕)-> 选择标有 ✨ Translated 的意大利语生成字幕 -> 字幕实时显示为意大利语。
然后用户打开 Style 菜单 -> 选择 Large Text -> 预览显示更大的字体 -> 再选一个自定义样式 -> 确认后字幕按新样式显示。
整个流程不需要离开播放界面,也不需要开发者编写任何 AI 相关的代码。
核心启发
1. 给教育类 App 加上多语言字幕支持
- 做什么:让在线课程视频自动支持学生母语字幕。
- 为什么值得做:AI 翻译字幕让课程内容可以触达非英语母语用户,设备端处理意味着没有额外的服务器成本。
- 怎么开始:确保你的视频播放器使用
AVPlayerViewController或接入AVLegibleMediaOptionsMenuController,字幕菜单会自动显示 AI 生成选项。
2. 在自定义播放器里集成样式预览
- 做什么:在播放器的设置面板里加一个「字幕样式」选项,让用户边看边调。
- 为什么值得做:以前用户要切出 App 去系统设置改样式,现在可以在播放界面直接完成,体验更连贯。
- 怎么开始:用
MACaptionAppearanceCopyProfileIDs()获取样式列表,用AVPlayerLayer.setCaptionPreviewProfileID()实现实时预览。
3. 为直播 App 补齐无障碍能力
- 做什么:让体育赛事、新闻直播等实时内容支持 AI 生成字幕。
- 为什么值得做:直播内容通常没有预先制作好的字幕,AI 语音转写可以实时生成,帮助听障用户理解内容。HLS 直播流直接支持。
- 怎么开始:检查你的直播播放器是否基于
AVPlayer,如果是,生成字幕功能自动生效。
4. 在字幕菜单里标注 AI 生成内容
- 做什么:利用系统自带的 ✨ 图标和 “Translated” 标签,让用户清楚知道哪些字幕是 AI 生成的。
- 为什么值得做:透明度有助于建立用户信任,用户知道 AI 字幕可能不如人工字幕精准,会合理调整预期。
- 怎么开始:使用系统提供的
AVLegibleMediaOptionsMenuController,这些标识会自动显示,不需要额外代码。
关联 Session
- What’s new in HTTP Live Streaming — HLS 直播流是 AI 生成字幕的核心应用场景之一,了解 HLS 新特性有助于优化流媒体播放体验
- What’s new in accessibility — 字幕是无障碍功能的重要组成部分,结合其他辅助功能可以构建更完整的无障碍体验
- Explore the SwiftUI container view pattern — 如果你在用 SwiftUI 构建自定义播放器 UI,容器视图模式可以帮助你更好地组织播放器控件和字幕菜单
- What’s new in AVFoundation — AVFoundation 的整体更新,了解播放器框架的最新能力
评论
GitHub Issues · utterances