BrailleMenuGenV2 / models /braille_translator.py
Chamin09's picture
Update models/braille_translator.py
1653780 verified
from transformers import pipeline
import re
# English to Braille mapping (Grade 1 Braille) #
BRAILLE_MAP = {
'a': '⠁', 'b': '⠃', 'c': '⠉', 'd': '⠙', 'e': '⠑', 'f': '⠋', 'g': '⠛', 'h': '⠓', 'i': '⠊', 'j': '⠚',
'k': '⠅', 'l': '⠇', 'm': '⠍', 'n': '⠝', 'o': '⠕', 'p': '⠏', 'q': '⠟', 'r': '⠗', 's': '⠎', 't': '⠞',
'u': '⠥', 'v': '⠧', 'w': '⠺', 'x': '⠭', 'y': '⠽', 'z': '⠵',
'0': '⠚', '1': '⠁', '2': '⠃', '3': '⠉', '4': '⠙', '5': '⠑', '6': '⠋', '7': '⠛', '8': '⠓', '9': '⠊',
'.': '⠲', ',': '⠂', ';': '⠆', ':': '⠒', '!': '⠖', '?': '⠦', '"': '⠦', "'": '⠄', '(': '⠐⠣', ')': '⠐⠜',
'-': '⠤', '/': '⠌', '+': '⠬', '=': '⠐⠶', '*': '⠐⠔', '&': '⠯', '%': '⠐⠏', '#': '⠼', '@': '⠐⠁',
'$': '⠐⠎', '€': '⠐⠑', '£': '⠐⠇', '¥': '⠐⠽', '₹': '⠐⠗',
' ': '⠀'
}
# Initialize the summarization pipeline for context understanding
summarizer = None
def get_summarizer():
"""Get or initialize the summarization model."""
global summarizer
if summarizer is None:
try:
# Use a small, efficient model for summarization
summarizer = pipeline(
"summarization",
model="facebook/bart-large-cnn",
max_length=100,
min_length=30,
truncation=True
)
except Exception as e:
print(f"Error loading summarizer: {str(e)}")
return summarizer
def text_to_grade1_braille(text):
"""
Convert text to Grade 1 Braille.
Args:
text: Text to convert
Returns:
Braille text
"""
braille_text = ""
for char in text.lower():
if char in BRAILLE_MAP:
braille_text += BRAILLE_MAP[char]
else:
# For characters not in our map, just keep the original
braille_text += char
return braille_text
def text_to_braille(text, use_context=True):
"""
Convert text to Braille, with optional context enhancement.
Args:
text: Text to convert to Braille
use_context: Whether to use AI to enhance context understanding
Returns:
Dictionary with Braille text and metadata
"""
try:
# Basic Braille translation
braille_text = text_to_grade1_braille(text)
# Create an ASCII representation for PDF
ascii_braille = unicode_braille_to_ascii(braille_text)
# If context enhancement is enabled
context_summary = None
if use_context and len(text) > 200: # Only for longer texts
summarizer = get_summarizer()
if summarizer:
try:
# Generate a summary to understand context
summary_result = summarizer(text)
if summary_result and len(summary_result) > 0:
context_summary = summary_result[0]['summary_text']
except Exception as e:
print(f"Summarization error: {str(e)}")
# Format the Braille text for better readability
formatted_braille = format_braille_text(braille_text)
formatted_ascii = format_braille_text(ascii_braille)
return {
'braille_text': braille_text,
'formatted_braille': formatted_braille,
'ascii_braille': ascii_braille,
'formatted_ascii': formatted_ascii,
'context_summary': context_summary,
'success': True
}
except Exception as e:
return {
'braille_text': '',
'error': str(e),
'success': False
}
def unicode_braille_to_ascii(braille_text):
"""
Convert Unicode Braille to ASCII representation.
Args:
braille_text: Text with Unicode Braille characters
Returns:
ASCII representation of Braille
"""
# Map each Braille character to a descriptive ASCII representation
result = ""
for char in braille_text:
if char in BRAILLE_MAP.values():
# For Braille characters, use a letter representation
for letter, braille in BRAILLE_MAP.items():
if braille == char and len(letter) == 1:
result += f"[{letter.upper()}]"
break
else:
result += "[?]"
else:
# For non-Braille characters, keep them as is
result += char
return result
def text_to_braille1(text, use_context=True):
"""
Convert text to Braille, with optional context enhancement.
Args:
text: Text to convert to Braille
use_context: Whether to use AI to enhance context understanding
Returns:
Dictionary with Braille text and metadata
"""
try:
# Basic Braille translation
braille_text = text_to_grade1_braille(text)
# If context enhancement is enabled
context_summary = None
if use_context and len(text) > 200: # Only for longer texts
summarizer = get_summarizer()
if summarizer:
try:
# Generate a summary to understand context
summary_result = summarizer(text)
if summary_result and len(summary_result) > 0:
context_summary = summary_result[0]['summary_text']
except Exception as e:
print(f"Summarization error: {str(e)}")
# Format the Braille text for better readability
formatted_braille = format_braille_text(braille_text)
return {
'braille_text': braille_text,
'formatted_braille': formatted_braille,
'context_summary': context_summary,
'success': True
}
except Exception as e:
return {
'braille_text': '',
'error': str(e),
'success': False
}
def format_braille_text(braille_text, line_length=32):
"""
Format Braille text for better readability.
Args:
braille_text: Raw Braille text
line_length: Maximum characters per line
Returns:
Formatted Braille text
"""
# Split text by existing newlines first
paragraphs = braille_text.split('\n')
formatted_paragraphs = []
for paragraph in paragraphs:
# Skip empty paragraphs
if not paragraph.strip():
formatted_paragraphs.append('')
continue
# Word wrap to line_length
words = paragraph.split(' ')
lines = []
current_line = []
current_length = 0
for word in words:
# If adding this word exceeds line length, start a new line
if current_length + len(word) + (1 if current_length > 0 else 0) > line_length:
lines.append(' '.join(current_line))
current_line = [word]
current_length = len(word)
else:
if current_length > 0:
current_length += 1 # Space
current_line.append(word)
current_length += len(word)
# Add the last line if not empty
if current_line:
lines.append(' '.join(current_line))
formatted_paragraphs.append('\n'.join(lines))
# Join paragraphs with double newlines
return '\n\n'.join(formatted_paragraphs)
def get_braille_metadata(text):
"""
Get metadata about the Braille translation.
Args:
text: Original text
Returns:
Dictionary with metadata
"""
word_count = len(re.findall(r'\b\w+\b', text))
character_count = len(text)
line_count = len(text.split('\n'))
return {
'word_count': word_count,
'character_count': character_count,
'line_count': line_count
}