File size: 3,660 Bytes
9bf3376
 
 
 
 
 
5d58ce5
 
9bf3376
 
 
5d58ce5
9bf3376
 
 
 
 
5d58ce5
 
9bf3376
 
5d58ce5
9bf3376
 
 
 
 
5d58ce5
 
 
 
 
9bf3376
 
5d58ce5
9bf3376
 
5d58ce5
 
9bf3376
 
 
 
5d58ce5
9bf3376
 
 
 
 
 
 
 
 
 
 
 
 
 
5d58ce5
9bf3376
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5d58ce5
9bf3376
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5d58ce5
 
9bf3376
 
 
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import streamlit as st
from transformers import pipeline
from PIL import Image
import numpy as np
import tempfile
import os
from modelscope.pipelines import pipeline as modelscope_pipeline
from modelscope.outputs import OutputKeys

def generate_video_from_image(image, duration_seconds=10, progress_bar=None):
    """
    Generate a video from an image using ModelScope's video generation.
    """
    try:
        if progress_bar:
            progress_bar.progress(0.1, "Generating image caption...")
            
        # Setup image captioning
        caption_pipe = pipeline("image-to-text", model="Salesforce/blip-image-captioning-base")
        
        # Generate caption
        caption = caption_pipe(image)[0]['generated_text']
        st.write(f"Generated caption: *{caption}*")
        
        if progress_bar:
            progress_bar.progress(0.3, "Loading Video Generation model...")
            
        # Initialize video generation
        video_pipe = modelscope_pipeline(
            'text-to-video-synthesis',
            model='damo/text-to-video-synthesis'
        )
        
        if progress_bar:
            progress_bar.progress(0.5, "Generating video...")
            
        # Generate video
        output = video_pipe(caption)
        video_path = output[OutputKeys.OUTPUT_VIDEO]
        
        if progress_bar:
            progress_bar.progress(1.0, "Video generation complete!")
            
        return video_path, caption
        
    except Exception as e:
        st.error(f"Error generating video: {str(e)}")
        raise

def main():
    st.set_page_config(page_title="AI Video Generator", page_icon="🎥")
    
    st.title("🎥 AI Video Generator")
    st.write("""
    Upload an image to generate a video with AI-powered motion and transitions.
    The app will automatically generate a caption for your image and use it as inspiration for the video.
    """)
    
    st.info("Note: Video generation may take several minutes.")
    
    # File uploader
    uploaded_file = st.file_uploader("Choose an image", type=['png', 'jpg', 'jpeg'])
    
    if uploaded_file is not None:
        # Display uploaded image
        image = Image.open(uploaded_file)
        st.image(image, caption="Uploaded Image", use_column_width=True)
        
        # Generate button
        if st.button("Generate Video"):
            try:
                # Create a progress bar
                progress_text = "Operation in progress. Please wait..."
                my_bar = st.progress(0, text=progress_text)
                
                # Generate video
                video_path, caption = generate_video_from_image(image, my_bar)
                
                if video_path and os.path.exists(video_path):
                    # Read the video file
                    with open(video_path, 'rb') as video_file:
                        video_bytes = video_file.read()
                    
                    # Create download button
                    st.download_button(
                        label="Download Video",
                        data=video_bytes,
                        file_name="generated_video.mp4",
                        mime="video/mp4"
                    )
                    
                    # Display video
                    st.video(video_bytes)
                else:
                    st.error("Failed to generate video. Please try again.")
            
            except Exception as e:
                st.error(f"An error occurred: {str(e)}")
                st.error("Full error message for debugging:")
                st.error(e)

if __name__ == "__main__":
    main()