Spaces:
Running
Running
import streamlit as st | |
import tempfile | |
import os | |
from pathlib import Path | |
from video_processor import VideoProcessor | |
from audio_processor import AudioProcessor | |
from link_processor import LinkDownloader | |
# Initialize session state for tracking processing status | |
if 'processing_complete' not in st.session_state: | |
st.session_state.processing_complete = False | |
if 'current_tab' not in st.session_state: | |
st.session_state.current_tab = "URL Processing π" | |
# Utility functions | |
def save_uploaded_file(uploaded_file, temp_dir): | |
file_path = Path(temp_dir) / uploaded_file.name | |
with open(file_path, 'wb') as f: | |
f.write(uploaded_file.read()) | |
return file_path | |
def download_file_button(file_path, label, file_name, mime_type): | |
with open(file_path, 'rb') as f: | |
if st.download_button( | |
label=label, | |
data=f.read(), | |
file_name=file_name, | |
mime=mime_type | |
): | |
# Reset the processing state after download | |
st.session_state.processing_complete = False | |
st.experimental_rerun() | |
def reset_processing_state(): | |
st.session_state.processing_complete = False | |
def process_audio(audio_file): | |
with tempfile.TemporaryDirectory() as temp_dir: | |
input_path = save_uploaded_file(audio_file, temp_dir) | |
output_dir = Path(temp_dir) / "output" | |
output_dir.mkdir(exist_ok=True) | |
with st.spinner("Processing audio..."): | |
try: | |
audio_proc = AudioProcessor(input_path, output_dir) | |
if not audio_proc.run_demucs(): | |
raise RuntimeError("Demucs processing failed.") | |
vocals_path = audio_proc.get_vocals_path() | |
no_vocals_path = audio_proc.get_no_vocals_path() | |
if not vocals_path or not no_vocals_path: | |
raise FileNotFoundError("Processed files not found.") | |
col1, col2 = st.columns(2) | |
with col1: | |
download_file_button( | |
vocals_path, | |
"Download Vocals", | |
f"vocals_{audio_file.name.rsplit('.', 1)[0]}.wav", | |
"audio/wav" | |
) | |
st.success("Audio processing completed!") | |
st.session_state.processing_complete = True | |
except Exception as e: | |
st.error(f"An error occurred: {str(e)}") | |
reset_processing_state() | |
def process_video(video_file): | |
with tempfile.TemporaryDirectory() as temp_dir: | |
input_path = save_uploaded_file(video_file, temp_dir) | |
output_dir = Path(temp_dir) / "output" | |
output_dir.mkdir(exist_ok=True) | |
with st.spinner("Processing video..."): | |
try: | |
video_proc = VideoProcessor(input_path, output_dir) | |
audio_path = video_proc.extract_audio() | |
if not audio_path: | |
raise RuntimeError("Audio extraction from video failed.") | |
audio_proc = AudioProcessor(audio_path, output_dir) | |
if not audio_proc.run_demucs(): | |
raise RuntimeError("Demucs processing failed.") | |
vocals_path = audio_proc.get_vocals_path() | |
no_vocals_path = audio_proc.get_no_vocals_path() | |
if not vocals_path or not no_vocals_path: | |
raise FileNotFoundError("Processed audio files not found.") | |
final_video_path = video_proc.combine_video_audio(vocals_path) | |
col1, col2 = st.columns(2) | |
if final_video_path: | |
with col1: | |
download_file_button( | |
final_video_path, | |
"Download Processed Video", | |
f"processed_{video_file.name}", | |
"video/mp4" | |
) | |
with col2: | |
download_file_button( | |
vocals_path, | |
"Download Vocals", | |
f"vocals_{video_file.name.rsplit('.', 1)[0]}.wav", | |
"audio/wav" | |
) | |
st.success("Video processing completed!") | |
st.session_state.processing_complete = True | |
except Exception as e: | |
st.error(f"An error occurred: {str(e)}") | |
reset_processing_state() | |
def process_url(url): | |
with tempfile.TemporaryDirectory() as temp_dir: | |
try: | |
output_dir = Path(temp_dir) / "downloaded" | |
output_dir.mkdir(exist_ok=True) | |
with st.spinner("Downloading video..."): | |
downloader = LinkDownloader(output_dir) | |
video_path = downloader.download_from_url(url) | |
if not video_path: | |
st.error("Video download failed") | |
return | |
# Add extensive logging and checks | |
#st.write(f"Downloaded video path: {video_path}") | |
#st.write(f"Video file exists: {os.path.exists(video_path)}") | |
try: | |
video_file_size = os.path.getsize(video_path) | |
# | |
#(f"Video file size: {video_file_size} bytes") | |
if video_file_size == 0: | |
st.error("Downloaded video file is empty") | |
return | |
except Exception as size_error: | |
st.error(f"Error checking file size: {size_error}") | |
return | |
# Rest of the processing remains the same... | |
st.info("Processing video...") | |
process_dir = Path(temp_dir) / "output" | |
process_dir.mkdir(exist_ok=True) | |
video_proc = VideoProcessor(video_path, process_dir) | |
audio_path = video_proc.extract_audio() | |
if not audio_path: | |
st.error("Audio extraction failed") | |
return | |
st.info("Separating vocals...") | |
audio_proc = AudioProcessor(audio_path, process_dir) | |
if not audio_proc.run_demucs(): | |
st.error("Demucs processing failed") | |
return | |
vocals_path = audio_proc.get_vocals_path() | |
no_vocals_path = audio_proc.get_no_vocals_path() | |
if not vocals_path or not no_vocals_path: | |
st.error("Processed audio files not found") | |
return | |
st.info("Creating final video...") | |
final_video_path = video_proc.combine_video_audio(vocals_path) | |
if not final_video_path: | |
st.error("Final video creation failed") | |
return | |
col1, col2 = st.columns(2) | |
if final_video_path: | |
with col1: | |
download_file_button( | |
final_video_path, | |
"Download Processed Video", | |
"processed_video.mp4", | |
"video/mp4" | |
) | |
if vocals_path: | |
with col2: | |
download_file_button( | |
vocals_path, | |
"Download Vocals", | |
"vocals.wav", | |
"audio/wav" | |
) | |
st.success("Video processing completed!") | |
st.session_state.processing_complete = True | |
except Exception as e: | |
st.error(f"An error occurred: {str(e)}") | |
import traceback | |
traceback.print_exc() # This will print the full traceback | |
# Page config | |
st.set_page_config( | |
page_title="π΅ Audio/Video Music Separator", | |
page_icon="π΅", | |
layout="wide" | |
) | |
# Main App Layout | |
st.title("π΅ Audio/Video Music Separator") | |
# Tabs for different processing types | |
tab1, tab2, tab3 = st.tabs(["URL Processing π", "Audio Processing π§", "Video Processing π₯"]) | |
with tab1: | |
st.header("Process Video from URL") | |
with st.expander("Instructions", expanded=True): | |
st.markdown(""" | |
1. Paste a video URL from Facebook, or other supported platforms | |
2. Click the **Process URL** button | |
3. Download the processed video or vocals | |
""") | |
if not st.session_state.processing_complete: | |
url = st.text_input("Enter video URL") | |
if url and st.button("Process URL"): | |
process_url(url) | |
with tab2: | |
st.header("Process Your Audio File") | |
with st.expander("Instructions", expanded=True): | |
st.markdown(""" | |
1. Upload an audio file in MP3, WAV, or OGG format | |
2. Click the **Process Audio** button | |
3. Download the separated vocals | |
""") | |
if not st.session_state.processing_complete: | |
audio_file = st.file_uploader("Upload your audio file", type=['mp3', 'wav', 'ogg']) | |
if audio_file and st.button("Process Audio"): | |
process_audio(audio_file) | |
with tab3: | |
st.header("Process Your Video File") | |
with st.expander("Instructions", expanded=True): | |
st.markdown(""" | |
1. Upload a video file in MP4, MKV, or AVI format | |
2. Click the **Process Video** button | |
3. Download the processed video or vocals | |
""") | |
if not st.session_state.processing_complete: | |
video_file = st.file_uploader("Upload your video file", type=['mp4', 'mkv', 'avi']) | |
if video_file and st.button("Process Video"): | |
process_video(video_file) | |
# Add a reset button when processing is complete | |
if st.session_state.processing_complete: | |
if st.button("Process Another File"): | |
reset_processing_state() | |
st.experimental_rerun() | |
# Sidebar | |
with st.sidebar: | |
st.header("About") | |
st.markdown(""" | |
This app helps you separate vocals from music in your audio and video files. | |
### Features: | |
- Process videos from URLs | |
- Upload and process audio files | |
- Upload and process video files | |
- Extract vocals | |
- Download processed files | |
- Click process another file | |
""") | |
# Footer | |
st.markdown(""" | |
--- | |
Made with β€οΈ using [Streamlit](https://streamlit.io) | |
""") |