你是不是也遇過這種情況:出差回來,錢包裡塞滿一疊發票,要報帳得一張一張手打;或是去吃熱炒,老闆手寫的菜單拍下來想傳給朋友,結果只能自己一個字一個字念出來。過去我們對 OCR(光學字元辨識)的印象,大概就是「掃描 PDF 還行,手寫體就完蛋」。

但這幾個月開源圈出現一個值得注意的新名字:TeleOCR。它在 HuggingFace 上線短短一週就累積超過 1200 個讚、下載數突破三萬次,而且它不是單純的「文字辨識模型」,而是建立在 Qwen2.5-VL 視覺語言模型之上的圖文轉文字工具。這代表什麼?代表它不只能讀印刷體,還能理解表格結構、辨識手寫字、甚至看得懂混排的中英數字。

這篇文章我會帶你從零開始,用五個步驟把 TeleOCR 跑起來,並且用香港、台灣讀者最常遇到的三種場景——手寫菜單、報帳發票、中藥材標籤——實際測試它的表現。不管你會不會寫程式,我都會給你對應的做法:想自己架的人有本地部署指令,只想快速試用的人也有 API 與網頁版路徑。

TeleOCR 到底是什麼?跟傳統 OCR 差在哪?

先講結論:傳統 OCR 是「看字形」,TeleOCR 是「看懂內容」。

傳統工具像 Tesseract,運作邏輯是把圖片切成一格一格,比對字庫裡的字形。這種方法對印刷體很有效,但只要遇到手寫、歪斜、反光、或是中英文夾雜,錯誤率就會飆高。更麻煩的是,它讀出來的是一堆散落的文字,表格的「欄位對應」完全丟失,你還是得自己重新排版。

TeleOCR 走的是完全不同的路線。它底層是 Qwen2.5-VL 這個視覺語言模型,意思是它會「先理解整張圖在幹嘛」,再決定要輸出什麼。所以你可以直接下指令,例如「請把這張發票的品項、數量、金額整理成表格」,它就會照著做,而不是丟給你一坨文字。

實際差異我整理成這樣給你參考:

第一,手寫辨識能力大幅提升。Qwen2.5-VL 系列在中文手寫的訓練資料上著墨不少,對於台灣、香港常見的行書、略帶連筆的寫法,容錯率明顯比舊工具好。

第二,結構化輸出。你可以要求它輸出 Markdown 表格或 JSON,這對要匯入 Excel 或會計系統的人來說,省下的時間是以小時計的。

第三,多語言混排。香港的單據常常中英夾雜,台灣的發票也有英文品名,這類「一句話裡有三種語言」的場景,正是視覺語言模型的強項。

當然它也不是萬能。如果圖片模糊到人眼都難辨、或是字跡過於潦草,它一樣會出錯。所以拍照品質還是關鍵,這點我們後面會談。

怎麼開始用?三種路徑挑一種就好

在動手之前,先確認你是哪種使用者,因為路線完全不同。

路徑一:完全不想碰程式碼。 最簡單的方式是找已經串好 TeleOCR 或同架構模型的線上服務,直接把圖片拖進去。這類服務通常免費額度有限,適合偶爾用一次的人。你只要記得一件事:上傳前把單據上的個資(身分證號、信用卡號)先遮掉,這是基本資安習慣。

路徑二:想在自己電腦跑,但不想太折騰。 用 Ollama 或 LM Studio 這類工具,把量化後的模型載下來,用圖形介面操作。這種做法對 Mac 用戶特別友善,M 系列晶片跑 7B 等級的視覺模型已經相當流暢。

路徑三:要整合進自己的工作流程。 那就用 Python 直接呼叫,或架一個本地 API 服務。下面我會給你可直接複製的指令。

步驟一:環境準備與模型下載

如果你選路徑三,先開一個乾淨的 Python 環境。我建議用 Python 3.10 以上版本,避免套件相容性問題。

python -m venv teleocr-env
source teleocr-env/bin/activate   # Windows 用 teleocr-env\Scripts\activate
pip install transformers torch accelerate pillow

接著下載模型。TeleOCR 在 HuggingFace 上的模型 ID 是 XingChen-AGI/TeleOCR,一行指令就能抓下來:

from transformers import AutoProcessor, AutoModelForVision2Seq

model_id = "XingChen-AGI/TeleOCR"
processor = AutoProcessor.from_pretrained(model_id)
model = AutoModelForVision2Seq.from_pretrained(
    model_id,
    torch_dtype="auto",
    device_map="auto"
)

這裡有個實用提醒:如果你的顯卡記憶體只有 8GB 以下,建議加上 load_in_4bit=True 參數做 4-bit 量化,記憶體需求可以降到約三分之一,速度影響不大但能跑得動。Mac 用戶則把 device_map 設成 "mps"。

步驟二:下對指令,結果差十倍

這一步是整篇教學最關鍵的地方。很多人用了視覺語言模型卻覺得「怎麼讀出來亂七八糟」,問題九成出在指令下得太隨便。

錯誤示範:請辨識這張圖

正確示範要包含三個元素:角色、任務、輸出格式。例如處理發票:

prompt = """你是一位會計助理。請辨識這張發票,
擷取以下欄位:店家名稱、日期、品項名稱、數量、單價、總金額。
以 Markdown 表格輸出,若某欄位無法辨識請填「無法辨識」,不要自行猜測。"""

看到最後那句了嗎?「不要自行猜測」非常重要。視覺語言模型有個通病:遇到模糊的字會「腦補」出一個看起來合理的答案。加上這句約束,它就會誠實地標記無法辨識,你人工複核時才不會漏掉錯誤。

處理手寫菜單時,指令可以改成:「這是一張手寫菜單,請逐行辨識菜名與價格,保留原本的排版順序,價格請只輸出數字。」實測下來,加上「保留原本排版順序」這句,輸出結果會整齊非常多。

步驟三:實際跑一張圖,看它怎麼運作

把圖片讀進來,送進模型:

from PIL import Image

image = Image.open("receipt.jpg")
messages = [
    {"role": "user", "content": [
        {"type": "image"},
        {"type": "text", "text": prompt}
    ]}
]

text_prompt = processor.apply_chat_template(messages, add_generation_prompt=True)
inputs = processor(text=text_prompt, images=[image], return_tensors="pt").to(model.device)

output = model.generate(**inputs, max_new_tokens=1024)
result = processor.decode(output[0], skip_special_tokens=True)
print(result)

跑出來的結果通常會在幾秒內出現。以台灣常見的電子發票證明聯來說,品項、數量、金額的對應準確度相當高;香港的手寫收據則要看字跡,工整的話辨識率也不錯。

步驟四:拍照技巧決定成敗

這點我一定要獨立拉出來講,因為八成以上的辨識失敗,問題出在拍照而不是模型。

第一,光線要均勻。台灣的便利商店、香港的茶餐廳常常是頂光,拍下去容易反光。做法是把手機稍微傾斜一個角度,避開直射反光點。

第二,鏡頭要正對紙面。斜拍會造成梯形變形,雖然模型有一定容錯,但正拍永遠最準。現在手機相機多半有「文件掃描」模式,會自動校正透視,開起來用。

第三,解析度不要壓縮。很多人拍完直接傳到通訊軟體再下載,圖片被壓縮過,字邊緣就糊了。建議直接從相簿原檔處理,長邊至少 1500 像素以上。

第四,一次拍一張。不要想用一張廣角照涵蓋三張單據,字太小模型會吃力。

步驟五:辨識完的複核與匯出

最後一步,也是最多人偷懶的一步。無論模型多強,涉及金額的資料一定要人工複核,尤其是小數點和數字 0 與 6、1 與 7 這類容易混淆的字元。

我的建議流程是:先讓模型輸出 CSV 或 Markdown 表格,貼進 Excel 後,用一個簡單的公式做「總金額 = 各品項加總」的交叉驗證。只要兩邊對不起來,就代表某個數字被讀錯了,直接回頭找那張圖核對。這個小動作可以幫你擋掉九成的錯誤。

如果你是要報帳,記得把原始圖片跟辨識結果一起存檔,日後被問到才有依據。

香港台灣讀者的三個實戰場景

場景一:茶餐廳手寫單。 香港茶餐廳的落單紙常常是速記字跡,「凍檸茶」寫成「凍O」這種縮寫,模型有機會讀錯。建議在指令裡加一句「這是香港茶餐廳用語,請保留原文不要翻譯」,避免它自作聰明轉成普通話。

場景二:台灣電子發票。 這類單據格式統一、印刷清晰,是 TeleOCR 表現最好的場景,幾乎可以做到接近百分之百。如果你每個月都要報帳,非常值得花半小時把流程自動化。

場景三:中藥材標籤與保健品成分表。 這類文字密集、字體偏小,建議先用手機的裁切功能把成分表那塊放大再拍,辨識率會明顯提升。

總結:把重複勞動交給機器

TeleOCR 這類視覺語言模型真正改變的,不是「辨識變準了」這麼簡單,而是我們終於可以用自然語言指揮電腦處理圖片。以前你要寫一堆前處理、切圖、比對的程式,現在只要把需求講清楚就好。

如果你今天只想帶走三件事,我會說是這三件:第一,指令要包含角色、任務、輸出格式,並且明確要求它不要猜測;第二,拍照品質比模型版本更影響結果,光線均勻、正對紙面、不要壓縮;第三,金額相關資料一定要交叉驗證,模型是幫你省時間,不是幫你負責任。

現在就打開你的相簿,找一張最麻煩的單據試試看吧。第一次跑可能會有小挫折,但抓到指令的訣竅之後,你會發現以前要花半小時的手打工作,現在三分鐘就結束了。

延伸閱讀

常見問題

Q: TeleOCR 可以離線使用嗎?會不會把我的發票資料傳出去?

A: 可以完全離線。 只要你用本地部署的方式(步驟一的路徑),所有圖片處理都在你自己的電腦上完成,不會有任何資料離開你的裝置。這對處理含個資的單據來說是最安全的做法。反過來說,如果你用的是線上服務,上傳前務必先遮蔽信用卡號、身分證號等敏感欄位。

Q: 我的電腦沒有獨立顯卡,跑得動嗎?

A: 跑得動,但要有耐心。 用 CPU 執行 7B 等級的視覺模型,一張圖大約需要 20 到 60 秒。如果你只是想偶爾用,這樣其實夠了。想加速的話,Mac 的 M 系列晶片用 MPS 加速效果不錯,Windows 用戶則建議找量化版本(GGUF 格式)搭配 Ollama,記憶體需求可以壓到 8GB 左右。

Q: 手寫字辨識率大概多少?值得期待嗎?

A: 工整的手寫約有八九成,潦草的可能掉到五成以下。 關鍵在於字跡與拍照品質。實測經驗是:橫平豎直、字距分明的手寫菜單表現很好;但如果是醫生處方箋那種連筆狂草,目前所有模型都還是有難度。建議把它當成「幫你打好八成、你補兩成」的助手,而不是全自動方案。

Q: 除了發票和菜單,還能用來做什麼?

A: 任何「圖片裡有文字需要變成可編輯資料」的場景都適用。 常見的還有:名片建檔、書籍段落摘錄、白板會議紀錄、外語菜單翻譯、身分證件資料輸入、以及掃描舊文件做數位典藏。特別是白板照片,因為視覺語言模型能理解版面配置,它可以把散落的便利貼內容整理成有條理的清單,這是傳統 OCR 做不到的。

Q: 跟直接用 ChatGPT 或 Claude 上傳圖片有什麼不同?

A: 主要差在成本、隱私與可自訂程度。 通用聊天機器人確實也能讀圖,但一來有使用次數限制,二來資料會上傳到雲端,三來你無法針對特定單據格式做微調。TeleOCR 這類開源模型的優勢是可以本地跑、可以批次處理上千張圖、也可以針對你公司特有的單據格式做進一步訓練。如果你只是偶爾用一次,聊天機器人就很夠了;但如果你每個月要處理上百張單據,自己架一套絕對划算。