2024年6月30日 星期日

一鍵完成圖檔OCR辦識,免除打字處理

情境:YOUTUBE上有許多優秀的日文老師的提供考題解析或文法解析,不過有時仍想再藉助AI神器分析解題或文法,只是部分YT,並未提供SRT字幕SubRip subtitle file,可以免去打字處理,此時就需透過手動截圖方式(PNG、JPEG),貼到小畫家後,另存成圖檔,再轉交由OCR辨識軟體將日文辨識出來,進行解題,過程有些繁瑣。

解決辦法:
透過PYTHON程式,將下面程式另存成png2txt.jp編譯成png2txt.EXE執行檔後,直接於截圖後,使用下面之步驟二方式,一鍵完成日文OCR辨識處理。
由系統快取資訊,取得剛才截圖資訊,直接提供給OCR辨識軟體(Tesseract )轉換成純文字,最後將它交給AI神器進行解題即可 (無需另外開啟小畫家,存檔覆寫等處理)


💜操作步驟一(截圖處理): Shift + Win + S 快速鍵,區塊截取圖片轉換為日文TXT純文字,ScreenShot圖檔即可用PYTHON程式直接取用 CACHE記憶體內之截圖資訊
💜步驟二:點選執行,預先編譯好之png2txt.EXE執行檔,即可一鍵完成日文OCR辦識處理。
💜步驟三:複製剛辨識完成之TXT檔,貼至AI神器💯上去詢問日文考題解析或文法解析。


相關資源:
YOUTUBE字幕下載
OCR辨識軟體🔣(圖檔轉文字jpg2txt)Tesseract
🏯AI神器解析日文考題或句子結構

Mac 上的 Shift + Command + 4 組合鍵,類似 Windows 上的 Win + Shift + S,可方便地選擇性截取螢幕的一部分。


# -*- coding: utf-8 -*-
'''
python取圖檔,辨識日文考題
'''
import os
import subprocess
import sys
from PIL import Image, ImageGrab
import pytesseract

def save_clipboard_image(filename='screenshot.png'):
    try:
        # 獲取剪貼簿中的圖像
        image = ImageGrab.grabclipboard()

        if image is None:
            print("剪貼簿中沒有圖像資料")
            return

        # 保存圖像為PNG格式,覆蓋同名文件
        image.save(filename, 'PNG')
        print(f"圖像已保存為 {filename}")

    except Exception as e:
        print(f"無法保存圖像: {e}", file=sys.stderr)

def ocr_image_to_text(image_path):
    # 檢查檔案是否存在
    if not os.path.exists(image_path):
        print(f"Error: File not found - {image_path}")
        return

    # 修改為您的 Tesseract 安裝路徑
    pytesseract.pytesseract.tesseract_cmd = 'd:/Program Files/Tesseract-OCR/tesseract.exe'

    img = Image.open(image_path)
    text = pytesseract.image_to_string(img, lang='jpn')  # 辨識日文考題

    # 輸出檔案名稱根據輸入檔案修改
    output_file = os.path.splitext(image_path)[0] + '.txt'
    with open(output_file, mode='w', encoding='UTF-8') as f:
        f.write(text)

    print(f"OCR結果已保存為 {output_file}")
    subprocess.Popen(['explorer', output_file])  # 使用 list 形式傳遞參數

if __name__ == "__main__":
    image_filename = 'D:\Program Files\Tesseract-OCR\screenshot.png'
   
save_clipboard_image(image_filename)
    ocr_image_to_text(image_filename)

 

 ###################################################

#以下為進階python版本之 一鍵完成圖檔OCR辨識: (直接將prompt日文提示詞,併入掃描ocr辨識結果,結合起來後,直接自動化用檔案總管開啟 d:\testjlpt.txt')

# input_file1內容,如下:

あなたは日本語のプロで、国語の問題を解きの達人です。

{{問題文}}は1~4の中から最も適切なものを一つ選んでください。

(中略)

"""
問題文:

 

# input_file2內容為     """  
#為何要另外加入
input_file2.txt ,是為了將 4選1選項問答PROMPT提問文:  +OCR辨識之TXT結果後,再補上 """ (三重引用符號),讓AI能夠將它視為整段完整之PROMPT提問文  (亦即,前段日文詢問之PROMPT + OCR辨識後之TXT +最後再補上  三重引用符號)

# output_file內容為  d:\testjlpt.txt'   

 

import os
import subprocess
from PIL import Image, ImageGrab
import pytesseract

def save_clipboard_image(filename='screenshot.png'):
    """保存剪貼簿中的圖像。"""
    image = ImageGrab.grabclipboard()
    if image:
        image.save(filename, 'PNG')
        print(f"圖像已保存為 {filename}")
        return filename
    else:
        print("剪貼簿中沒有圖像資料")
        return None


def ocr_image_to_text(image_path, lang='jpn'):
    """使用 Tesseract OCR 對圖像進行文字辨識。"""
    if not os.path.exists(image_path):
        print(f"Error: File not found - {image_path}")
        return None

    pytesseract.pytesseract.tesseract_cmd = r'D:/Program Files/Tesseract-OCR/tesseract.exe'
    return pytesseract.image_to_string(Image.open(image_path), lang=lang)


def append_file_content_in_order(input_file1, input_file2, content_to_append, output_file):
    """將指定內容和兩個檔案的內容按照指定順序追加到檔案末尾。"""
    try:
        with open(output_file, 'w', encoding='utf-8') as f_out, \
                open(input_file1, 'r', encoding='utf-8') as f_in1, \
                open(input_file2, 'r', encoding='utf-8') as f_in2:

            f_out.write(f_in1.read())  # 先
入 input_file1 内容 (00)
            f_out.write("\n\n" + content_to_append)  # 再
入 OCR 
            f_out.write("\n\n" + f_in2.read())  # 最后
入 input_file2 内容 (01)

        print(f"已成功將結果寫入 {output_file}")

    except FileNotFoundError as e:
        print(f"Error: 檔案不存在 - {e.filename}")
    except Exception as e:
        print(f"Error: 發生錯誤 - {e}")


if __name__ == "__main__":
    image_filename = r'D:\Program Files\Tesseract-OCR\screenshot.png'
    input_file1 = r'd:\testjlpt00.txt'
    input_file2 = r'd:\testjlpt01.txt'
    output_file = r'd:\testjlpt.txt'

    saved_image_path = save_clipboard_image(image_filename)
    if saved_image_path:
        ocr_text = ocr_image_to_text(saved_image_path)

        if ocr_text:
            append_file_content_in_order(input_file1, input_file2, ocr_text, output_file)

            print(f"OCR結果已保存為 {output_file}")
            subprocess.Popen(['explorer', output_file])