songlab-melody / app.py
mubashiralli's picture
updating uploading to wordpress function
75e8808 verified
raw
history blame
12.5 kB
import streamlit as st
import requests
import numpy as np
import os
import base64
from streamlit import session_state as st_state
import streamlit_vertical_slider as svs
import librosa
import soundfile as sf
from scipy.signal import butter, sosfilt
from wordpress_xmlrpc.compat import xmlrpc_client
from io import BytesIO
import soundfile as sf
from datetime import datetime
from wordpress_xmlrpc import Client
from wordpress_xmlrpc.methods import media
from xmlrpc.client import Binary
from woocommerce import API
from wordpress_xmlrpc.compat import xmlrpc_client
from io import BytesIO
import soundfile as sf # This library is used for saving audio data as WAV file
from datetime import datetime
import uuid
def save_to_wordpress(audio, sample_rate):
# Define your WordPress site URL and authentication credentials
wordpress_url = 'https://songlabai.com/xmlrpc.php'
woocommerce_url = 'https://songlabai.com'
consumer_key = 'ck_93d516ba12289a6fd0eced56bbc0b05ecbf98735'
consumer_secret = 'cs_9d5eb716d631db408a4c47796b5d18b0313d8559'
username = 'admin_h2ibbgql'
password = 'um^VdaNK0H8Vw2*KNJlYABkh'
# Authenticate with WordPress XML-RPC API
wav_bytes = BytesIO()
sf.write(wav_bytes, audio, samplerate=sample_rate, format='WAV')
title = f"generated_audio_{datetime.now().timestamp()}.wav"
file_data = {
'name': title,
'type': 'audio/x-wav', # Change the MIME type according to your file type
'bits': xmlrpc_client.Binary(wav_bytes.getvalue()),
}
wp_client = Client(wordpress_url, username, password)
for _ in range(4):
try:
# Upload the file to WordPress Media Library
media_response = wp_client.call(media.UploadFile(file_data))
# Handle the response
if media_response:
print("File successfully uploaded to WordPress with attachment ID:", media_response)
# Create product data for WooCommerce
product_data = {
'status':'pending',
'name': title,
'type': 'simple',
'regular_price': '1.00', # Set the price as needed
'sku': str(uuid.uuid4()),
'downloadable': True,
'download_limit': -1,
'download_expiry': -1,
}
# Authenticate with WooCommerce API
wc_api = API(
url=woocommerce_url,
consumer_key=consumer_key,
consumer_secret=consumer_secret,
version="wc/v3"
)
# Create the product
response = wc_api.post("products", product_data)
# Handle the response
if response.status_code == 201:
print("Product successfully created in WooCommerce:", response.json())
# Update product to add downloadable file URL
product_update_data = {
'downloads': [{
'name': media_response['title'],
'file': media_response['link']
}]
}
product_id = response.json().get('id')
response = wc_api.put(f"products/{product_id}", product_update_data)
if response.status_code == 200:
print("Downloadable file URL added to product:", response.json())
return response.json()['permalink']
else:
print("Error adding downloadable file URL to product:", response.text)
else:
print("Error creating product in WooCommerce:", response.text)
else:
print("Error uploading file to WordPress.")
break
except Exception as e:
print("Error:", e)
# Try to get API_URL from environment variables, if not found set to a default value
try:
API_URL = os.environ["API_URL"]
except KeyError:
st.error("API_URL environment variable is not set.")
st.stop()
# Try to get the Bearer token from environment variables, if not found set to a default value
try:
BEARER_TOKEN = os.environ["ACCESS_TOKEN"]
except KeyError:
st.error("BEARER_TOKEN environment variable is not set.")
st.stop()
headers = {
"Authorization": f"Bearer {BEARER_TOKEN}",
"Content-Type": "application/json"
}
# Initialize session state variables
if 'audio' not in st_state:
st_state.audio = None
if 'augmented_audio' not in st_state:
st_state.augmented_audio = None
# Streamlit app title
st.title("Songlabai")
# Initialize session state variables
if 'vocal_audio' not in st_state:
st_state.vocal_audio = None
if 'audio' not in st_state:
st_state.audio = None
if 'augmented_audio' not in st_state:
st_state.augmented_audio = None
genres = [
"Pop", "Rock", "Hip Hop", "Jazz", "Blues",
"Country", "Classical", "Electronic", "Reggae",
"Folk", "R&B", "Metal", "Punk", "Indie",
"Dance", "World", "Gospel", "Soul", "Funk",
"Ambient", "Techno", "Disco", "House", "Trance",
"Dubstep"
]
genre = st.selectbox("Select Genre:", genres)
energy_levels = ["Low", "Medium", "High"]
energy_level = st.radio("Energy Level:", energy_levels, horizontal=True)
description = st.text_input("Description:", "")
tempo = st.slider("Tempo (in bpm):", min_value=40, max_value=100, value=60, step=5)
# Duration input
duration = st.slider("Duration (in seconds):", min_value=15, max_value=90, value=30, step=1)
# Generate audio based on the user's prompt
if st.button("Generate Audio") and genre and energy_level and description and tempo:
prompt = f"{genre} ,{energy_level}, {tempo}, {description}"
payload = {"inputs": {"prompt": prompt, "duration": duration}}
st.text("Generating audio...")
response = requests.post(API_URL, headers=headers, json=payload)
response = response.json()[0]
audio = np.array(response['generated_audio'], dtype=np.float32)
sample_rate = response['sample_rate']
st_state.audio = audio
permalink = save_to_wordpress(audio, sample_rate)
st.audio(st_state.audio, format="audio/wav", sample_rate=sample_rate, start_time=0)
st.text(f"For downloading/publishing please contact the administrator, from your loged in accout. Remember to send the following link:\n{permalink}")
# Post-processing options
st.header("Post-processing Options")
vocal_file = st.file_uploader("Upload Vocal File", type=["wav", "wav"])
if vocal_file:
st_state.vocal_audio = vocal_file.read()
# Mixing
mix_vocals = st.checkbox("Mix Vocals")
if mix_vocals and st_state.vocal_audio is not None:
# Load the vocal audio
vocal_audio, _ = librosa.load(vocal_file.read(), mono=False)
# Adjust the vocal audio length to match the generated audio
vocal_audio = librosa.util.fix_length(vocal_audio, len(st_state.audio))
# Mix the vocal audio with the generated audio
st_state.augmented_audio = (st_state.audio + vocal_audio) / 2
# Mastering
st.subheader("Mastering")
# Volume Balance, Compression Ratio, and Reverb Amount
vol_col, comp_col, reverb_col = st.columns(3)
with vol_col:
volume_balance = svs.vertical_slider(
"Volume Balance", min_value=-10.0, max_value=10.0, default_value=0.0, step=0.1,
slider_color="green", track_color="lightgray", thumb_color="red"
)
vol_button = st.button("Apply Volume Balance")
with comp_col:
compression_ratio = svs.vertical_slider(
"Compression Ratio", min_value=1.0, max_value=10.0, default_value=3.0, step=0.1,
slider_color="blue", track_color="lightgray", thumb_color="navy"
)
comp_button = st.button("Apply Compression")
with reverb_col:
reverb_amount = svs.vertical_slider(
"Reverb Amount", min_value=1.0, max_value=10.0, default_value=3.0, step=0.1,
slider_color="orange", track_color="lightgray", thumb_color="darkorange"
)
reverb_button = st.button("Apply Reverb")
if vol_button:
if st_state.augmented_audio is None:
st_state.augmented_audio = st_state.audio
st_state.augmented_audio *= 10 ** (volume_balance / 20)
if comp_button:
if st_state.augmented_audio is None:
st_state.augmented_audio = st_state.audio
# Apply compression using a simple soft-knee compressor
threshold = -20 # dBFS
ratio = compression_ratio
knee = 10 # dB
max_gain = 20 # dB
def compress(x, threshold, ratio, knee, max_gain):
over = np.maximum(x - threshold, 0)
gain = over / (over + knee) * (1 - (1 / ratio)) + 1
gain = np.maximum(gain, 1 - max_gain)
return x * gain
st_state.augmented_audio = compress(st_state.augmented_audio, threshold, ratio, knee, max_gain)
if reverb_button:
if st_state.augmented_audio is None:
st_state.augmented_audio = st_state.audio
# Apply a simple reverb effect using convolution
ir_length = int(sample_rate * 2.5) # 2.5 seconds
ir = np.zeros(ir_length)
ir[0] = 1
ir = np.append(ir, np.zeros(len(st_state.augmented_audio) - ir_length))
reverb = np.convolve(st_state.augmented_audio, ir, mode='full')[:len(st_state.augmented_audio)]
st_state.augmented_audio = st_state.augmented_audio + reverb_amount * reverb
# Create two main columns
col1, col2 = st.columns(2)
# EQ Controls
with col1:
eq_cols1 = st.columns(3)
with eq_cols1[0]:
eq_low = svs.vertical_slider(
"Low", default_value=0.0, step=0.1, min_value=-10.0, max_value=10.0,
slider_color="green", track_color="lightgray", thumb_color="red"
)
with eq_cols1[1]:
eq_mid = svs.vertical_slider(
"Medium", default_value=0.0, step=0.1, min_value=-10.0, max_value=10.0,
slider_color="green", track_color="lightgray", thumb_color="red"
)
with eq_cols1[2]:
eq_high = svs.vertical_slider(
"High", default_value=0.0, step=0.1, min_value=-10.0, max_value=10.0,
slider_color="green", track_color="lightgray", thumb_color="red"
)
eq_cols2 = st.columns(3)
with eq_cols2[0]:
pass
with eq_cols2[1]:
eq_button = st.button("Apply EQ")
with eq_cols2[2]:
pass
# Delay Controls
with col2:
delay_cols1 = st.columns(2)
with delay_cols1[0]:
delay_amount = svs.vertical_slider(
"Value", default_value=25, step=1, min_value=0, max_value=100,
slider_color="#6A5ACD", track_color="#F5F5F5", thumb_color="#4B0082"
)
with delay_cols1[1]:
delay_time = svs.vertical_slider(
"Time", default_value=75, step=1, min_value=0, max_value=100,
slider_color="#3CB371", track_color="#F5F5F5", thumb_color="#2E8B57"
)
delay_cols2 = st.columns(3)
with delay_cols2[0]:
pass
with delay_cols2[1]:
delay_button = st.button("Delay")
with delay_cols2[2]:
pass
if eq_button:
if st_state.augmented_audio is None:
st_state.augmented_audio = st_state.audio
# Apply a simple 3-band EQ using a butterworth filter
nyquist = sample_rate / 2
low_cutoff = 200 / nyquist
mid_cutoff = 2000 / nyquist
high_cutoff = 8000 / nyquist
low_sos = butter(4, low_cutoff, btype='low', output='sos', analog=False)
mid_sos = butter(4, [low_cutoff, mid_cutoff], btype='band', output='sos', analog=False)
high_sos = butter(4, high_cutoff, btype='high', output='sos', analog=False)
st_state.augmented_audio = sosfilt(np.dstack((low_sos, mid_sos, high_sos)), st_state.augmented_audio, np.stack((eq_low, eq_mid, eq_high)))
# Add delay logic here if needed
if delay_button:
if st_state.augmented_audio is None:
st_state.augmented_audio = st_state.audio
# Apply a simple delay effect
delay_samples = int(delay_time / 1000 * sample_rate)
delay = np.zeros(len(st_state.augmented_audio) + delay_samples)
delay[delay_samples:] = st_state.augmented_audio
delay[:len(st_state.augmented_audio)] += delay_amount * delay[:-delay_samples]
st_state.augmented_audio = delay[:len(st_state.augmented_audio)]
# Display the final audio
if st_state.augmented_audio is not None:
st.audio(st_state.augmented_audio, format="audio/wav", sample_rate=sample_rate, start_time=0)
# Redirect Button for subscribe
st.link_button("Download/Save", "https://songlabai.com/subcribe/")