gbharti's picture
Update app.py
3818b88
import streamlit as st
import requests
import time
API_KEY = str(st.secrets['SIEVE_API_KEY'])
st.title("Stable Riffusion Walk")
st.markdown('Built by [Gaurang Bharti](https://gaurangbharti.netlify.app) Powered by [Sieve](https://www.sievedata.com)')
st.markdown("Stable Riffusion Walk combines [Stable Diffusion Walk](https://github.com/nateraw/stable-diffusion-videos) and [Stable Riffusion](https://www.riffusion.com) to generate music videos through Stable Diffusion!")
st.caption("You can find some examples at the bottom. Generations can take anywhere from 5 mins to 10+ mins depending on demand. Please be patient :)")
def check_status(url, interval, job_id):
finished = False
headers = {
'X-API-Key': API_KEY
}
while True:
response = requests.get(url, headers=headers)
assert response.json()['data'], print(response.json())
data = response.json()['data']
for job in data:
if job['id'] == job_id:
if job['status'] == 'processing':
time.sleep(interval)
if job['status'] == 'finished':
finished = True
return finished
if job['status'] == 'error':
st.error("An error occured, please try again. If the error persists, please inform the developers.")
print(job['error'])
return job['error']
def fetch_video(job_id):
url = f"https://mango.sievedata.com/v1/jobs/{job_id}"
headers = {
'Content-Type': 'application/json',
'X-API-Key': API_KEY
}
response = requests.get(url, headers = headers)
data = response.json()
url = data['data'][0]['url']
return url
def send_data(audio_text, video_text, duration, name):
url = "https://mango.sievedata.com/v1/push"
headers = {
'Content-Type': 'application/json',
'X-API-Key': API_KEY
}
data = {
"workflow_name": name,
"inputs": {
"video_prompt": video_text,
"audio_prompt": audio_text,
"duration": duration
}
}
try:
response = requests.post(url, headers=headers, json=data)
if ('id') not in response.json():
st.error(response.json()['description'])
return False
return (response.json()['id'])
except Exception as e:
return (f'An error occurred: {e}')
#Streamlit App
st.subheader("Music")
audio_in = st.text_input('Try your favorite styles, instruments like saxophone or violin, modifiers like arabic or jamaican, genres like jazz or gospel, sounds like church bells or rain, or any combination', placeholder="Enter prompt for music here", max_chars=100)
with st.expander("Music examples"):
st.write("Alarm Clock")
st.audio("Audios/alarm_clock.mp3")
st.write("Class Rock Mellow Gold Progressive")
st.audio("Audios/classic_rock_mellow_gold_progressive.mp3")
st.write("Guitar Riff")
st.audio("Audios/guitar_riff.mp3")
st.write("Reggae Fusion")
st.audio("Audios/reggae_fusion.mp3")
st.write("Rock & Roll")
st.audio("Audios/rock_and_roll.mp3")
music_options = ["None", "Alarm Clock", "Classic Rock Mellow Gold Progressive", "Guitar Riff", "Reggae Fusion", "Rock & Roll"]
music_example = st.radio("Or try something from the examples! (Set to None if you're using a custom prompt)", options=music_options)
if music_example != "None":
audio_in = music_example
st.subheader("Video")
video_in = st.text_input("Describe the visuals of the video! You can try any Stable Diffusion or Midjourney prompts. Some examples below!", placeholder="Enter prompt for video here")
st.caption("Note: More complex prompts will take longer")
with st.expander("Music Video examples"):
col1, col2 = st.columns([1, 1])
with col1:
st.write("Audio prompt: Hans Zimmer")
st.write("Video prompt: Skull demon sorcerer Concept art portrait by Terese Nielsen, Brom, Miho Hirano, hyperdetailed intricately detailed gothic art trending on Artstation triadic colors Unreal Engine 5 detailed matte painting, Dark Black Velvet Background, art nouveau, deep color, fantastical, intricate detail, splash screen, complementary colors, fantasy concept art, gothic deviantart masterpiece, Vivid colors, 16k, UHD, HDR10, (Masterpiece:1. 5), Absurdres, (best quality:1. 5) Model: ReV Animated v1. 21")
with col2:
st.video("https://github.com/gaurangbharti1/riffusion-walk-streamlit/raw/main/Videos/skull_demon.mp4")
col3, col4 = st.columns([1, 1])
with col3:
st.write("Audio prompt: Relaxing, Floating, Waterfall")
st.write("Video prompt: floating island in the clouds, nice weather, trees, a wooden house, waterfall")
with col4:
st.video("https://github.com/gaurangbharti1/riffusion-walk-streamlit/raw/main/Videos/floating_island_waterfall.mp4")
col5, col6 = st.columns([1, 1])
with col5:
st.write("Audio prompt: New Orleans Blues")
st.write("Video prompt: pixel video game with fighting dragons, high quality")
with col6:
st.video("https://github.com/gaurangbharti1/riffusion-walk-streamlit/raw/main/Videos/pixel_fighting_game_new_orleans_blues.mp4")
input_duration = st.slider("Duration (seconds)", 4, 7, 5)
workflow_name = "openjourney-test"
# Experimental
#workflow_names = ["stable-riffusion-walk", "openjourney-test"]
# st.write("Pick one of these models for the video")
# options = ["OpenJourney", "Stable Diffusion v1.5"]
# col1, col2 = st.columns([1, 1])
# with col1:
# selected_option = st.radio("Select an option", options)
# with col2:
# if selected_option == "Stable Diffusion v1.5":
# st.image("sd_21_2.jpg", width=300)
# workflow_name = "stable-riffusion-walk"
# elif selected_option == "Openjourney":
# st.image("openjourney_1.png", width=300)
# workflow_name = "openjourney-test"
button1 = st.button("Diffuse!")
if st.session_state.get('button') != True:
st.session_state['button'] = button1
if st.session_state['button'] == True:
job = send_data(audio_in, video_in, input_duration, workflow_name)
if job:
with st.spinner("Processing Video"):
status = check_status('https://mango.sievedata.com/v1/jobs', 5, str(job))
if status == True:
video = fetch_video(job)
st.video(video)