OCR ภาษาไทยสำหรับงานจดหมายเหตุและการแปลงเอกสารเป็นดิจิทัล
เปลี่ยนไฟล์สแกนหนังสือ วารสาร และทะเบียนภาษาไทยให้เป็นข้อความที่ค้นหาได้ทีละหน้า คลังเอกสารจึงไม่ใช่แค่โฟลเดอร์รูปภาพอีกต่อไป
ผลลัพธ์ที่ได้กลับมา
## บทที่ ๔ การค้าทางเรือ
ในสมัยนั้นเรือสำเภาจากเมืองจีนเข้ามาจอดที่ปากน้ำ
เป็นประจำทุกฤดูลมมรสุม บรรทุกสินค้าจำพวกผ้าไหม
เครื่องถ้วยชาม และเครื่องเทศ
> เชิงอรรถ ๑ ดูรายละเอียดในบทที่ ๗# ข่าวประจำสัปดาห์
## การประชุมสภา
ที่ประชุมมีมติรับหลักการในวาระที่หนึ่ง
## ราคาสินค้าเกษตร
| สินค้า | ราคา/ตัน |
| --- | ---: |
| ข้าวเปลือก | ๙,๘๐๐ |heading ทะเบียนรับหนังสือ พ.ศ. ๒๕๐๘
table 28 rows x 5 columns
paragraph หมายเหตุ เล่มที่ ๓ ต่อจากเล่มที่ ๒ผลการอ่านด้านบนเป็นตัวอย่างของรูปแบบผลลัพธ์ ไม่ใช่คำตอบที่บันทึกมาจริง หน้า OCR มีผลการอ่านตัวอย่างจริงของโมเดลพร้อมวันที่บันทึกกำกับไว้
ขั้นตอนการทำงานหนึ่งชุด
คลังเอกสารที่แปลงเป็นดิจิทัลแล้วจำนวนมากยังทำได้เพียงครึ่งทาง หน้ากระดาษถูกถ่ายภาพไว้ ไฟล์อยู่ในที่ปลอดภัย แต่ไม่มีคำใดเลยที่ค้นหาเจอ สิ่งที่ขาดไปคือขั้นตอนการอ่าน และสำหรับภาษาไทยนี่คือขั้นตอนที่หาซื้อได้ยากที่สุดมาตลอด เพราะไฟล์สแกนหน้าเอกสารไทยรุ่นเก่ามีทั้งอักษรที่ซ้อนกันในแนวตั้ง แบบตัวอักษรที่แยกจากกันด้วยหัวซึ่งการทำสำเนาทำให้เลือนหาย และไม่มีการเว้นวรรคระหว่างคำมาช่วยผู้อ่านกู้ความหมายกลับมา
ที่มา:ADR (2017)(opens in a new tab)
- ส่งเป็นชุดของหน้าแบ่งหนังสือแต่ละเล่มเป็นคำขอละไม่เกิน 50 หน้า และ 10 MB ผลลัพธ์ยังแยกตามหน้า ชุดหนึ่งจึงประกอบกลับเข้าที่ตามลำดับได้
- เก็บไฟล์ภาพไว้ผลการอ่านคือชั้นข้อความที่วางคู่กับไฟล์สแกน ไม่ใช่สิ่งที่มาแทนที่ การอนุรักษ์ยังอยู่ที่ไฟล์ภาพ ส่วนการค้นหา การอ้างอิง และการนำไปใช้ต่อ ย้ายมาอยู่ที่ข้อความ
- อ่านซ้ำได้เมื่อโมเดลดีขึ้นเพราะคิดค่าบริการตามจำนวนหน้าและไม่มียอดขั้นต่ำนอกเหนือจากหนึ่งหน้า การอ่านคลังเอกสารรอบที่สองจึงมีค่าใช้จ่ายเท่ารอบแรก งานหนึ่งชุดจึงทำซ้ำได้ ไม่ใช่ทำครั้งเดียวจบ
ค่าใช้จ่ายของงานแปลงเอกสารหนึ่งชุด
| ปริมาณงาน | จำนวนหน้า | เครดิต |
|---|---|---|
| หนังสือหนึ่งเล่ม (320 หน้า) | 320 | 2,080 |
| หนึ่งคำขอเต็มเพดาน 50 หน้า | 50 | 325 |
| งานหนึ่งชุด 50 เล่ม | 104,000 เครดิต | |
ที่อัตราหน้าละ 6.5 เครดิต การคิดเงินเป็นเส้นตรง งานหนึ่งชุดจึงตั้งงบจากจำนวนหน้าได้ก่อนส่งงานแม้แต่หน้าเดียว
สิ่งที่การทำสำเนาพรากไป
ฅ ค ต ศ ด ผู้อ่าน 35 คน ดูตัวอักษรผ่านภาพมัว และแยกอักษรกลุ่มนี้จากกันไม่ออก สิ่งที่ใช้แยกพวกมันคือหัวอักษร และฟอนต์ไม่มีหัวก็ครองงานพิมพ์ไทยยุคปัจจุบัน
นี่คือผลการศึกษาเรื่องการอ่านออกของมนุษย์ จากงานวิจัยที่ผ่านการตรวจทานซึ่งทดสอบกับตัวอักษรเดี่ยว ที่ยกมาเพราะระบุลักษณะที่ไฟล์สแกนของหน้าเอกสารเก่าสูญเสียไปก่อนเป็นอย่างแรก ไม่ใช่เพื่ออ้างอัตราความผิดพลาดของระบบ OCR ใด
สำหรับนักพัฒนา
หนึ่งคำขอต่อหนึ่งชุดของหน้า ผลลัพธ์แยกตามหน้า หนังสือหนึ่งเล่มจึงประกอบกลับตามลำดับได้โดยไม่ต้องจดบันทึกเพิ่มเอง
# Encode without line wrapping: wrapped base64 breaks the JSON string.
DOC=$(base64 < invoice.pdf | tr -d '\n')
# --max-time covers a multi-page document; curl defaults to no limit.
curl -X POST https://api.paxalabs.com/v1/ocr \
--max-time 300 \
-H "Authorization: Bearer $PAXA_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"document\": \"$DOC\", \"model\": \"paxa-ocr-lite-v1\"}"import base64
import os
import requests
with open("invoice.pdf", "rb") as file:
document = base64.b64encode(file.read()).decode()
response = requests.post(
"https://api.paxalabs.com/v1/ocr",
headers={"Authorization": f"Bearer {os.environ['PAXA_API_KEY']}"},
json={"document": document, "model": "paxa-ocr-lite-v1"},
# A multi-page document can run for minutes; give it room.
timeout=300,
)
response.raise_for_status()
body = response.json()
print(body["pages"][0]["markdown"], body["usage"]["credits"], "credits")import { readFile } from "node:fs/promises";
const document = (await readFile("invoice.pdf")).toString("base64");
const response = await fetch("https://api.paxalabs.com/v1/ocr", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.PAXA_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ document, model: "paxa-ocr-lite-v1" }),
// A multi-page document can run for minutes; give it room.
signal: AbortSignal.timeout(300_000),
});
if (!response.ok) throw new Error(`OCR failed: ${response.status}`);
const { pages, usage } = await response.json();
console.log(pages[0].markdown, `${usage.credits} credits`);หัวอักษรคือสิ่งที่ไฟล์สแกนสูญเสียไปก่อนเป็นอย่างแรก
อักษรไทยหลายตัวต่างกันหลัก ๆ ที่หัวเล็ก ๆ ตรงจุดเริ่ม และงานพิมพ์ไทยยุคปัจจุบันส่วนใหญ่ใช้ฟอนต์ที่ตัดหัวออกไปแล้ว ในการทดสอบการอ่านออกที่ผ่านการตรวจทาน ผู้อ่าน 35 คนที่เห็นตัวอักษรผ่านภาพมัวแยกอักษรกลุ่มนั้นจากกันไม่ออกเลย ไฟล์สแกนเอกสารเก่าก็คือการทดลองเดียวกันที่เกิดขึ้นโดยบังเอิญ ทั้งกระดาษที่เสื่อมสภาพ หมึกที่ไม่สมบูรณ์ และภาพถ่ายของทั้งสองอย่างนั้น นี่คือเหตุผลว่าทำไมโมเดลอ่านภาษาไทยต้องสร้างขึ้นรอบตัวอักษรไทยตั้งแต่ต้น ไม่ใช่ดัดแปลงเอาทีหลัง
คำถามที่พบบ่อย
- อ่านงานพิมพ์เก่าหรือภาพที่เสื่อมคุณภาพได้ดีแค่ไหน
- เราไม่เผยแพร่ตัวเลขความแม่นยำ ไม่ว่าจะเป็นงานพิมพ์เก่าหรือใหม่ และจะยังไม่เผยแพร่จนกว่าแล็บจะเผยแพร่ผลการประเมินของตัวเอง ขอแนะนำให้ส่งตัวอย่างหน้าที่สภาพแย่ที่สุดของคุณผ่านเครดิตฟรี แล้วตัดสินจากเอกสารที่คุณถืออยู่จริง
- รองรับหน้าที่จัดหลายคอลัมน์ไหม
- รองรับ การอ่านจะไล่ตามลำดับการอ่านจริง ไม่ใช่กวาดตรงข้ามหน้ากระดาษ วารสารสองคอลัมน์จึงไม่กลับมาแบบสลับบรรทัดกัน
- อ่านคลังเอกสารซ้ำอีกรอบภายหลังได้ไหม
- ได้ และค่าใช้จ่ายเท่าเดิม เพราะคิดตามจำนวนหน้าและไม่มียอดขั้นต่ำต่อคำขอนอกเหนือจากหนึ่งหน้า การอ่านหนังสือชุดเดิมรอบที่สองจึงคิดราคาเท่ากับรอบแรก
- เอกสารเก่าที่เป็นลายมือล่ะ
- หน้าที่เป็นงานพิมพ์คือกรณีที่ระบบทำได้ดีที่สุด ส่วนเอกสารลายมือแตกต่างกันมากทั้งตามลายมือและตามยุคสมัย จึงควรถือเป็นสิ่งที่ต้องทดสอบก่อน ไม่ใช่สิ่งที่สันนิษฐานไว้ล่วงหน้า
เริ่มต้นด้วยเครดิตฟรี
เข้าสู่ระบบด้วย Google, GitHub หรือ Hugging Face แล้วใช้เครดิตฟรี 100 เครดิตกับข้อความของคุณเอง