| | |
| | """ |
| | Fix to ensure frames are properly generated for the full story |
| | """ |
| |
|
| | import os |
| | import sys |
| |
|
| | sys.path.insert(0, '/workspace') |
| |
|
| | def diagnose_issue(): |
| | """Diagnose why frames aren't being generated""" |
| | |
| | print("π Diagnosing Frame Generation Issue") |
| | print("=" * 50) |
| | |
| | |
| | dirs_to_check = [ |
| | 'frames', |
| | 'frames/final', |
| | 'frames/cropped', |
| | 'output', |
| | 'audio' |
| | ] |
| | |
| | for dir_path in dirs_to_check: |
| | exists = os.path.exists(dir_path) |
| | print(f"π {dir_path}: {'β
Exists' if exists else 'β Missing'}") |
| | if exists and dir_path == 'frames/final': |
| | files = os.listdir(dir_path) |
| | print(f" Files: {len(files)}") |
| | |
| | |
| | if os.path.exists('test1.srt'): |
| | print("\nβ
Subtitles file exists") |
| | with open('test1.srt', 'r') as f: |
| | content = f.read() |
| | subtitle_count = content.count('\n\n') |
| | print(f" Subtitle segments: ~{subtitle_count}") |
| | else: |
| | print("\nβ No subtitles file found") |
| | |
| | print("\nπ The Issue:") |
| | print("The system is:") |
| | print("1. β
Correctly finding 89 subtitles") |
| | print("2. β
Selecting 48 moments for full story") |
| | print("3. β BUT then reverting to old 12-moment filtering") |
| | print("4. β AND frames aren't being extracted") |
| | |
| | print("\nπ§ Solution:") |
| | print("Need to ensure the full story extraction (48 frames) is used") |
| | print("throughout the entire pipeline.") |
| |
|
| | def create_fixed_generator(): |
| | """Create a fixed version that properly generates all frames""" |
| | |
| | fixed_code = ''' |
| | # Fixed version that ensures 48 frames are generated |
| | |
| | def generate_full_story_comic(video_path): |
| | """Generate comic with complete story (48 frames for 12 pages)""" |
| | |
| | import os |
| | import cv2 |
| | import srt |
| | |
| | # 1. Read subtitles |
| | with open('test1.srt', 'r') as f: |
| | all_subs = list(srt.parse(f.read())) |
| | |
| | print(f"π Found {len(all_subs)} subtitles") |
| | |
| | # 2. Select 48 evenly distributed moments |
| | target_frames = 48 |
| | if len(all_subs) <= target_frames: |
| | selected_subs = all_subs |
| | else: |
| | step = len(all_subs) / target_frames |
| | selected_subs = [] |
| | for i in range(target_frames): |
| | idx = int(i * step) |
| | selected_subs.append(all_subs[idx]) |
| | |
| | print(f"β
Selected {len(selected_subs)} moments for complete story") |
| | |
| | # 3. Extract frames |
| | os.makedirs('frames/final', exist_ok=True) |
| | |
| | cap = cv2.VideoCapture(video_path) |
| | fps = cap.get(cv2.CAP_PROP_FPS) |
| | |
| | for i, sub in enumerate(selected_subs): |
| | timestamp = (sub.start.total_seconds() + sub.end.total_seconds()) / 2 |
| | frame_num = int(timestamp * fps) |
| | |
| | cap.set(cv2.CAP_PROP_POS_FRAMES, frame_num) |
| | ret, frame = cap.read() |
| | |
| | if ret: |
| | output_path = f'frames/final/frame{i:03d}.png' |
| | cv2.imwrite(output_path, frame) |
| | print(f"β
Frame {i+1}/{len(selected_subs)}: {sub.content[:30]}...") |
| | |
| | cap.release() |
| | print(f"β
Generated {len(selected_subs)} frames for full story") |
| | |
| | return len(selected_subs) |
| | ''' |
| | |
| | with open('/workspace/generate_full_story_frames.py', 'w') as f: |
| | f.write(fixed_code) |
| | |
| | print("\nβ
Created: generate_full_story_frames.py") |
| | print("This will properly extract 48 frames for the complete story") |
| |
|
| | if __name__ == "__main__": |
| | diagnose_issue() |
| | create_fixed_generator() |
| | |
| | print("\nπ To fix your comic generation:") |
| | print("1. The system needs to consistently use 48 frames") |
| | print("2. Not revert to 12 frames in bubble generation") |
| | print("3. Actually extract the frames from video") |
| | print("\nThe issue is the pipeline is inconsistent about frame count.") |