WWDC Quick Look 💓 By SwiftGGTeam
Discover generated subtitles and subtitle styles

Discover generated subtitles and subtitle styles

观看原视频

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:) 调用后,系统会自动隐藏当前视频中的字幕,显示预览文本
  • positionCGPoint 偏移量,如果播放器底部有控制栏,给 Y 轴一个负值可以避免预览文本被遮挡
  • textnil 时,系统会显示本地化的默认预览文本(如 “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

评论

GitHub Issues · utterances