wav2many / app.py
xihajun's picture
Update app.py
ba5d53e
import glob
import os
import streamlit as st
import glob
import librosa
from pydub import AudioSegment
import math
import shutil
from pathlib import Path
class SplitWavAudioMubin():
def __init__(self, folder, filename):
self.folder = folder
self.filename = filename
self.filepath = folder + '/' + filename
self.audio = AudioSegment.from_mp3(self.filepath)
def get_duration(self):
return self.audio.duration_seconds
def single_split(self, from_min, to_min, split_filename):
t1 = from_min * 60 * 1000
t2 = to_min * 60 * 1000
split_audio = self.audio[t1:t2]
split_audio.export(self.folder + '/' + split_filename, format="mp3")
def multiple_split(self, min_per_split):
total_mins = math.ceil(self.get_duration() / 60)
for i in range(0, total_mins, min_per_split):
split_fn = str(i) + '_' + self.filename
self.single_split(i, i+min_per_split, split_fn)
print(str(i) + ' Done')
if i == total_mins - min_per_split:
print('All splited successfully')
uploaded_file = st.sidebar.file_uploader(label = "Please upload your file ",
type=['wav', 'mp3','m4a'])
values = st.sidebar.slider(
'Number of Mins',
0, 30, 1)
submit_button = st.sidebar.button(label='Submit')
if uploaded_file is not None:
with open(os.path.join("./",uploaded_file.name),"wb") as f:
f.write(uploaded_file.getbuffer())
Path("./small").mkdir(parents=True, exist_ok=True)
length_audio = librosa.get_duration(filename=uploaded_file.name)/60
# convert to mp3
format_ = uploaded_file.name.split('.')[-1]
outputname = uploaded_file.name + ".mp3"
sound = AudioSegment.from_file(uploaded_file,format=format_)
sound.export(outputname, format="mp3")
st.title("Audio2Many")
st.write('δΈ€ε…±ζœ‰', round(length_audio, 2) , "εˆ†ι’Ÿ")
st.write('θ’«εˆ†ζˆ', math.ceil(round(length_audio, 2)/values) , "δ»½")
# Main app engine
if __name__ == "__main__":
if submit_button:
# remove files
files = glob.glob('small/*.mp3')
for f in files:
try:
os.remove(f)
except OSError as e:
print("Error: %s : %s" % (f, e.strerror))
try:
os.remove("ε°η’Žη‰‡δ»¬.zip")
except:
print("There is not zip file, continue")
pass
# genrate data
with st.spinner('Wait for cutting...'):
shutil.move(outputname,"./small/"+outputname)
split_wav = SplitWavAudioMubin("./small", outputname)
split_wav.multiple_split(min_per_split=values)
os.remove("./small/"+outputname)
# downloadable button
shutil.make_archive("ε°η’Žη‰‡δ»¬", 'zip', "small")
with open("ε°η’Žη‰‡δ»¬.zip", 'rb') as f:
st.download_button('Download File', f, file_name="ε°η’Žη‰‡δ»¬.zip")