注意: 虽然 JavaScript 对于本网站不是必需的,但您与内容的互动将受到限制。请启用 JavaScript 以获得完整体验。

盲人音频触觉地图系统中的 Python

简介

盲人音频触觉地图系统 (BATS) 旨在为盲人和视障人士提供地图访问。我们的目标是设计方法将传统上的视觉信息呈现给用户的其他感官。当 Jason Morris 来到北卡罗来纳大学教堂山分校学习古典文学时,这个项目的需求变得清晰起来。Morris 在古代世界地图中心 (AWMC) 工作,这是一个利用制图和地理信息科学推动古代研究领域的基金会。Morris 从小就失明,在他生命中的大部分时间里,他一直面临着无法获取对其所选研究至关重要的信息的困境。在 AWMC 工作期间,他发誓要创造一个解决方案。

Morris 与计算机科学副教授 Gary Bishop 的偶然相遇启动了这个项目。Bishop 一直在寻找能够从为其需求定制的辅助工具开发中受益的用户。在他们会面时,没有以视障人士可访问的格式绘制的古代世界地图。在他们初次交谈之后,Bishop 博士为一组本科生提供了一个机会,让他们在一个为期一学期的软件工程课程中实施解决方案。我们很幸运地成为被组建来从事这个激动人心的项目的五人团队的一员。

软件工程课程由副教授 Kye Hedlund 教授,其目标是教学生如何协作工作、确定目标和按时完成任务。我们的团队首先与我们的三位顾问会面,讨论初步的设计决策。Bishop 教授向我们展示了 Dan Jacobson 博士的论文使用很少或没有视力导航地图:一种音频触觉方法,作为开发一种工具的基础,该工具通过声音和触觉提供对空间信息的访问。我们系统的核心组件是一台运行 Windows 2000 的奔腾 III 计算机、一个触摸板作为主要输入设备以及用于通过合成语音传递信息的 Microsoft Speech SDK 5.1。

Python 的选择

面对编码一个几乎没有先例的程序的艰巨任务,我们的团队必须解决的第一个主要设计决策是选择一种编程语言。我们最初的想法是使用 C++ 或 Java,因为小组中的每个人都精通这两种语言。一位小组成员在早期的课程中接触过 Python,并对其提供的强大功能和易用性印象深刻。幸运的是,其他四名成员没有使用该语言的经验并没有阻止我们做出使用 Python 的明智决定。

在开发初期,我们需要一个简单的程序来测试触摸板如何与操作系统交互。使用 wxPython(用于强大的 wxWindows GUI 工具包的 Python 包装器),这被证明非常容易。设置一个框架来完全控制屏幕非常简单,只需要最少的编码。

鉴于我们严格的时间限制,像这样允许快速开发的语言是一个巨大的优势。当时,小组中的任何人都不知道我们可以在项目中多大程度地使用 Python。然而,当我们发现它可用的广泛的库和模块集合时,我们决定可以专门使用 Python。

实施

我们接下来的会议是与古代世界地图中心主任 Tom Elliott 进行的,他碰巧拥有计算机科学的本科学位。他向我们介绍了 Barrington Atlas,这是一项为期十二年的工作,最终制作了自 1874 年以来第一批全面的古希腊和罗马文明地图。古代世界地图中心现在正在数字化这本图集中包含的所有信息,使其内部所包含的信息成为更丰富的教育工具。我们选择了不列颠群岛作为原型地图。我们的讨论集中在将图像的视觉表示及其底层数据库信息转换为我们的程序可以使用的格式。

BATS Test Map

BATs 系统的测试地图 放大

Elliott 使用 ArcView(一种强大的地图处理工具)为 BATS 提供了前两个数据文件。生成了两个 ASCII 文本文件,指示地图的表面类型和海拔高度。这些信息已格式化为 1024 列和 768 行的网格,以匹配我们的显示器和触摸板的分辨率。我们决定将这个数字网格读取到 Python 中的 Numeric 数组中。

最初,需要进行相当多的预处理来缩小数据以适应我们的内部模型。我们不希望每次启动程序时都进行读取和缩放过程,因为这非常耗时。相反,我们能够读取和缩放数据一次,然后将内部结构 Pickle 到压缩文件中。现在程序只需解压缩数据并将其直接加载到适当的数据结构中,从而显著缩短了启动时间。

加载的网格使我们能够在图像中的像素和文本文件中的值之间建立一对一的对应关系。我们设想用户将通过音频设备接收关于他们在地图上当前位置的持续反馈,方法是将声音与表面类型相关联。我们接下来的担忧是 Python 是否能够足够快地从数据结构中检索信息,以为我们的最终用户提供响应式反馈。然而,Python 能够顺利执行这些操作,并使我们能够立即提供关于表面类型的听觉反馈。观察用户在屏幕上的光标,我们看到当进入海洋区域时,程序的音频输出立即切换为海浪的声音,当重新进入陆地时,声音再次切换,没有任何延迟。用户已经开始了对不列颠群岛陆地形状的首次数字探索。地图中每个点的海拔高度也可以读取,没有任何计算暂停。

我们的系统由两个主要组件组成:图形用户界面和数据管理器。用户界面通过数据管理器与数据交互。我们的界面仅使用触摸板和数字键盘来帮助计算机经验最少的视障人士。当用户在触摸板上移动时,wxPython 鼠标移动事件会触发对表面类型表和城市数据库的查询。Python 允许我们快速重新分配和测试键和鼠标事件的组合。

用户界面包括触摸板、数字键盘和语音合成器,以提供反馈。鼠标和键盘事件由 wxPython 处理,但我们还需要调用 Microsoft 的 Speech API。我们使用 Mark Hammond 的 win32com 模块实现了这一点,该模块允许我们在仅三行代码中创建一个声音并产生语音。

数据管理器将数据维护在三个 Numeric 数组和一个使用 win32all 包创建的 ODBC 数据库连接中。这三个数组用于存储海拔、陆地类型和数据库键值。直接从 BATS 查询 Microsoft Access 数据库的决定是在我们项目截止日期非常临近时做出的。Python 再次使我们的团队能够快速成功地实施该想法。对 Access 数据库的查询是通过 ODBC 连接进行的,使用数据库键数组中的值来确定与给定位置关联的城市信息。在数据库上运行查询的能力通过允许动态创建地图,极大地扩展了此工具的教育价值。

结果

在我们学期结束时,我们创建了一个允许探索复杂地图信息的工具。现在可以通过听合成的声音和声音图标,以类似的方式获得所有可以通过查看地图获得的信息。我们的地图还提供了任何两个位置之间距离的即时通信,而无需依赖表格进行计算。听到定居点的存在时期、类型和名称的能力,将地图的用途扩展到严格的视觉渲染之外。Morris 能够使用我们的项目作为资源,为古典文学系撰写研究生论文。

BATS in Action

Jason Morris(左)与 Tom Elliott(中)和 Thomas Logan(右)一起使用 BATS 放大

Python 使我们能够证明这种地图数据操作是可能的,并允许我们创建一个强大的演示来让其他人对这个项目感到兴奋。我们有机会在整个学期课程的演示中演示我们的软件。在演示之前准备期间,总会出现一个以前没有注意到的错误。我们发现这些错误可以用 Python 非常快速地定位和解决,Python 会将发生错误的行号和堆栈跟踪报告到该点。不需要编译代码或设置库之间的复杂链接。由于一切都在运行时解释,我们能够在不被复杂的语法问题所困扰或被编译时间所减慢的情况下继续快速开发。

Python 的一个优势在于能够快速为特定受众定制演示。在向定向和行动能力指导员及其视障学生展示我们的项目时,我们能够快速创建一个比古代英国地图更熟悉的北卡罗来纳州地图。一旦我们了解了所有部件应该如何组合在一起,Python 就提供了一个可以轻松地将程序拼接在一起的环境。我们能够制作的演示帮助我们获得了微软研究院的资助,以进一步推进该项目。这些演示也引起了媒体的兴趣,这有助于宣传盲人地图的需求。

Python 还使得将其他程序员的模块集成到我们的代码中变得非常容易。我们一直在并且正在继续尝试 Python Imaging LibrarypyXMLNumeric。Bishop 教授和研究生 Peter Parente 利用 OpenAL 库实现了空间声音,并利用 Immersion 库实现了来自 Python 的触觉反馈。这是通过 SWIG 完成的,SWIG 可以自动开发 C 和 C++ 代码的 Python 语言绑定。

BATS 团队现在正致力于将该程序的各个方面推广到当地高中。我们相信,通过 Python 易于阅读的代码,可以轻松地说明无障碍设计的概念。我们希望激发许多学生对辅助技术可能性的兴趣,并培养一个致力于开源解决方案的人群社区。如果您想参与其中,请访问辅助技术网站:http://www.cs.unc.edu/assist

关于作者

Chad Haynes 现居住在纽约市,在洛克菲勒大学担任研究程序员。

Thomas Logan 目前居住在华盛顿州西雅图,在微软公司担任辅助技术组的项目经理。