myTest01 / app.py
meng2003's picture
Update app.py
e6a45df
import os
from pathlib import Path
from tempfile import mkstemp, mkdtemp
import gradio as gr
from moviepy.editor import VideoFileClip, AudioFileClip
import shlex
import datetime
import subprocess
import time
end_time=1000
allowed_medias = [".mp3", ".wav", ".ogg"]
def execute_command(cmdstring, cwd=None, timeout=None, shell=False):
"""执行一个SHELL命令
封装了subprocess的Popen方法, 支持超时判断,支持读取stdout和stderr
参数:
cwd: 运行命令时更改路径,如果被设定,子进程会直接先更改当前路径到cwd
timeout: 超时时间,秒,支持小数,精度0.1秒
shell: 是否通过shell运行
Returns: return_code
Raises: Exception: 执行超时
"""
global end_time
if shell:
cmdstring_list = cmdstring
else:
cmdstring_list = shlex.split(cmdstring)
if timeout:
end_time = datetime.datetime.now() + datetime.timedelta(seconds=timeout)
# 没有指定标准输出和错误输出的管道,因此会打印到屏幕上;
sub = subprocess.Popen(cmdstring_list, cwd=cwd, stdin=subprocess.PIPE, shell=shell, bufsize=4096)
# subprocess.poll()方法:检查子进程是否结束了,如果结束了,设定并返回码,放在subprocess.returncode变量中
while sub.poll() is None:
time.sleep(0.1)
if timeout:
if end_time <= datetime.datetime.now():
raise Exception("Timeout:%s" % cmdstring)
return str(sub.returncode)
def update(file,dclass):
if dclass == "":
raise gr.Error("请输入舞蹈类型.")
if dappear == "":
raise gr.Error("请输入人物外观.")
file_path = Path(file.name)
info = {}
info["size"] = os.path.getsize(file_path)
info["name"] = file_path.name
print(file_path.name)
file_extension = file_path.suffix
info["type"] = "audio"
audio = AudioFileClip(file.name)
info["duration"] = audio.duration
info["audio_channels"] = audio.nchannels
filename = file_path.name
######
#info为音频信息
# videopath="myCoolSong.mp4"
#返回视频
if info["size"] > 100000000:
raise gr.Error(
"Please make sure all files are less than 100MB in size."
)
path = mkdtemp()
path2 = mkdtemp()
print(path)
print(path2)
audio_bytes = file.read()
with open(path+"/example", 'wb+') as fd:
fd.write(audio_bytes)
print(fd.name)
audio.close()
execute_command("bash script_generate.sh transflower_expmap_old example --generate_bvh --generate_video --data_dir="+path+" --seed=seed1 --output_folder="+path2)
videopath=path2+"/example.mp4"
return videopath
# coding=utf-8
with gr.Blocks() as demo:
gr.Markdown(
"""
# <span style="margin-right: 0.3rem;">🏞</span>音频自动生成舞蹈
上传音频,系统会自动生成对应的舞蹈
""",
elem_id="header",
)
with gr.Row():
with gr.Column():
user_file = gr.File(
file_count="single", label="音频文件", keep_filename=True,
file_types=allowed_medias
)
dclass=gr.Dropdown(["流行", "民族", "混合"], label="舞蹈类型", info="")
dappear=gr.Dropdown(["舞蹈服", "休闲服", "混合"], label="人物外观", info="")
number = gr.Slider(minimum=-0, maximum=20, value=1, step=1,
interactive=True, label="人物数量")
btn = gr.Button("Run", label="Run")
with gr.Column():
generated_video = gr.Video(
interactive=False, label="舞蹈视频", include_audio=True
)
# generated_command = gr.Markdown()
btn.click(
fn=update,
inputs=[user_file, dclass],
outputs=[generated_video]
)
if __name__ == "__main__":
demo.launch()