|
import gradio as gr |
|
import json |
|
import tempfile |
|
import os |
|
import difflib |
|
|
|
def compare_texts(correct_file, wrong_file): |
|
"""讀取並返回文件內容""" |
|
correct_text = correct_file.decode('utf-8') |
|
wrong_text = wrong_file.decode('utf-8') |
|
|
|
|
|
s = difflib.SequenceMatcher(None, wrong_text, correct_text) |
|
diff_positions = [] |
|
correct_text_with_positions = "" |
|
wrong_text_with_positions = "" |
|
wrong_ids = [] |
|
|
|
for i, (tag, i1, i2, j1, j2) in enumerate(s.get_opcodes()): |
|
if tag == "equal": |
|
correct_text_with_positions += correct_text[j1:j2] |
|
wrong_text_with_positions += wrong_text[i1:i2] |
|
else: |
|
correct_text_segment = correct_text[j1:j2] |
|
wrong_text_segment = wrong_text[i1:i2] |
|
|
|
wrong_ids.extend(range(i1, i2)) |
|
correct_text_with_positions += f"[{correct_text_segment}]" |
|
wrong_text_with_positions += f"[{wrong_text_segment}]" |
|
|
|
wrong_ids_str = ",".join(map(str, wrong_ids)) |
|
|
|
return correct_text_with_positions, wrong_text_with_positions, wrong_ids_str |
|
|
|
def generate_json(file_id, correct_text, wrong_text, wrong_ids): |
|
"""根據輸入生成 JSON 數據,並保存為文件""" |
|
wrong_ids_list = [int(x) for x in wrong_ids.split(',')] |
|
data = { |
|
"id": file_id, |
|
"original_text": wrong_text, |
|
"wrong_ids": wrong_ids_list, |
|
"correct_text": correct_text |
|
} |
|
json_data = json.dumps([data], ensure_ascii=False, indent=4) |
|
|
|
|
|
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".json", mode='w', encoding='utf-8') |
|
temp_file.write(json_data) |
|
temp_file.close() |
|
|
|
return json_data, temp_file.name |
|
|
|
with gr.Blocks() as demo: |
|
file_id_input = gr.Textbox(label="請輸入文件ID") |
|
|
|
correct_file = gr.File(label="上傳校正過的逐字稿文本文件", type="binary") |
|
wrong_file = gr.File(label="上傳未校正的ASR辨識文本文件", type="binary") |
|
|
|
compare_button = gr.Button("比較文本") |
|
correct_text_output = gr.TextArea(label="校正過的逐字稿文本內容") |
|
wrong_text_output = gr.TextArea(label="未校正的ASR辨識文本內容") |
|
wrong_ids_output = gr.Textbox(label="錯誤的文字位置") |
|
|
|
generate_button = gr.Button("生成 JSON 文件") |
|
json_output = gr.Text(label="JSON 輸出") |
|
json_download_link = gr.File(label="下載 JSON 文件") |
|
|
|
compare_button.click( |
|
compare_texts, |
|
inputs=[correct_file, wrong_file], |
|
outputs=[correct_text_output, wrong_text_output, wrong_ids_output] |
|
) |
|
generate_button.click( |
|
generate_json, |
|
inputs=[file_id_input, correct_text_output, wrong_text_output, wrong_ids_output], |
|
outputs=[json_output, json_download_link] |
|
) |
|
|
|
demo.launch() |