Spaces:
Runtime error
Runtime error
add command output
Browse files
README.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
| 1 |
---
|
| 2 |
-
title:
|
| 3 |
emoji: 🐠
|
| 4 |
colorFrom: red
|
| 5 |
colorTo: yellow
|
|
|
|
| 1 |
---
|
| 2 |
+
title: GPT-4 Video Composer
|
| 3 |
emoji: 🐠
|
| 4 |
colorFrom: red
|
| 5 |
colorTo: yellow
|
app.py
CHANGED
|
@@ -11,6 +11,7 @@ import uuid
|
|
| 11 |
import tempfile
|
| 12 |
import shlex
|
| 13 |
import shutil
|
|
|
|
| 14 |
|
| 15 |
OPENAI_API_KEY = os.environ["OPENAI_API_KEY"]
|
| 16 |
openai.api_key = OPENAI_API_KEY
|
|
@@ -52,7 +53,7 @@ def get_files_infos(files):
|
|
| 52 |
return results
|
| 53 |
|
| 54 |
|
| 55 |
-
def get_completion(prompt, files_info):
|
| 56 |
|
| 57 |
files_info_string = "".join(str(x) for x in files_info)
|
| 58 |
messages = [
|
|
@@ -81,8 +82,10 @@ YOUR FFMPEG COMMAND:""",
|
|
| 81 |
print(messages)
|
| 82 |
|
| 83 |
try:
|
| 84 |
-
completion = openai.ChatCompletion.create(
|
| 85 |
-
|
|
|
|
|
|
|
| 86 |
|
| 87 |
command = completion.choices[0].message.content.replace("\n", "")
|
| 88 |
|
|
@@ -95,14 +98,14 @@ YOUR FFMPEG COMMAND:""",
|
|
| 95 |
raise Exception("OpenAI API error")
|
| 96 |
|
| 97 |
|
| 98 |
-
def update(files, prompt):
|
| 99 |
if prompt == "":
|
| 100 |
raise gr.Error("Please enter a prompt.")
|
| 101 |
|
| 102 |
files_info = get_files_infos(files)
|
| 103 |
|
| 104 |
try:
|
| 105 |
-
command_string = get_completion(prompt, files_info)
|
| 106 |
print(
|
| 107 |
f"""\n\n/// START OF COMMAND ///:\n{command_string}\n/// END OF COMMAND ///\n\n""")
|
| 108 |
|
|
@@ -130,8 +133,8 @@ def update(files, prompt):
|
|
| 130 |
output_file_name = f'output_{uuid.uuid4()}.mp4'
|
| 131 |
output_file_path = str((Path(temp_dir) / output_file_name).resolve())
|
| 132 |
subprocess.run(args + ["-y", output_file_path], cwd=temp_dir)
|
| 133 |
-
|
| 134 |
-
return output_file_path
|
| 135 |
except Exception as e:
|
| 136 |
print("FROM UPDATE", e)
|
| 137 |
raise gr.Error(e)
|
|
@@ -153,7 +156,7 @@ css = """
|
|
| 153 |
with gr.Blocks(css=css) as demo:
|
| 154 |
gr.Markdown(
|
| 155 |
"""
|
| 156 |
-
# <span style="margin-right: 0.3rem;">🏞</span> Video Composer
|
| 157 |
Add video, image and audio assets and ask ChatGPT to compose a new video.
|
| 158 |
""",
|
| 159 |
elem_id="header",
|
|
@@ -168,45 +171,54 @@ with gr.Blocks(css=css) as demo:
|
|
| 168 |
label="Instructions",
|
| 169 |
)
|
| 170 |
btn = gr.Button("Run", label="Run")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 171 |
with gr.Column():
|
| 172 |
generated_video = gr.Video(
|
| 173 |
interactive=False, label="Generated Video", include_audio=True
|
| 174 |
)
|
|
|
|
| 175 |
|
| 176 |
btn.click(
|
| 177 |
-
fn=update, inputs=[user_files,
|
| 178 |
-
|
| 179 |
)
|
| 180 |
with gr.Row():
|
| 181 |
gr.Examples(
|
| 182 |
examples=[
|
| 183 |
-
[[
|
| 184 |
-
|
| 185 |
-
|
| 186 |
-
|
| 187 |
-
|
| 188 |
-
|
| 189 |
-
|
| 190 |
-
|
| 191 |
-
"
|
| 192 |
-
|
| 193 |
],
|
| 194 |
[
|
| 195 |
["./examples/example.mp4"],
|
| 196 |
-
"please encode this video 10 times faster"
|
|
|
|
| 197 |
],
|
| 198 |
[
|
| 199 |
["./examples/heat-wave.mp3", "./examples/square-image.png"],
|
| 200 |
"Make a 720x720 video with a white waveform of the audio taking all screen space, also add the image as the background",
|
|
|
|
| 201 |
],
|
| 202 |
[
|
| 203 |
["./examples/waterfall-overlay.png",
|
| 204 |
"./examples/waterfall.mp4"],
|
| 205 |
"Add the overlay to the video.",
|
|
|
|
| 206 |
],
|
| 207 |
],
|
| 208 |
-
inputs=[user_files, user_prompt],
|
| 209 |
-
outputs=generated_video,
|
| 210 |
fn=update,
|
| 211 |
cache_examples=True,
|
| 212 |
)
|
|
|
|
| 11 |
import tempfile
|
| 12 |
import shlex
|
| 13 |
import shutil
|
| 14 |
+
from utils import format_bash_command
|
| 15 |
|
| 16 |
OPENAI_API_KEY = os.environ["OPENAI_API_KEY"]
|
| 17 |
openai.api_key = OPENAI_API_KEY
|
|
|
|
| 53 |
return results
|
| 54 |
|
| 55 |
|
| 56 |
+
def get_completion(prompt, files_info, top_p, temperature):
|
| 57 |
|
| 58 |
files_info_string = "".join(str(x) for x in files_info)
|
| 59 |
messages = [
|
|
|
|
| 82 |
print(messages)
|
| 83 |
|
| 84 |
try:
|
| 85 |
+
completion = openai.ChatCompletion.create(model="gpt-4",
|
| 86 |
+
messages=messages,
|
| 87 |
+
top_p=top_p,
|
| 88 |
+
temperature=temperature)
|
| 89 |
|
| 90 |
command = completion.choices[0].message.content.replace("\n", "")
|
| 91 |
|
|
|
|
| 98 |
raise Exception("OpenAI API error")
|
| 99 |
|
| 100 |
|
| 101 |
+
def update(files, prompt, top_p=1, temperature=1):
|
| 102 |
if prompt == "":
|
| 103 |
raise gr.Error("Please enter a prompt.")
|
| 104 |
|
| 105 |
files_info = get_files_infos(files)
|
| 106 |
|
| 107 |
try:
|
| 108 |
+
command_string = get_completion(prompt, files_info, top_p, temperature)
|
| 109 |
print(
|
| 110 |
f"""\n\n/// START OF COMMAND ///:\n{command_string}\n/// END OF COMMAND ///\n\n""")
|
| 111 |
|
|
|
|
| 133 |
output_file_name = f'output_{uuid.uuid4()}.mp4'
|
| 134 |
output_file_path = str((Path(temp_dir) / output_file_name).resolve())
|
| 135 |
subprocess.run(args + ["-y", output_file_path], cwd=temp_dir)
|
| 136 |
+
generated_command = f"### Generated Command\n```bash\n{format_bash_command(args)}\n -y output.mp4\n```"
|
| 137 |
+
return output_file_path, gr.update(value=generated_command)
|
| 138 |
except Exception as e:
|
| 139 |
print("FROM UPDATE", e)
|
| 140 |
raise gr.Error(e)
|
|
|
|
| 156 |
with gr.Blocks(css=css) as demo:
|
| 157 |
gr.Markdown(
|
| 158 |
"""
|
| 159 |
+
# <span style="margin-right: 0.3rem;">🏞</span>GPT-4 Video Composer
|
| 160 |
Add video, image and audio assets and ask ChatGPT to compose a new video.
|
| 161 |
""",
|
| 162 |
elem_id="header",
|
|
|
|
| 171 |
label="Instructions",
|
| 172 |
)
|
| 173 |
btn = gr.Button("Run", label="Run")
|
| 174 |
+
with gr.Accordion("Parameters", open=False):
|
| 175 |
+
top_p = gr.Slider(minimum=-0, maximum=1.0, value=1.0, step=0.05,
|
| 176 |
+
interactive=True, label="Top-p (nucleus sampling)")
|
| 177 |
+
temperature = gr.Slider(
|
| 178 |
+
minimum=-0, maximum=5.0, value=1.0, step=0.1, interactive=True, label="Temperature")
|
| 179 |
with gr.Column():
|
| 180 |
generated_video = gr.Video(
|
| 181 |
interactive=False, label="Generated Video", include_audio=True
|
| 182 |
)
|
| 183 |
+
generated_command = gr.Markdown()
|
| 184 |
|
| 185 |
btn.click(
|
| 186 |
+
fn=update, inputs=[user_files, user_prompt, top_p, temperature],
|
| 187 |
+
outputs=[generated_video, generated_command]
|
| 188 |
)
|
| 189 |
with gr.Row():
|
| 190 |
gr.Examples(
|
| 191 |
examples=[
|
| 192 |
+
[["./examples/cat8.jpeg",
|
| 193 |
+
"./examples/cat1.jpeg",
|
| 194 |
+
"./examples/cat2.jpeg",
|
| 195 |
+
"./examples/cat3.jpeg",
|
| 196 |
+
"./examples/cat4.jpeg",
|
| 197 |
+
"./examples/cat5.jpeg",
|
| 198 |
+
"./examples/cat6.jpeg",
|
| 199 |
+
"./examples/cat7.jpeg"],
|
| 200 |
+
"make a video gif given each image 1s loop",
|
| 201 |
+
0, 0
|
| 202 |
],
|
| 203 |
[
|
| 204 |
["./examples/example.mp4"],
|
| 205 |
+
"please encode this video 10 times faster",
|
| 206 |
+
0, 0
|
| 207 |
],
|
| 208 |
[
|
| 209 |
["./examples/heat-wave.mp3", "./examples/square-image.png"],
|
| 210 |
"Make a 720x720 video with a white waveform of the audio taking all screen space, also add the image as the background",
|
| 211 |
+
0, 0
|
| 212 |
],
|
| 213 |
[
|
| 214 |
["./examples/waterfall-overlay.png",
|
| 215 |
"./examples/waterfall.mp4"],
|
| 216 |
"Add the overlay to the video.",
|
| 217 |
+
0, 0
|
| 218 |
],
|
| 219 |
],
|
| 220 |
+
inputs=[user_files, user_prompt, top_p, temperature],
|
| 221 |
+
outputs=[generated_video, generated_command],
|
| 222 |
fn=update,
|
| 223 |
cache_examples=True,
|
| 224 |
)
|
utils.py
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
def format_bash_command(tokens):
|
| 2 |
+
formatted_command = []
|
| 3 |
+
indent = " " * 4
|
| 4 |
+
for token in tokens:
|
| 5 |
+
if token.startswith("-"):
|
| 6 |
+
formatted_command.append("\n" + indent + token)
|
| 7 |
+
else:
|
| 8 |
+
formatted_command.append(" " + token)
|
| 9 |
+
return "".join(formatted_command)
|