import streamlit as st import os import tempfile import subprocess # Set Streamlit app title st.title("Audio Separation App") # Function to process the audio file def separate_audio(audio_path): print(f"{audio_path=}") head, tail = os.path.split(audio_path) gradio_temp_path = head audio_filename = tail.split('.')[0] print(f"{gradio_temp_path=}") print(f"{audio_filename=}") command = f"spleeter separate -p spleeter:2stems {audio_path}" command = command.split() print(f"{command=}") result = subprocess.run(command) print(result) print("--------") accompaniment_path = f"{gradio_temp_path}/separated_audio/{audio_filename}/accompaniment.wav" vocals_path = f"{gradio_temp_path}/separated_audio/{audio_filename}/vocals.wav" print(f"{accompaniment_path=}") print(os.path.exists(accompaniment_path)) print(f"{vocals_path=}") print(os.path.exists(vocals_path)) return vocals_path, accompaniment_path def separate_audio_by_stem(audio_path, stem_count): print(f"{audio_path=}") head, tail = os.path.split(audio_path) gradio_temp_path = head audio_filename = tail.split('.')[0] print(f"{gradio_temp_path=}") print(f"{audio_filename=}") print(f"{stem_count=}") command = f"spleeter separate -p spleeter:{stem_count}stems {audio_path}" command = command.split() print(f"{command=}") result = subprocess.run(command) print(result) if stem_count == 2: accompaniment_path = f"{gradio_temp_path}/separated_audio/{audio_filename}/accompaniment.wav" vocals_path = f"{gradio_temp_path}/separated_audio/{audio_filename}/vocals.wav" print(f"{accompaniment_path=} \t exists: {os.path.exists(accompaniment_path)}") print(f"{vocals_path=} \t exists: {os.path.exists(vocals_path)}") return [ {'description': 'Accompaniment', 'path':accompaniment_path}, {'description': 'Vocals', 'path':vocals_path}, ] elif stem_count == 4: vocals_path = f"{gradio_temp_path}/separated_audio/{audio_filename}/vocals.wav" drums_path = f"{gradio_temp_path}/separated_audio/{audio_filename}/drums.wav" bass_path = f"{gradio_temp_path}/separated_audio/{audio_filename}/bass.wav" other_path = f"{gradio_temp_path}/separated_audio/{audio_filename}/other.wav" print(f"{vocals_path=} \t exists: {os.path.exists(vocals_path)}") print(f"{drums_path=} \t exists: {os.path.exists(drums_path)}") print(f"{bass_path=} \t exists: {os.path.exists(bass_path)}") print(f"{other_path=} \t exists: {os.path.exists(other_path)}") return [ {'description': 'Vocals', 'path':vocals_path}, {'description': 'Drums', 'path':drums_path}, {'description': 'Bass', 'path':bass_path}, {'description': 'Other', 'path':other_path}, ] elif stem_count == 5: piano_path = f"{gradio_temp_path}/separated_audio/{audio_filename}/piano.wav" vocals_path = f"{gradio_temp_path}/separated_audio/{audio_filename}/vocals.wav" drums_path = f"{gradio_temp_path}/separated_audio/{audio_filename}/drums.wav" bass_path = f"{gradio_temp_path}/separated_audio/{audio_filename}/bass.wav" other_path = f"{gradio_temp_path}/separated_audio/{audio_filename}/other.wav" print(f"{piano_path=} \t exists: {os.path.exists(vocals_path)}") print(f"{vocals_path=} \t exists: {os.path.exists(vocals_path)}") print(f"{drums_path=} \t exists: {os.path.exists(drums_path)}") print(f"{bass_path=} \t exists: {os.path.exists(bass_path)}") print(f"{other_path=} \t exists: {os.path.exists(other_path)}") return [ {'description': 'Vocals', 'path':vocals_path}, {'description': 'Piano', 'path':piano_path}, {'description': 'Drums', 'path':drums_path}, {'description': 'Bass', 'path':bass_path}, {'description': 'Other', 'path':other_path}, ] # Streamlit app content st.write("Upload an audio file") uploaded_file = st.file_uploader("Choose a file", type=["wav","mp3"]) selected_stem_count = st.radio("Select stem count", (2,4,5)) if uploaded_file is not None: if st.button("Submit"): # Save the uploaded file to a temporary location with tempfile.NamedTemporaryFile(delete=False) as temp_file: temp_file.write(uploaded_file.read()) temp_file_path = temp_file.name # Process the uploaded audio file separate_audios = separate_audio_by_stem(temp_file_path, selected_stem_count) # Display the output files for download st.write("Output Files:") for audio in separate_audios: st.write(audio['description']) st.audio(audio['path'], format="audio/wav", start_time=0)