大多数浏览器和
Developer App 均支持流媒体播放。
-
在你的 app 中创造无缝语音体验
通过语音合成增强应用程序的可访问性体验:了解添加语音 API 的最佳时机和地点,以便使用该程序的人都能受益。了解如何使用 AVSpeechSynthesizer 来补充如 VoiceOver 等辅助技术,以及何时实现 API 的替代品。接下来我们会演示如何将音频路由到合适源并为需要或想要无缝合成语音的人创建应用程序。若您想从本次介绍中了解更多信息,您应当熟知 AVFoundation 和语音合成的基本知识。有关概述,请参阅“AVSpeechSynthesizer:让iOS开口说话。”
资源
相关视频
WWDC23
WWDC19
-
下载
(你好 2020 全球开发者大会)
你好 欢迎来到全球开发者大会
(辅助功能软件工程师 丹戈尔登) 嗨 我是丹 今天我们来谈谈如何 在你的 app 中创造流畅的语音体验
在这个讲座中 我将介绍 什么时候使用 AVSpeechSynthesizer 什么时候你可能需要考虑其他 API 然后 我将介绍一些 API 基础知识 再讨论一些更高阶的话题 比如如何通过拨出电话传送语音 或者如何从应用共享音频片段中 退出语音音频 我们首先来看两个关于 何时应该考虑 在你的 app 中使用语音的例子 如果你试图在你的 app 中 为所有人使用语音 AVSpeechSynthesizer 可能是一个好的选择 也许你的 app 是那种 无需看屏幕就可使用的设计 就像地图 app 使用语音来提供语音导航
如果你在尝试仅为那些用屏幕阅读器 或其他辅助技术 来使用你的 app 的人提供语音 AVSpeechSynthesizer 可能不是恰当的选择
我们全部的设备都装有“旁白” 这是一个内置的屏幕阅读器 有各种丰富的功能 因此你不需要再用 AVSpeechSynthesizer 创造你的 app 自带的屏幕阅读器 而是用 UIAccessibility API 让你的 app 进入可用状态 如果你想知道如何开始的话 我们往届的全球开发者大会 有一些很棒的讲座可以提供帮助 如果你想在旁白的基础上 偶尔提供更多语音 比如描述发生的一件事 你可以通过发布公告做到这一点 使用 UIAccessibility.post 写入一个通知类型的公告 以及你的语音内容的字符串 这会把语音请求委托给旁白 以便它来为你管理 如果你在创建一个 app 它有以语音为中心的体验 AVSpeechSynthesizer 可能可以为你提供 一些额外的灵活性 即使你的 app 将会与 一种辅助技术共同使用 增强型替代沟通 简称 AAC 类 app 就是这种体验的一个例子 Proloquo2Go 是一个很棒的 AAC app
它是一个非语言交流者的工具 它用图片与其他视觉提示帮人们造句 通过 AVSpeechSynthesizer 说出来 使他们得以跟其他人交流
为盲人或低视能人士设计的 app 也可能有以语音为中心的体验 Seeing AI 是一个帮助人们 与周围世界互动的 app 它为人们描述环境中的物体
请注意旁白仍旧完全 可以访问 Seeing AI 并且它的所有用户界面都被正确地标识
AVSpeechSynthesizer 仍有帮助 通过使用它来描述取景器中的物体 并给 app 更多的控制能力 来决定如何以及何时说出这些语音请求 现在我们知道了何时适合 使用 AVSpeechSynthesizer 我们来深入了解一些 API 首先相当简单 你只需创建一个 AVSpeechSynthesizer 对象 确保这个对象保留到语音完成 接下来 创建一个 AVSpeechUtterance 写入你希望被说出的字符串 最后 在你的合成器上调用说话方法 写入你创建的要说的话 就是这么简单 如果你想为使用你的 app 的每个人 提供基本的语音量 那么你可能只需做这些 默认情况下 AVSpeechSynthesizer 将使用你设备中的“辅助功能语音内容”的 设置来配置你要说的话 请记住 虽然 Siri 的声音 是可以从“语音内容设置”中选择的 它们不可以通过 AVSpeechSynthesizer API 来使用 在 Siri 的声音是所选声音的情况下 我们会自动使用一个恰当的后备声音 来配置你要说的话 后备声音与所选 Siri 声音的 相同语言代码匹配 借助辅助技术如旁白使用你 app 的人 很可能有专门为那种技术配置的 其他语音设置 此前不可能要求 AVSpeechSynthesizer 尊重那些设置 而不是你设备的“语音内容”的设置 今年我们对此做出了改变 采用了新的“优先辅助技术设置”API 在你的 AVSpeechUtterance 中 将这个属性设定为“true” 会要求 AVSpeechSynthesizer 将目前运行的辅助技术的设置 用于你要说的话 这包括语音属性 比如选择的声音 语速和音高
务必注意这些属性将优先于 任何你在要说的话上明确设定的属性 如果没有辅助技术在运行 我们将继续使用“语音内容”的设置 或者你在要说的话上设定的任何属性
我们建议你在你要说的话上这样设置 尤其是如果你的 app 可能 会与一种辅助技术被一起使用 比如旁白 但是 这个 API 不一定适合所有的 app 比如 AAC app 因此请确保相应地评估用例 (说“你好世界”) 我们来看看这个 API 如何影响语音 在这个 app 中 轻点各个按钮 将会说出字符串“你好世界” 第一个按钮使用默认设置 第二个按钮使用“优先辅助技术设置” API 在这个设备上 旁白正在运行 以一个非默认声音和较快的语速 我们来听听语音的效果如何
说“你好世界”按钮 你好世界 说“你好世界”按钮 你好世界 请注意第二个语音请求如何 使用了与旁白同样的声音和语速 这样语音更加流畅地融入旁白的体验 与此同时 第一个按钮说出字符串的方式相当不同 使用这个 app 的人可能没有预期会这样 有时 你可能想在你的 app 内定制语音 而不是遵照设备上的设置 例如 一个 ACC app 可能想为人们 提供一个可选声音列表 和定制其他语音属性的能力 以便他们能够创造一个 对他们来说更独特的声音 你可以为你要说的话设定一个声音 用一个语言代码或者标识符来选择 你也可以获得一个系统上可用的声音清单 只需在 AVSpeechSynthesisVoice 上 调用“语音声音”方法 随着新的声音被下载到辅助功能设置 这个清单将被更新 你还可以进一步定制语音 通过在你的 AVSpeechUtterance 中 设定更多的属性 比如语速、音高倍增器和音量 2018 世界开发者大会的 AVSpeechSynthesizer 讲座 更详细地介绍了所有这些属性 如果你想了解更多 我建议你观看那个讲座 如果你在创建一个以语音为中心的 app 一个可以考虑的 API 是 “混合到电话上行链路”属性 在你的 AVSpeechSynthesizer 上 将此属性设定为“true” 会通过目前活跃拨出电话传送语音 比如一般电话或者 FaceTime 通话 如果没有活跃电话 我们将继续通过默认音频路径传送语音 对于 ACC 此类的 app 这是一个很强大的 API 因为它可以让非语言交流者能够 使用传统方法进行交流 如果你在创建一个 app 该 app 有以语音为中心的体验 或者它使用了很多其他音频 可以考虑使用的另一个 API 是 “使用应用音频会话”API 在默认情况下 这在你的 AVSpeechSynthesizer 上设定为“true” 语音音频将使用你的应用共享音频片段 你可以将它设定为“false” 将语音音频管理委托给系统 这样的话 我们就可以为你解决一些问题 比如处理音频打断 以及将你的音频片段设定为活跃或不活跃 此外 语音将与来自你的 app 的 其他音频混合 因此你不必担心它会干扰 其他方面 比如音效、音乐或视频 总结 这就是对一些 AVSpeechSynthesizer API 用法的一个概述 请记住 AVSpeechSynthesizer 并不是 UIAccessibility API 的替代 相反 它应该与那些 API 共同使用 来创造良好的体验 使用“优先辅助技术设置” API 请求 AVSpeechSynthesizer 将 目前运行的辅助技术的语音设置 用于你要说的话 如果你在创建一个以语音为中心的体验 考虑“混合到电话上行链路” 或 “使用应用音频片段” API 是否能够改善你的 app 使用者的体验 语音对于使用辅助技术的人们 会是一个强大的工具 所以我鼓励你看看 如何将语音纳入你的 app 中去 让使用者有能力做出非凡的事 谢谢观看 祝你参会愉快 (2020 全球开发者大会) (你好 2020 全球开发者大会)
-
-
1:25 - Post an Announcement to the Running Assistive Technology
UIAccessibility.post(notification: .announcement, argument: "Hello World")
-
2:55 - Getting Started with AVSpeechSynthesizer
self.synthesizer = AVSpeechSynthesizer() let utterance = AVSpeechUtterance(string: "Hello World") self.synthesizer.speak(utterance)
-
4:08 - Respecting the Currently Running Assistive Technology's Speech Settings
self.synthesizer = AVSpeechSynthesizer() let utterance = AVSpeechUtterance(string: "Hello World") utterance.prefersAssistiveTechnologySettings = true self.synthesizer.speak(utterance)
-
5:42 - Customizing Speech - Choosing a Voice
let utterance = AVSpeechUtterance(string: "Hello World") // Choose a voice using a language code utterance.voice = AVSpeechSynthesisVoice(language: "en-US") // Choose a voice using an identifier utterance.voice = AVSpeechSynthesisVoice(identifier: AVSpeechSynthesisVoiceIdentifierAlex) // Get a list of installed voices let voices = AVSpeechSynthesisVoice.speechVoices()
-
6:16 - Customizing Speech - Pitch and Rate
let utterance = AVSpeechUtterance(string: "Hello World") // Choose a rate between 0 and 1, 0.5 is the default rate utterance.rate = 0.75 // Choose a pitch multiplier between 0.5 and 2, 1 is the default multiplier utterance.pitchMultiplier = 1.5 // Choose a volume between 0 and 1, 1 is the default value utterance.volume = 0.5
-
6:34 - Mix Speech With an Outgoing Call
self.synthesizer = AVSpeechSynthesizer() self.synthesizer.mixToTelephonyUplink = true
-
7:02 - Opting Speech Out of Application's Audio Session
self.synthesizer = AVSpeechSynthesizer() self.synthesizer.usesApplicationAudioSession = false
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。