File size: 9,398 Bytes
cff9535 0ce42bd cff9535 78d0428 9ab094a 78d0428 9ab094a 78d0428 9ab094a 78d0428 9ab094a 78d0428 9ab094a 78d0428 9ab094a 0ce42bd 78d0428 9ab094a 78d0428 416263d cff9535 78d0428 0ce42bd 78d0428 0ce42bd 416263d cff9535 78d0428 cff9535 78d0428 2299694 ed7bb0b 78d0428 ed7bb0b 78d0428 cff9535 9ab094a cff9535 78d0428 9ab094a cff9535 9ab094a 78d0428 9ab094a 78d0428 9ab094a 78d0428 9ab094a 78d0428 9ab094a 78d0428 9ab094a 78d0428 9ab094a cff9535 9beb764 78d0428 9beb764 78d0428 9ab094a 78d0428 9ab094a 9beb764 9ab094a 78d0428 9ab094a 78d0428 9ab094a 9beb764 78d0428 9ab094a 78d0428 9ab094a 78d0428 1392a39 78d0428 cff9535 416263d 0ce42bd cff9535 a86a2b8 78d0428 0ce42bd cff9535 0ce42bd cff9535 416263d cff9535 1392a39 cff9535 78d0428 a22eb82 cff9535 a22eb82 416263d 78d0428 | 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 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 | import os, sys
import gradio as gr
from huggingface_hub import snapshot_download
# Assurez-vous que le chemin d'importation de SadTalker est correct
# Cela suppose que 'src' est dans le même répertoire que ce fichier.
from src.gradio_demo import SadTalker
# --- Fonctions de l'interface utilisateur ---
def toggle_audio_file(choice):
"""Bascule l'affichage entre l'audio standard et le mode IDLE (pas d'audio requis)."""
if choice == False:
# L'utilisateur désactive 'Use Idle Animation' -> afficher le champ Audio
return gr.update(visible=True), gr.update(visible=False)
else:
# L'utilisateur active 'Use Idle Animation' -> cacher le champ Audio
return gr.update(visible=False), gr.update(visible=True)
def ref_video_fn(path_of_ref_video):
"""Met à jour la checkbox 'Use Reference Video' si une vidéo de référence est chargée."""
if path_of_ref_video is not None:
return gr.update(value=True)
else:
return gr.update(value=False)
def download_model():
"""Télécharge les checkpoints du modèle SadTalker."""
REPO_ID = 'vinthony/SadTalker-V002rc'
# Utilisation de local_dir='./checkpoints' pour le standard SadTalker
snapshot_download(repo_id=REPO_ID, local_dir='./checkpoints', local_dir_use_symlinks=False)
# --- Fonction principale de l'interface Gradio ---
def sadtalker_demo():
# 1. Téléchargement des modèles
print("Téléchargement des modèles SadTalker...")
download_model()
# 2. Initialisation du modèle (lazy_load=True retarde le chargement des poids)
sad_talker = SadTalker(lazy_load=True)
with gr.Blocks(analytics_enabled=False) as sadtalker_interface:
gr.Markdown("<div align='center'> <h2> 😭 SadTalker: Learning Realistic 3D Motion Coefficients for Stylized Audio-Driven Single Image Talking Face Animation </span> </h2> \
<a style='font-size:18px;color: #efefef' href='https://arxiv.org/abs/2211.12194'>Arxiv</a> \
<a style='font-size:18px;color: #efefef' href='https://sadtalker.github.io'>Homepage</a> \
<a style='font-size:18px;color: #efefef' href='https://github.com/Winfredy/SadTalker'> Github </div>")
gr.Markdown("""
<b>🚀 Dupliquez l'espace et mettez à niveau vers un GPU pour de meilleures performances et une inférence plus rapide sans attendre dans la file d'attente. <a style='display:inline-block' href="https://huggingface.co/spaces/vinthony/SadTalker?duplicate=true"><img src="https://bit.ly/3gLdBN6" alt="Duplicate Space"></a></b> \
<br/><b>Alternativement, essayez notre <a href=https://github.com/Winfredy/SadTalker> code GitHub </a> sur votre propre GPU. </b> <a style='display:inline-block' href="https://github.com/Winfredy/SadTalker"><img src="https://img.shields.io/github/stars/Winfredy/SadTalker?style=social"/></a> \
""")
with gr.Row():
with gr.Column(variant='panel'):
with gr.Tabs(elem_id="sadtalker_source_image"):
with gr.TabItem('Source image'):
with gr.Row():
source_image = gr.Image(label="Source image", source="upload", type="filepath", elem_id="img2img_image")
with gr.Tabs(elem_id="sadtalker_driven_audio"):
with gr.TabItem('Driving Methods'):
gr.Markdown("Combinaisons possibles : <br> 1. Audio seul 2. Audio/IDLE Mode + Ref Video 3. IDLE Mode seul 4. Ref Video seul ")
with gr.Row():
driven_audio = gr.Audio(label="Input audio", source="upload", type="filepath", max_length=180)
# Audio invisible pour le mode IDLE
driven_audio_no = gr.Audio(label="Use IDLE mode, no audio is required", source="upload", type="filepath", visible=False)
with gr.Column():
use_idle_mode = gr.Checkbox(label="Use Idle Animation")
length_of_audio = gr.Number(value=5, label="The length(seconds) of the generated video.")
# Action pour basculer les champs audio
use_idle_mode.change(toggle_audio_file, inputs=use_idle_mode, outputs=[driven_audio, driven_audio_no])
with gr.Row():
ref_video = gr.Video(label="Reference Video", source="upload", type="filepath", elem_id="vidref")
with gr.Column():
use_ref_video = gr.Checkbox(label="Use Reference Video")
ref_info = gr.Radio(['pose', 'blink','pose+blink', 'all'], value='pose', label='Reference Video',info="Comment emprunter de la vidéo de référence ?")
ref_video.change(ref_video_fn, inputs=ref_video, outputs=[use_ref_video])
with gr.Column(variant='panel'):
with gr.Tabs(elem_id="sadtalker_checkbox"):
with gr.TabItem('Settings'):
gr.Markdown("Aide ? Visitez notre [[page de meilleures pratiques](https://github.com/OpenTalker/SadTalker/blob/main/docs/best_practice.md)]")
with gr.Column(variant='panel'):
with gr.Row():
pose_style = gr.Slider(minimum=0, maximum=45, step=1, label="Pose style", value=0)
exp_weight = gr.Slider(minimum=0, maximum=3, step=0.1, label="expression scale", value=1)
blink_every = gr.Checkbox(label="use eye blink", value=True)
with gr.Row():
size_of_image = gr.Radio([256, 512], value=256, label='face model resolution', info="Utiliser le modèle 256/512 ?")
preprocess_type = gr.Radio(['crop', 'resize','full', 'extcrop', 'extfull'], value='crop', label='preprocess', info="Comment traiter l'image source?")
with gr.Row():
is_still_mode = gr.Checkbox(label="Still Mode (moins de mouvement de tête, fonctionne avec `full`)")
facerender = gr.Radio(['facevid2vid','pirender'], value='facevid2vid', label='facerender', info="Quel moteur de rendu de visage ?")
with gr.Row():
batch_size = gr.Slider(label="batch size in generation", step=1, maximum=10, value=1)
enhancer = gr.Checkbox(label="GFPGAN as Face enhancer")
submit = gr.Button('Generate', elem_id="sadtalker_generate", variant='primary')
with gr.Tabs(elem_id="sadtalker_genearted"):
gen_video = gr.Video(label="Generated video", format="mp4", scale=1)
# --- Événement de soumission ---
submit.click(
fn=sad_talker.test,
inputs=[source_image,
driven_audio,
preprocess_type,
is_still_mode,
enhancer,
batch_size,
size_of_image,
pose_style,
facerender,
exp_weight,
use_ref_video,
ref_video,
ref_info,
use_idle_mode,
length_of_audio,
blink_every
],
outputs=[gen_video],
)
# --- Exemples ---
with gr.Row():
examples = [
[
'examples/source_image/full_body_1.png',
'examples/driven_audio/bus_chinese.wav',
'crop',
True,
False
],
# ... (le reste des exemples est maintenu tel quel)
[
'examples/source_image/art_5.png',
'examples/driven_audio/RD_Radio31_000.wav',
'resize',
True,
True
],
]
gr.Examples(examples=examples,
inputs=[
source_image,
driven_audio,
preprocess_type,
is_still_mode,
enhancer],
outputs=[gen_video],
fn=sad_talker.test,
# MODIFICATION CLÉ ICI : Desactiver la mise en cache
cache_examples=False)
return sadtalker_interface
if __name__ == "__main__":
demo = sadtalker_demo()
# Configuration cruciale pour l'API (n8n ou autre) et la file d'attente
# api_open=True permet de créer automatiquement une API REST pour l'endpoint 'test' (sad_talker.test)
demo.queue(max_size=10, api_open=True)
demo.launch(debug=True) |