盲人音訊觸覺地圖系統中的 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 系統的測試地圖 放大
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 能夠使用我們的專案作為資源,為古典文學系撰寫研究生論文。

Jason Morris(左)與 Tom Elliott(中)和 Thomas Logan(右)一起使用 BATS 放大
Python 使我們能夠證明這種地圖資料操作是可能的,並允許我們建立一個強大的演示來讓其他人對這個專案感到興奮。我們有機會在整個學期課程的演示中演示我們的軟體。在演示之前準備期間,總會出現一個以前沒有注意到的錯誤。我們發現這些錯誤可以用 Python 非常快速地定位和解決,Python 會將發生錯誤的行號和堆疊跟蹤報告到該點。不需要編譯程式碼或設定庫之間的複雜連結。由於一切都在執行時解釋,我們能夠在不被複雜的語法問題所困擾或被編譯時間所減慢的情況下繼續快速開發。
Python 的一個優勢在於能夠快速為特定受眾定製演示。在向定向和行動能力指導員及其視障學生展示我們的專案時,我們能夠快速建立一個比古代英國地圖更熟悉的北卡羅來納州地圖。一旦我們瞭解了所有部件應該如何組合在一起,Python 就提供了一個可以輕鬆地將程式拼接在一起的環境。我們能夠製作的演示幫助我們獲得了微軟研究院的資助,以進一步推進該專案。這些演示也引起了媒體的興趣,這有助於宣傳盲人地圖的需求。
Python 還使得將其他程式設計師的模組整合到我們的程式碼中變得非常容易。我們一直在並且正在繼續嘗試 Python Imaging Library、pyXML 和 Numeric。Bishop 教授和研究生 Peter Parente 利用 OpenAL 庫實現了空間聲音,並利用 Immersion 庫實現了來自 Python 的觸覺反饋。這是透過 SWIG 完成的,SWIG 可以自動開發 C 和 C++ 程式碼的 Python 語言繫結。
BATS 團隊現在正致力於將該程式的各個方面推廣到當地高中。我們相信,透過 Python 易於閱讀的程式碼,可以輕鬆地說明無障礙設計的概念。我們希望激發許多學生對輔助技術可能性的興趣,並培養一個致力於開源解決方案的人群社群。如果您想參與其中,請訪問輔助技術網站:http://www.cs.unc.edu/assist 。
關於作者
Chad Haynes 現居住在紐約市,在洛克菲勒大學擔任研究程式設計師。
Thomas Logan 目前居住在華盛頓州西雅圖,在微軟公司擔任輔助技術組的專案經理。