diff --git "a/app.py" "b/app.py" --- "a/app.py" +++ "b/app.py" @@ -1,8 +1,5 @@ -""" -Quran Aligner — Automatic Quran recitation segmentation and alignment. -""" +"""Quran Aligner — Automatic Quran recitation segmentation and alignment.""" import sys -import json from pathlib import Path # Add paths for imports BEFORE importing anything else @@ -17,3049 +14,7 @@ subprocess.run( capture_output=True, ) -import gradio as gr -import numpy as np -import librosa - -from config import ( - PORT, IS_HF_SPACE, - get_vad_duration, get_asr_duration, - MIN_SILENCE_MIN, MIN_SILENCE_MAX, MIN_SILENCE_STEP, - MIN_SPEECH_MIN, MIN_SPEECH_MAX, MIN_SPEECH_STEP, - PAD_MIN, PAD_MAX, PAD_STEP, - PRESET_MUJAWWAD, PRESET_MURATTAL, PRESET_FAST, - CONFIDENCE_HIGH, CONFIDENCE_MED, REVIEW_SUMMARY_MAX_SEGMENTS, - UNDERSEG_MIN_WORDS, UNDERSEG_MIN_AYAH_SPAN, UNDERSEG_MIN_DURATION, - QURAN_TEXT_SIZE_PX, ARABIC_WORD_SPACING, - SURAH_INFO_PATH, - PHONEME_ALIGNMENT_PROFILING, - RESAMPLE_TYPE, - SEGMENT_AUDIO_DIR, DELETE_CACHE_FREQUENCY, DELETE_CACHE_AGE, AUDIO_PRELOAD_COUNT, - ANIM_WORD_COLOR, ANIM_STYLE_ROW_SCALES, - ANIM_DISPLAY_MODES, ANIM_DISPLAY_MODE_DEFAULT, ANIM_OPACITY_PREV_DEFAULT, ANIM_OPACITY_AFTER_DEFAULT, ANIM_OPACITY_STEP, ANIM_PRESETS, - ANIM_GRANULARITIES, ANIM_GRANULARITY_DEFAULT, - ANIM_WINDOW_PREV_DEFAULT, ANIM_WINDOW_AFTER_DEFAULT, - ANIM_WINDOW_PREV_MIN, ANIM_WINDOW_PREV_MAX, - ANIM_WINDOW_AFTER_MIN, ANIM_WINDOW_AFTER_MAX, - MEGA_WORD_SPACING_MIN, MEGA_WORD_SPACING_MAX, MEGA_WORD_SPACING_STEP, MEGA_WORD_SPACING_DEFAULT, - MEGA_TEXT_SIZE_MIN, MEGA_TEXT_SIZE_MAX, MEGA_TEXT_SIZE_STEP, MEGA_TEXT_SIZE_DEFAULT, - MEGA_LINE_SPACING_MIN, MEGA_LINE_SPACING_MAX, MEGA_LINE_SPACING_STEP, MEGA_LINE_SPACING_DEFAULT, - MEGA_SURAH_LIGATURE_SIZE, - PROGRESS_PROCESS_AUDIO, PROGRESS_RESEGMENT, PROGRESS_RETRANSCRIBE, - LEFT_COLUMN_SCALE, RIGHT_COLUMN_SCALE, -) -from src.zero_gpu import gpu_with_fallback, ZERO_GPU_AVAILABLE -from src.segment_processor import ( - load_segmenter, - ensure_models_on_gpu, - detect_speech_segments, - run_phoneme_matching, - test_vad_aoti_export, - apply_aoti_compiled, - VadSegment, SegmentInfo, ProfilingData -) -from config import ANCHOR_SEGMENTS -from data.font_data import DIGITAL_KHATT_FONT_B64, SURAH_NAME_FONT_B64 -from src.ui.segments import ( - format_timestamp, get_confidence_class, get_segment_word_stats, - check_undersegmented, to_arabic_numeral, format_verse_marker, - split_into_char_groups, get_text_with_markers, simplify_ref, - render_segment_card, render_segments, encode_segment_audio, is_end_of_verse, -) -from src.pipeline.process import ( - process_audio, resegment_audio, retranscribe_audio, - _retranscribe_wrapper, process_audio_json, save_json_export, - test_aoti_compilation_gpu, -) -from src.mfa.timestamps import compute_mfa_timestamps - -# Load surah name ligature map -with open(Path(__file__).parent / "data" / "ligatures.json") as _f: - _SURAH_LIGATURES = json.load(_f) - - -# ============================================================================= -# Build Interface -# ============================================================================= - -def build_interface(): - """Build the Gradio interface.""" - - css = f""" - /* Font faces */ - @font-face {{ - font-family: 'DigitalKhatt'; - src: url(data:font/otf;base64,{DIGITAL_KHATT_FONT_B64}) format('opentype'); - font-weight: normal; - font-style: normal; - }} - @font-face {{ - font-family: 'SurahName'; - src: url(data:font/truetype;base64,{SURAH_NAME_FONT_B64}) format('truetype'); - font-weight: normal; - font-style: normal; - }} - - .arabic-text {{ - font-family: 'DigitalKhatt', 'Traditional Arabic', sans-serif; - direction: rtl; - text-align: right; - }} - - /* Prevent output area from being in a scrolling box */ - .gradio-container .prose {{ - max-height: none !important; - }} - .output-html {{ - max-height: none !important; - overflow: visible !important; - }} - - /* Segment cards - theme adaptive */ - .segment-card {{ - border-radius: 8px; - padding: 12px 16px; - margin-bottom: 12px; - border: 2px solid; - }} - .segment-header {{ - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 8px; - }} - .segment-title {{ - font-size: 13px; - opacity: 0.9; - }} - .segment-badges {{ - display: flex; - gap: 6px; - align-items: center; - }} - .segment-badge {{ - color: white; - padding: 2px 8px; - border-radius: 12px; - font-size: 12px; - font-weight: bold; - }} - .segment-audio {{ - margin: 8px 0; - display: flex; - align-items: center; - gap: 8px; - }} - .segment-audio audio {{ - flex: 1; - height: 32px; - border-radius: 4px; - }} - - /* Lazy play button (replaces