File size: 3,299 Bytes
4ce49c4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8f3c067
4ce49c4
8f3c067
4ce49c4
8f3c067
 
4ce49c4
91e586d
 
 
4ce49c4
8f3c067
91e586d
4ce49c4
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""PDF processing functionality."""

import gradio as gr
from .pdf_text_extractor import PDFTextExtractor


class PDFProcessor:
    """Handles PDF processing operations."""
    
    def __init__(self):
        self.extractor = PDFTextExtractor()
    
    def process_pdf(self, pdf_file):
        """Process PDF and extract text, then explanations, then audio, updating UI at each step."""
        if pdf_file is None:
            yield "", "No PDF uploaded", "", None, gr.update(visible=False)
            return
        
        try:
            # Step 1: Extract text
            # Show "Extracting text..." message
            yield "", gr.update(value="Extracting text..."), "", None, gr.update(visible=False)
            extracted_text, status, images_data = self.extractor.extract_text_from_pdf(pdf_file)
            
            if not extracted_text or extracted_text.strip() == "":
                yield extracted_text, status, "No text available to explain.", None, gr.update(visible=False)
                return
            
            # Show extracted text immediately, explanations/audio loading
            yield extracted_text, status, gr.update(value="Generating explanations..."), None, gr.update(visible=False)
            
            # Step 2: Generate explanations
            try:
                explanations = self.extractor.generate_explanations(extracted_text)
                
                # Show explanations immediately, update status for audio loading
                yield extracted_text, gr.update(value="Generating audio..."), explanations, None, gr.update(visible=False)                # Step 3: Generate audio
                try:
                    from .simple_audio_processor import SimpleAudioProcessor
                    
                    # Create simplified audio processor
                    audio_processor = SimpleAudioProcessor()
                    
                    # Generate progress callback for audio processing
                    def audio_progress(progress, desc=""):
                        yield extracted_text, gr.update(value=f"Generating audio: {desc}"), explanations, None, gr.update(visible=False)
                    
                    # Generate audio using the simplified processor
                    audio_result, _ = audio_processor.generate_audio(explanations, progress=audio_progress)
                    
                    # Show everything, update status to complete
                    yield extracted_text, gr.update(value="All steps complete!"), explanations, audio_result, gr.update(visible=True)
                    
                except Exception as audio_error:
                    # Show explanations, update status with audio error
                    yield extracted_text, gr.update(value=f"Audio generation failed: {str(audio_error)}"), explanations, None, gr.update(visible=False)
                    
            except Exception as explanation_error:
                # Show extracted text, but indicate explanation error
                yield extracted_text, status, f"Error generating explanations: {str(explanation_error)}", None, gr.update(visible=False)
            
        except Exception as e:
            yield "", f"Error processing PDF: {str(e)}", "", None, gr.update(visible=False)