Spaces:
Runtime error
Runtime error
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 = "12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S@us1.storj.io: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) |