Spaces:
Sleeping
Sleeping
| 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 | |
| } | |