OCR ภาษาไทยสำหรับงานจดหมายเหตุและการแปลงเอกสารเป็นดิจิทัล
เปลี่ยนไฟล์สแกนหนังสือ วารสาร และทะเบียนภาษาไทยให้เป็นข้อความที่ค้นหาได้ทีละหน้า คลังเอกสารจึงเลิกเป็นแค่โฟลเดอร์รูปภาพ
ผลลัพธ์ที่ได้กลับมา
## บทที่ ๔ การค้าทางเรือ
ในสมัยนั้นเรือสำเภาจากเมืองจีนเข้ามาจอดที่ปากน้ำ
เป็นประจำทุกฤดูลมมรสุม บรรทุกสินค้าจำพวกผ้าไหม
เครื่องถ้วยชาม และเครื่องเทศ
> เชิงอรรถ ๑ ดูรายละเอียดในบทที่ ๗หัวข้อ เนื้อความ และเชิงอรรถยังแยกจากกัน โครงสร้างของบทจึงติดไปกับข้อความที่นำไปเก็บต่อ
# ข่าวประจำสัปดาห์
## การประชุมสภา
ที่ประชุมมีมติรับหลักการในวาระที่หนึ่ง
## ราคาสินค้าเกษตร
| สินค้า | ราคา/ตัน |
| --- | ---: |
| ข้าวเปลือก | ๙,๘๐๐ |คอลัมน์ถูกอ่านตามลำดับการอ่านจริง ไล่จบทีละคอลัมน์ และตารางราคายังคงเป็นตาราง
heading ทะเบียนรับหนังสือ พ.ศ. ๒๕๐๘
table 28 rows x 5 columns
paragraph หมายเหตุ เล่มที่ ๓ ต่อจากเล่มที่ ๒สมุดทะเบียนที่ตีเส้นกลับมาเป็นตารางโดยแถวยังครบ ซึ่งเป็นสิ่งที่ทำให้ทะเบียนทั้งชุดคุ้มค่าแก่การทำดัชนี
ผลการอ่านด้านบนเป็นตัวอย่างของรูปแบบผลลัพธ์ ไม่ได้บันทึกมาจากโมเดลจริง หน้า OCR มีผลการอ่านตัวอย่างจริงของโมเดลพร้อมวันที่บันทึกกำกับไว้
ขั้นตอนการทำงานหนึ่งชุด
คลังเอกสารที่แปลงเป็นดิจิทัลแล้วจำนวนมากยังทำได้เพียงครึ่งทาง หน้ากระดาษถูกถ่ายภาพไว้ ไฟล์อยู่ในที่ปลอดภัย แต่ไม่มีคำใดเลยที่ค้นหาเจอ สิ่งที่ขาดไปคือขั้นตอนการอ่าน และสำหรับภาษาไทยนี่คือขั้นตอนที่หาซื้อได้ยากที่สุดมาตลอด เพราะไฟล์สแกนหน้าเอกสารไทยรุ่นเก่ามีทั้งอักษรที่ซ้อนกันในแนวตั้ง แบบตัวอักษรที่แยกจากกันด้วยหัวซึ่งการทำสำเนาทำให้เลือนหาย และไม่มีการเว้นวรรคระหว่างคำมาช่วยผู้อ่านกู้ความหมายกลับมา
ส่งเป็นชุดของหน้า
แบ่งหนังสือแต่ละเล่มเป็นคำขอละไม่เกิน 50 หน้า และ 10 MB ผลลัพธ์ยังแยกตามหน้า ชุดหนึ่งจึงประกอบกลับเข้าที่ตามลำดับได้
เก็บไฟล์ภาพไว้
ผลการอ่านคือชั้นข้อความที่วางคู่กับไฟล์สแกน และไฟล์สแกนยังอยู่ที่เดิม การอนุรักษ์ยังอยู่ที่ไฟล์ภาพ ส่วนการค้นหา การอ้างอิง และการนำไปใช้ต่อ ย้ายมาอยู่ที่ข้อความ
อ่านซ้ำได้เมื่อโมเดลดีขึ้น
เพราะคิดค่าบริการตามจำนวนหน้าและไม่มียอดขั้นต่ำนอกเหนือจากหนึ่งหน้า การอ่านคลังเอกสารรอบที่สองจึงมีค่าใช้จ่ายเท่ารอบแรก งานหนึ่งชุดจึงทำซ้ำได้ทุกเมื่อ
ค่าใช้จ่ายของงานแปลงเอกสารหนึ่งชุด
| ปริมาณงาน | จำนวนหน้า | ค่าใช้จ่าย |
|---|---|---|
| หนังสือหนึ่งเล่ม (320 หน้า) | 320 | $2.08 |
| หนึ่งคำขอเต็มเพดาน 50 หน้า | 50 | $0.33 |
| งานหนึ่งชุด 50 เล่ม | ประมาณ $104 | |
ที่อัตราหน้าละ 6.5 เครดิต การคิดเงินเป็นเส้นตรง งานหนึ่งชุดจึงตั้งงบจากจำนวนหน้าได้ก่อนส่งงานแม้แต่หน้าเดียว
สิ่งที่การทำสำเนาพรากไป
ฅ ค ต ศ ด ผู้อ่าน 35 คน ดูตัวอักษรผ่านภาพมัว และแยกอักษรกลุ่มนี้จากกันไม่ออก สิ่งที่ใช้แยกพวกมันคือหัวอักษร และฟอนต์ไม่มีหัวก็ครองงานพิมพ์ไทยยุคปัจจุบัน
นี่คือผลการศึกษาเรื่องการอ่านออกของมนุษย์ จากงานวิจัยที่ผ่านการตรวจทานซึ่งทดสอบกับตัวอักษรเดี่ยว ที่ยกมาเพราะระบุลักษณะที่ไฟล์สแกนของหน้าเอกสารเก่าสูญเสียไปก่อนเป็นอย่างแรก และไม่ได้กล่าวถึงอัตราความผิดพลาดของระบบ OCR ใด
สำหรับนักพัฒนา
หนึ่งคำขอต่อหนึ่งชุดของหน้า ผลลัพธ์แยกตามหน้า หนังสือหนึ่งเล่มจึงประกอบกลับตามลำดับได้โดยไม่ต้องจดบันทึกเพิ่มเอง
เอกสารอ้างอิง API ฉบับเต็ม# 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 เครดิตกับข้อความของคุณเอง
บทความที่เกี่ยวข้อง