为视障用户提供图表音频反馈

GitHub tag (1.0.0) License

背景

iOS 13 引入了一种很棒的方式,可以为视障用户提供股票图表。通过自定义的辅助功能旋转控件,他们提供口头图表分析和音频图,通过音频渲染图表。这是描述图表最准确的方式,否则只能通过视觉方式获得。
如果你还没有亲自尝试过,请观看以下视频

Screenshot

音频图 (Audiograph)

不幸的是,苹果没有提供公共 API,使开发人员能够在他们的应用程序中实现它(目前还没有)。我认为图表可以提供一种很好的信息呈现方式,但我们不应将其使用限制于非残疾人士。
这就是 Audiograph 的用武之地

Screenshot

示例

示例应用程序提供了许多与展示炫酷图表相关的东西。我在我的博客中写了关于图表的内容。但是,这个项目是关于可访问性的。
你可以在文件 ChartView+Accessibility.swift 中找到所有与可访问性相关的内容。

要运行示例项目,请克隆此 repo,并从 iOS Example 目录打开 iOS Example.xcworkspace。

用法

在声明 import Audiograph 之后,你可以使用本地化的短语初始化 Audiograph。 这些短语将改善用户的体验。
它们描述了如何启动 Audiograph (accessibilityIndicationTitle,例如“播放音频图”),以及什么短语应指示播放已结束 (completionIndicationUtterance,例如“完成”)
你需要存储对 Audiograph 的强引用。

let audiograph: Audiograph = {
    let completion = NSLocalizedString("CHART_ACCESSIBILITY_AUDIOGRAPH_COMPLETION_PHRASE", comment: "This phrase is read when the Audiograph has completed describing the chart using audio. Should be something like 'complete'.")
    let indication = NSLocalizedString("CHART_PLAY_AUDIOGRAPH_ACTION", comment: "The title of the accessibility action that starts playing the audiograph. 'Play audiograph.' for example.")
    let localizations = AudiographLocalizations(completionIndicationUtterance: completion, accessibilityIndicationTitle: indication)

    return Audiograph(localizations: localizations)
}()

现在你有多个选项来播放音频图。

  1. 使用自定义辅助功能操作
  2. 直接调用 .play(graphContent: ),该参数的类型为 [CGPoint],并且应该是你用于绘制 UI 的相同点。

仅当你知道何时播放音频图时,才鼓励使用第二个选项。 在任何其他情况下,第一个选项将最适合你。

为了利用系统,首先让你的图表视图符合 AudiographProvidable
这样做时,视图可以通过将 graphContent 设置为也用于绘制 UI 的 [CGPoint] 来传递数据点。

当你配置辅助功能属性时,请确保使用 audiograph.createCustomAccessibilityAction(for: ) 作为自定义操作。

extension ChartView: AudiographProvidable {
    var graphContent: [CGPoint] {
        scaledPoints
    }
    var accessibilityLabelText: String { "Chart, price over time" }
    var accessibilityHintText: String { "Actions for playing Audiograph available." }

    func setupAccessibility() {
        isAccessibilityElement = true
        shouldGroupAccessibilityChildren = true
        accessibilityLabel = accessibilityLabelText
        accessibilityHint = accessibilityHintText

        accessibilityCustomActions = [audiograph.createCustomAccessibilityAction(for: self)]
    }
}

像这样操作时,Audiograph 和返回的操作将负责启动和停止播放。

你可以在文件 "ChatzChartView+Accessibility.swift" 中找到有关如何配置它的示例。

配置

所有提到的自定义都需要在调用 play(graphContent:completion:) 启动播放之前设置。

播放时长

指定音频应播放的秒数。 可能的选项是

public enum PlayingDuration {
    case short
    case recommended
    case long
    case exactly(DispatchTimeInterval)
}

以上选项(.exactly 除外)仅作为**建议**。 最终的音频图可能需要更长的时间,具体取决于输入。 确保每个片段都有足够的时间播放,以便用户能够听到图表中两个点之间的差异。
但是,可能会删除一些数据点,以使播放时长保持在合理的范围内。

频率

输入点会进行缩放,以使其介于最小和最大频率之间。 音频图的最低频率在 minFrequency 中指定,其最大频率存储在 maxFrequency 中。
这些频率可以根据用例进行更改。

音量

可以通过设置 volumeCorrectionFactor 来配置音量。 该因子将应用于声音的最终音量。
在运行单元测试时,指定 0 可能会很方便。 如果用例需要更高的音量,则可以将该因子设置为最高 2 的值。

完成短语

上面的视频以 Siri 的声音说“完成”结尾。 参数 completionIndicationUtterance 控制系统在播放音频图完成后说的短语。
即使可以将此短语设置为空字符串,也建议通知用户没有更多期望。 但是,必须由应用程序设置它,因为 Swift 包在开发时不能包含本地化文件。

平滑处理

当为图表播放音频图时,用户很可能对曲线的每个细节不感兴趣。 用户更想听到图表在什么时候朝哪个方向移动。
为了实现这一点,该库可以在生成音频图之前平滑图表。

考虑以下输入图


                          _   /
                         / \_/
         _   _   _     _/
    -   / \_/ \_/ \   /
   / \_/           \_/
 _/
/

应用平滑处理后,听起来会更像这样

                        /
                      _/
                     /
     ____________   /
   _/            \_/
  /
 /
/

默认情况下,平滑处理设置为适合大多数需求的参数。 但是,你可以完全关闭它(通过将其设置为 .none)或对其进行微调,以提供特定用例的最佳用户体验。
为此,它使用指数移动平均值,自定义值应介于 [0, 1] 之间,其中 1 表示使用原始数据,0 表示最大平滑度。

安装

Swift Package Manager

使用 Swift Package Manager 将此添加到你的项目中。 在 Xcode 中,这很简单:文件 > Swift Packages > 添加 Package Dependency... 就完成了。 以下显示了旧项目的其他安装选项。

CocoaPods

如果你已经在使用 CocoaPods,只需将 'Audiograph' 添加到你的 Podfile,然后运行 pod install

Carthage

如果你已经在使用 Carthage,只需添加到你的 Cartfile

github "Tantalum73/Audiograph" ~> 1.0

然后运行 carthage update 以构建框架,并将构建的 Audiograph.framework 拖到你的 Xcode 项目中。

作者

Andreas Neusüß

我很想听取你的反馈。 你可以给我发送电子邮件或在 Twitter 上联系我! 😊

许可证

Audiograph 在 MIT 许可证下可用。 有关更多信息,请参阅 LICENSE 文件