text2vid2storj / app.py
bethecloud's picture
Update app.py
0b2f980
import os
import gradio as gr
from modelscope.pipelines import pipeline
from modelscope.outputs import OutputKeys
import tempfile
import uplink_python
from uplink_python.uplink import Uplink
from uplink_python.module_classes import Permission, SharePrefix, Config
import datetime
# Define the text to video synthesis pipeline
p = pipeline("text-to-video-synthesis", "damo/text-to-video-synthesis")
# Storj configuration information
MY_API_KEY = "1H9SGajiNtFMJtjoseMKuhiLpuPHq3Sy7of6eNUjs8yeRE1DkmRF4XJsTm1ExXLbsxqJ4t5fRZobh4tyFmEdocNCFsJhukakve5C4V59TEEzqTaLVdjFc7ovCkmuRGotR9c2aqDdt5RThRTtKcXaVE5uCtuFQ9tZvnsX"
MY_SATELLITE = "[email protected]:7777"
MY_BUCKET = "huggingface-demo"
MY_ENCRYPTION_PASSPHRASE = "."
# Initialize Storj Uplink
uplink = Uplink()
# Implement the generate_video function
def generate_video(text_input: str, duration: int) -> str:
test_text = {'text': text_input, 'duration': duration}
output_video_path = p(test_text,)[OutputKeys.OUTPUT_VIDEO]
access = uplink.request_access_with_passphrase(MY_SATELLITE, MY_API_KEY, MY_ENCRYPTION_PASSPHRASE)
project = access.open_project()
project.ensure_bucket(MY_BUCKET)
video_key = os.path.basename(output_video_path)
with open(output_video_path, "rb") as f:
upload = project.upload_object(MY_BUCKET, video_key)
upload.write_file(f)
upload.commit()
permissions = Permission(allow_download=True)
shared_prefix = [SharePrefix(bucket=MY_BUCKET, prefix=video_key)]
shared_access = access.share(permissions, shared_prefix)
serialized_shared_access = shared_access.serialize()
deserialized_shared_access = uplink.parse_access(serialized_shared_access)
project_with_shared_access = deserialized_shared_access.open_project()
expiration = datetime.timedelta(hours=1)
expires_at = (datetime.datetime.utcnow() + expiration).timestamp()
storj_video_url = f"{MY_SATELLITE}/{MY_BUCKET}/{video_key}?access={serialized_shared_access}&expiresAt={expires_at}"
download = project_with_shared_access.download_object(MY_BUCKET, video_key)
chunk_size = 1024 * 1024
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".mp4")
try:
with open(temp_file.name, "wb") as dst:
while True:
try:
chunk = download.read(chunk_size) # Read a chunk from the download
except Exception as e:
print(f"Error while reading from download: {e}")
break
if not chunk:
break
dst.write(chunk) # Write the chunk to the destination file
except Exception as e:
print(f"Error while writing to file: {e}")
temp_file.seek(0)
project.close()
return temp_file.name, storj_video_url
# Define the tweet_video function
def tweet_video(text_input: str, duration: int, button_click: bool) -> str:
if button_click:
tweet_text = f"Check out this amazing video generated by Text-to-Video Synthesis! {text_input}"
tweet_url = f"https://twitter.com/intent/tweet?text={tweet_text}"
return tweet_url
else:
return "Hello " + text_input + "!"
# Set theme
my_theme = gr.Theme.from_hub("bethecloud/storj_theme")
# Define the input components
text_input = gr.inputs.Textbox(lines=3, placeholder="Enter a short text to generate video")
duration = gr.inputs.Slider(minimum=1, maximum=10, default=5, label="Duration (seconds)")
button = gr.inputs.Button(label="Share on Twitter")
# Define the output components
video_output = gr.outputs.Video(label="Generated Video")
url_output = gr.outputs.Textbox(label="Storj Video URL")
# Create the Gradio interface
iface = gr.Interface(
fn=tweet_video,
inputs=[text_input, duration],
outputs=[video_output, url_output],
title="Text-to-Video Synthesis",
description="Generate a video based on the input text and share it on Twitter.",
theme=my_theme
)
# Define the action for the "Share on Twitter" button
def on_button_click():
storj_video_url = iface.get_component("Storj Video URL").data
text_input = iface.get_component("Enter a short text to generate video").data
duration = iface.get_component("Duration (seconds)").data
tweet_url = tweet_video(text_input, duration, True)
gr.Interface.open_url(tweet_url)
# Add the "Share on Twitter" button and its action to the interface
iface.set_component("Share on Twitter", gr.Button(on_button_click, label="Share on Twitter"))
# Launch the interface
iface.launch(share=True, debug=True)