筆跡分析概觀

InkAnalysis API 提供平板電腦開發人員強大的工具,以程式設計方式檢查筆跡輸入。 API 會將筆跡分類成有意義的類別,例如文字、線條、段落和繪圖。

您可以透過各種方式使用每個分類,包括改善手寫的辨識結果。

筆跡分析基本概念

本節介紹平板電腦平臺筆跡分析技術,並說明使用時機和方式。

InkAnalysis API 有效地結合兩種不同但免費的技術:手寫辨識和版面配置分類。 結合這兩種技術,可讓結果明顯大於單獨使用的部分。

手寫辨識是手寫數位筆跡的計算分析,以傳回指定語言中的字元型解譯。 也就是說,手寫辨識是電腦「讀取」個人手寫的方式。

筆跡分析可以進一步細分為筆跡分類和版面配置分析。 筆跡分類是筆跡的計算除法,以語意有意義的單位,例如段落、線條、文字和繪圖。 版面配置分析是筆跡輸入的計算檢查,可判斷筆跡在筆跡介面上的位置,以及筆劃如何以空間和甚至語意方式彼此關聯。 例如,版面配置分析可以告訴您特定筆跡片段是注釋或注標。

辨識

在 InkAnalysis API 中,辨識與筆跡分析的組合其中一個範例,就是改善辨識結果。 平板電腦手寫辨識引擎主要是設計來辨識單一水準筆跡。 不過,人們通常會在記事時撰寫多行,而且這些行不保證與頁面相關。 使用 InkAnalysis API 時,筆跡會先由筆跡分析器預先處理,再傳送至辨識器。 分析的筆跡會在辨識前轉換成水準,以改善辨識結果。

辨識的其他優點是讓筆跡分析器在將筆跡傳送至辨識器之前更正不正確的筆劃順序資訊來衍生。 此外,辨識結果現在以選擇性方式提供。 也就是說,開發人員可以在單一呼叫中快速擷取單一單字、行或段落的辨識結果。

筆跡分類

當然,您可能會在各種案例中保留筆跡資料,而不是立即轉換成文字。 筆跡分析也會在這裡提供優點。 具體來說,InkAnalysis API 可讓您根據筆跡筆劃撰寫或繪圖來分割筆墨筆劃。 分類為寫入的筆墨筆劃是構成單字或字元的筆劃。 所有其他筆劃都是繪圖。 這可讓您以新的方式存取筆跡資料,並啟用新的使用者案例。 例如,您可以實作選取範圍,使其根據使用者點選的筆劃類型而有所不同;如果使用者點選寫入筆劃,應用程式會選取撰寫文字的整個筆劃集,如果使用者點選繪圖筆劃,應用程式只會選取該筆劃。

版面配置分析

實用的版面配置分析實際上遠超過筆跡撰寫和繪圖元件的相對簡單細目。

筆跡分析也包含更豐富的書寫和繪圖筆劃細目。 以非常簡單的範例為例,請採用筆跡 Blob,如下圖所示。

兩行簡單的手寫

在平臺分析這些筆劃之後,它會傳回這些筆劃的樹狀結構標記法,如下圖所示。 在此簡單案例中,樹狀結構只包含段落、行和字資訊,但隨著筆跡檔的複雜度增加,此樹狀結構的豐富度會增加。

根、段落、行和字的樹狀結構表示

由於這項資訊現在分成可管理的單位,因此您現在可以建立更強大的功能。 例如,應用程式可以擴充使用者點選的功能,以選取單字到使用者點選一次以選取單字的功能、點選兩次以選取整個行,然後點選三次以選取整個段落。 藉由利用分析作業傳回的樹狀結構,應用程式可以將點選的區域與樹狀結構中的筆劃產生關聯。 應用程式找到筆劃之後,就可以向上流覽樹狀結構,以判斷要選取的鄰近筆劃和方式。

選取整個線條是筆跡分析優點的簡單範例,但當筆跡分析器考慮不同類型的階層式結構時,可能會變得很適合:

  • 已排序和未排序的清單
  • 圖形
  • 以文字內嵌撰寫的批註批註

功能的類型會因應用程式而異,並根據需求和可用的筆跡分析和辨識引擎而定。

主要筆跡分析功能

InkAnalysis API 的主要功能包括下列功能:

  • 累加分析
  • 持續性
  • 資料 Proxy
  • 和解
  • 擴充性

累加分析

當使用者使用筆跡時,通常會將其視為手寫。 筆跡會持續受限於編輯作業,例如新增筆跡、刪除現有筆跡,以及修改筆跡屬性,全都以持續編輯手寫的方式完成。 這些編輯作業會影響分析結果。 發生編輯時,通常可以隔離至特定時間點的檔區段。 例如,假設使用者寫入五行筆跡。 應用程式分析筆跡的標準方式是等到使用者完成寫入所有五行筆跡,例如段落,然後以同步或非同步方式分析結果。

您可以藉由隔離正在寫入時分析的區域,然後只重新分析已變更的結果部分,以優化分析這五行的整體時間。 分析第一行之後,除非終端使用者修改,否則永遠不會再次辨識。 第二行的辨識會被視為獨立的辨識作業。

這個累加方法適用于辨識作業的線條層級,但需要針對筆跡分析作業以較高層級運作。 因為筆跡分析器可以偵測這五行筆墨 (的不同層級分類,所以它可以是清單) 的標準段落或五個專案,所以筆跡分析器的累加方法就是必須分析這些較高的結構。 也就是說,在筆跡分析器將第一行筆跡分類為線條之後,它會在將第二行分類時,再次檢查它是否仍是一行。 不過,筆跡分析器會將這個雙重檢查隔離至段落,並在分析第二個段落時忽略第一個段落,並將第二個段落視為獨立的筆跡分析器作業。 這個累加式分析方法可大幅節省應用程式中已存在大量筆跡時的處理時間。

持續性

累加式分析在 InkAnalyzer 物件的指定會話或實例內運作良好。 不過,第一代平板電腦平臺 API 無法在筆跡保存到磁片之後執行累加分析。 InkAnalysis API 可讓您將筆跡儲存到磁片,以及分析結果的保存形式。 載入筆跡並插入 InkAnalyzer的新實例時,可以載入分析結果。 InkAnalyzer物件的新實例接著具有先前擁有的相同結果狀態,現在可以接受任何修改作為現有狀態的累加變更,而不是再次分析所有專案。

資料 Proxy

許多應用程式在其應用程式中已經有某種現有的檔結構;例如,圖形或資料庫。 InkAnalyzer也會在CoNtextNode物件的樹狀結構中呈現結構化形式。 InkAnalyzer結構和應用程式現有的結構需要以兩個方向互通:結果會從InkAnalyzer提取到應用程式,而狀態會從應用程式推送至InkAnalyzer

如果從 InkAnalyzer 提取結果到應用程式的結構,就相當簡單。 應用程式會逐一查看結果樹狀結構,並複製 (將) 其現有資料結構所需的所有結果片段進行整合。 不過,由於許多水準應用程式需要磁片的累加分析和持續性,所以問題會變成雙向。 狀態 (過去的結果) 必須從應用程式的 結構提取,並推送至 InkAnalyzer

為了符合這項需求, InkAnalyzer 包含一系列事件,其會在分析作業期間于適當時間引發,以允許應用程式將資料的要求 Proxy 傳回其現有結構。 這些事件只會針對累加作業所需的 CoNtextNode 物件引發。

和解

大部分的應用程式都會想要分析背景中的筆跡,以將使用者介面中斷降到最低。 不過,如果使用者變更筆跡 (或正在分析的鄰近筆跡) ,則分析背景中的筆跡會造成問題。 例如,如果使用者在背景作業期間刪除筆跡,則產生的結構會在背景作業啟動時反映檔的狀態,而不是完成時。

為了協助應用程式, InkAnalyzer 會協調分析作業的開頭和結尾之間的檔狀態差異。 在背景中執行分析時,使用者或應用程式所做的變更一律會覆寫在背景中計算的結果。 對帳之後,只會報告不會與檔變更衝突的結果結構部分,而且會標記衝突的筆劃以供日後分析。 下次執行背景分析作業時,系統會根據新狀態重新計算結果。

下圖顯示此程序。 時間會以線性方式從圖表的上到下來表示。

在分析作業期間協調檔狀態變更的程式

  1. 在時間 1 (t1) ,應用程式會從使用者收集筆跡,包括任何類型的筆跡修改,例如新增、移除或修改。
  2. 在 t2,應用程式會叫用背景分析作業。 InkAnalyzer會決定哪些筆跡沒有結果,以及需要重複檢查哪些筆跡。 它會複製所需的筆跡資料,讓背景執行緒獨立執行。
  3. 在 t3, InkAnalyzer 會將使用者介面執行緒執行傳回給應用程式。 InkAnalyzer會建立第二個執行緒、背景分析執行緒,以及筆跡分析和辨識引擎會分析複製的筆跡資料。
  4. 當分析作業發生在第二個背景執行緒時,終端使用者會繼續編輯檔、新增和移除筆劃資料,在 t4 和 t5。 這些編輯可能會與背景中正在處理的工作衝突。
  5. 在 t6,背景執行緒已完成分析作業,且結果已就緒。 在 InkAnalyzer將結果傳達給應用程式之前,它會執行對帳演算法,以判斷分析作業在計算 (t4 和 t5 時所做的使用者編輯,) 與結果衝突。 如果偵測到任何衝突,碰撞筆劃會標示為重新分析,下次應用程式叫用背景分析作業時就會發生。
  6. 最後,在 t7,偵測到所有衝突時, InkAnalyzer 會將結果呈現給應用程式。

擴充性

InkAnalysis API 允許應用程式使用新類型的分析引擎,以防止應用程式重寫 InkAnalysis API 的所有優點,包括對帳、資料 Proxy、持續性和累加分析。

Microsoft.Ink

筆跡分析參考