Spaces:
Running
on
Zero
Running
on
Zero
File size: 5,038 Bytes
7498d59 79d88c4 2fc2052 79d88c4 375fd74 79d88c4 6c402fc 79d88c4 2fc2052 79d88c4 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
import spaces
import gradio as gr
import os
import numpy as np
from pydub import AudioSegment
import hashlib
from sonic import Sonic
cmd = 'python3 -m pip install "huggingface_hub[cli]"; \
huggingface-cli download LeonJoe13/Sonic --local-dir checkpoints; \
huggingface-cli download stabilityai/stable-video-diffusion-img2vid-xt --local-dir checkpoints/stable-video-diffusion-img2vid-xt; \
huggingface-cli download openai/whisper-tiny --local-dir checkpoints/whisper-tiny;'
os.system(cmd)
# import torch
# print('torch.cuda.device_count()', torch.cuda.device_count())
pipe = Sonic()
def get_md5(content):
md5hash = hashlib.md5(content)
md5 = md5hash.hexdigest()
return md5
def get_video_res(img_path, audio_path, res_video_path, dynamic_scale=1.0):
expand_ratio = 0.5
min_resolution = 512
inference_steps = 25
face_info = pipe.preprocess(img_path, expand_ratio=expand_ratio)
print(face_info)
if face_info['face_num'] > 0:
crop_image_path = img_path + '.crop.png'
pipe.crop_image(img_path, crop_image_path, face_info['crop_bbox'])
img_path = crop_image_path
os.makedirs(os.path.dirname(res_video_path), exist_ok=True)
pipe.process(img_path, audio_path, res_video_path, min_resolution=min_resolution, inference_steps=inference_steps, dynamic_scale=dynamic_scale)
else:
return -1
tmp_path = './tmp_path/'
res_path = './res_path/'
os.makedirs(tmp_path,exist_ok=1)
os.makedirs(res_path,exist_ok=1)
@spaces.GPU
def process_sonic(image,audio,s0):
img_md5= get_md5(np.array(image))
audio_md5 = get_md5(audio[1])
print(img_md5,audio_md5)
sampling_rate, arr = audio[:2]
if len(arr.shape)==1:
arr = arr[:,None]
audio = AudioSegment(
arr.tobytes(),
frame_rate=sampling_rate,
sample_width=arr.dtype.itemsize,
channels=arr.shape[1]
)
audio = audio.set_frame_rate(sampling_rate)
image_path = os.path.abspath(tmp_path+'{0}.png'.format(img_md5))
audio_path = os.path.abspath(tmp_path+'{0}.wav'.format(audio_md5))
if not os.path.exists(image_path):
image.save(image_path)
if not os.path.exists(audio_path):
audio.export(audio_path, format="wav")
res_video_path = os.path.abspath(res_path+f'{img_md5}_{audio_md5}_{s0}.mp4')
if os.path.exists(res_video_path):
return res_video_path
else:
get_video_res(image_path, audio_path, res_video_path,s0)
return res_video_path
inputs = [
gr.Image(type='pil',label="Upload Image"),
gr.Audio(label="Upload Audio"),
gr.Slider(0.5, 2.0, value=1.0, step=0.1, label="Dynamic scale", info="Increase/decrease to obtain more/less movements"),
]
outputs = gr.Video(label="output.mp4")
html_description = """
<div style="display: flex; justify-content: center; align-items: center;">
<a href="https://github.com/jixiaozhong/Sonic.git" style="margin: 0 2px;">
<img src='https://img.shields.io/badge/GitHub-Repo-blue?style=flat&logo=GitHub' alt='GitHub'>
</a>
<a href="https://arxiv.org/pdf/2411.16331" style="margin: 0 2px;">
<img src='https://img.shields.io/badge/arXiv-2411.16331-red?style=flat&logo=arXiv&logoColor=red' alt='arxiv'>
</a>
<a href='https://jixiaozhong.github.io/Sonic/' style="margin: 0 2px;">
<img src='https://img.shields.io/badge/Webpage-Project-silver?style=flat&logo=&logoColor=orange' alt='webpage'>
</a>
<a href="https://github.com/jixiaozhong/Sonic/blob/main/LICENSE" style="margin: 0 2px;">
<img src='https://img.shields.io/badge/License-CC BY--NC--SA--4.0-lightgreen?style=flat&logo=Lisence' alt='License'>
</a>
</div>
The demo can only be used for <b>Non-commercial Use</b>.
<br>If you like our work, please star <a href='https://jixiaozhong.github.io/Sonic/' style="margin: 0 2px;">Sonic</a>.
<br>Note: Audio longer than 10s will be truncated due to computing resources.
"""
TAIL = """
<div style="display: flex; justify-content: center; align-items: center;">
<a href="https://clustrmaps.com/site/1c38t" title="ClustrMaps"><img src="//www.clustrmaps.com/map_v2.png?d=BI2nzSldyixPC88l8Kev4wjjqsU4IOk7gcvpOijolGI&cl=ffffff" /></a>
</div>
"""
def get_example():
return [
["examples/image/female_diaosu.png", "examples/wav/sing_female_rap_10s.MP3", 1.0],
["examples/image/hair.png", "examples/wav/sing_female_10s.wav", 1.0],
["examples/image/anime1.png", "examples/wav/talk_female_english_10s.MP3", 1.0],
["examples/image/leonnado.jpg", "examples/wav/talk_male_law_10s.wav", 1.0],
]
with gr.Blocks(title="Sonic") as demo:
gr.Interface(fn=process_sonic, inputs=inputs, outputs=outputs, title="Sonic: Shifting Focus to Global Audio Perception in Portrait Animation", description=html_description)
gr.Examples(
examples=get_example(),
fn=process_sonic,
inputs=inputs,
outputs=outputs,
cache_examples=False,)
gr.Markdown(TAIL)
demo.launch(server_name='0.0.0.0', server_port=8081, share=True, enable_queue=True)
|