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)}")