Spaces:
Runtime error
Runtime error
File size: 6,932 Bytes
87d0988 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
import streamlit as st
from PIL import Image
import io
import numpy as np
# Import our custom modules
from utils.image_preprocessing import preprocess_image
from models.document_ai import extract_text_and_layout
from models.text_processor import process_menu_text
from models.braille_translator import text_to_braille, get_braille_metadata
from utils.braille_display import create_braille_html, create_braille_comparison
# App title and description
st.title("Menu to Braille Converter")
st.write("Upload a menu image to convert it to Braille text")
# Sidebar for model settings
st.sidebar.header("Settings")
use_llm = st.sidebar.checkbox("Use LLM for text processing", value=True)
use_context = st.sidebar.checkbox("Use AI for context enhancement", value=True)
show_comparison = st.sidebar.checkbox("Show text/Braille comparison", value=True)
# Add information about the application
st.sidebar.markdown("---")
st.sidebar.subheader("About")
st.sidebar.info(
"This application converts menu images to Braille text using AI. "
"It extracts text from images using document AI, processes the text with LLMs, "
"and converts to Braille."
)
# File uploader
uploaded_file = st.file_uploader("Choose a menu image...", type=["jpg", "jpeg", "png"])
# Display uploaded image and process it
if uploaded_file is not None:
# Load and display image
image = Image.open(uploaded_file)
st.image(image, caption="Uploaded Menu", use_column_width=True)
# Add a button to process the image
if st.button("Process Menu"):
with st.spinner("Processing image..."):
# Preprocess the image
preprocessed_img = preprocess_image(image)
# Extract text using LayoutLMv2
try:
result = extract_text_and_layout(preprocessed_img)
# Display extracted words
if result['words']:
raw_text = ' '.join(result['words'])
# Show raw text in an expandable section
with st.expander("Raw Extracted Text"):
st.text_area("Raw OCR Output", raw_text, height=150)
# Process text with LLM if enabled
if use_llm:
st.subheader("Processed Menu Text")
with st.spinner("Enhancing text with AI..."):
processed_result = process_menu_text(raw_text)
if processed_result['success']:
processed_text = processed_result['structured_text']
st.text_area("Structured Menu Text", processed_text, height=200)
# Store the processed result for later use
st.session_state.processed_text = processed_text
st.session_state.menu_data = processed_result.get('menu_data', {})
else:
st.warning(f"AI processing failed: {processed_result.get('error', 'Unknown error')}")
processed_text = raw_text
st.text_area("Text Output", processed_text, height=200)
st.session_state.processed_text = processed_text
else:
# Just use the raw text
st.subheader("Extracted Text")
processed_text = raw_text
st.text_area("Text Output", processed_text, height=200)
st.session_state.processed_text = processed_text
# Translate to Braille
st.subheader("Braille Translation")
with st.spinner("Translating to Braille..."):
braille_result = text_to_braille(processed_text, use_context=use_context)
if braille_result['success']:
# Store for download
st.session_state.braille_text = braille_result['formatted_braille']
# Display options
display_option = st.radio(
"Display format:",
["Text Only", "Visual Braille", "Side-by-Side Comparison"]
)
if display_option == "Text Only":
# Display Braille text as plain text
st.text_area("Braille Output", braille_result['formatted_braille'], height=300)
elif display_option == "Visual Braille":
# Display Braille with visual representation
braille_html = create_braille_html(braille_result['formatted_braille'])
st.markdown(braille_html, unsafe_allow_html=True)
else: # Side-by-Side Comparison
# Display side-by-side comparison
comparison_html = create_braille_comparison(
processed_text, braille_result['formatted_braille']
)
st.markdown(comparison_html, unsafe_allow_html=True)
# Display metadata
metadata = get_braille_metadata(processed_text)
st.info(f"Translation contains {metadata['word_count']} words, "
f"{metadata['character_count']} characters, "
f"{metadata['line_count']} lines.")
# Show context summary if available
if braille_result.get('context_summary'):
with st.expander("AI Context Understanding"):
st.write(braille_result['context_summary'])
else:
st.error(f"Braille translation failed: {braille_result.get('error', 'Unknown error')}")
# Download options placeholder
st.subheader("Download Options")
st.info("PDF download will be implemented in Phase 5")
else:
st.warning("No text was extracted from the image.")
except Exception as e:
st.error(f"Error processing image: {str(e)}")
|