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( """ # 🏞音频自动生成舞蹈 上传音频,系统会自动生成对应的舞蹈 """, 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()