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

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

引言

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

Morris 偶然遇到计算机科学副教授 Gary Bishop,这使该项目得以启动。Bishop 一直在寻找能够受益于为他们定制的辅助工具开发的用户。在他们会面时,还没有可供视障人士访问的古代世界地图。在他们最初的谈话之后,Bishop 博士为一组本科生创造了一个机会,让他们在一个为期一学期的软件工程课程中实现一个解决方案。我们很幸运能成为参与这个激动人心的项目的五人团队中的一员。

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

Python 的选择

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

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

鉴于我们严格的时间限制,像这样的允许快速开发的语言是一个巨大的优势。当时小组中没有人真正了解我们可以在项目中在多大程度上使用 Python。然而,当我们发现它拥有大量的库和模块时,我们决定可以专门使用 Python。

实施

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

BATS Test Map

BATS 系统的测试地图 放大

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

最初,为了将数据缩小以适应我们的内部模型,涉及了相当多的预处理。我们不想在每次程序启动时都经历读取和缩放过程,因为它非常耗时。相反,我们能够一次读取和缩放数据,然后将内部结构 Pickle 到一个压缩文件中。现在程序只需解压缩数据并将其直接加载到适当的数据结构中,从而大大减少了启动时间。

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

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

用户界面包括触摸板、数字键盘和语音合成器以提供反馈。鼠标和按键事件由 wxPython 处理,但我们还需要调用 Microsoft 的语音 API。我们使用 Mark Hammond 的 win32com 模块完成了这项工作,这使我们只需三行代码即可创建语音并生成语音。

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

结果

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

BATS in Action

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

Python 使我们能够证明这种类型的数据操作对于地图是可能的,并使我们能够创建强大的演示,以激发其他人对该项目的兴趣。我们有机会在学期期间的演示中演示我们的软件。在演示前的准备过程中,一个以前未被注意到的错误总会出现。我们发现这些错误可以使用 Python 快速定位和解决,Python 会报告错误发生的行号和堆栈跟踪。无需编译代码或在库之间设置复杂的链接。由于所有内容都在运行时解释,我们能够继续快速开发,而不会被复杂的语法问题所困扰或被编译时间所拖慢。

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

Python 还使集成其他程序员的模块到我们的代码中变得非常容易。我们已经并将继续试验 Python Imaging LibrarypyXMLNumeric。Bishop 教授和研究生 Peter Parente 允许从 Python 使用 OpenAL 库进行空间声音以及 Immersion 库进行触觉反馈。这是通过 SWIG 完成的,它允许自动开发 C 和 C++ 代码的 Python 语言绑定。

BATS 团队现在正在努力将该项目的某些方面带到当地高中。我们相信,通过 Python 易于阅读的代码,可以很容易地阐明可访问设计概念。我们希望让更多的学生对辅助技术的可能性感到兴奋,并培养一个致力于开源解决方案的社区。如果您想参与,请访问辅助技术网站 http://www.cs.unc.edu/assist

关于作者

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

Thomas Logan 目前居住在华盛顿州西雅图,在微软公司担任无障碍技术部门的项目经理。