注意: 雖然 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 目前居住在華盛頓州西雅圖,在微軟公司擔任無障礙技術部門的專案經理。