TTS-Talker / app.py
longtq
Fix build error
2bf87e7
raw
history blame
5.32 kB
import os, sys
import tempfile
import gradio as gr
from app_tts import infer_tts
from src.gradio_demo import SadTalker
# from src.utils.text2speech import TTSTalker
from huggingface_hub import snapshot_download
def get_source_image(image):
return image
try:
import webui # in webui
in_webui = True
except:
in_webui = False
def toggle_audio_file(choice):
if choice == False:
return gr.update(visible=True), gr.update(visible=False)
else:
return gr.update(visible=False), gr.update(visible=True)
def ref_video_fn(path_of_ref_video):
if path_of_ref_video is not None:
return gr.update(value=True)
else:
return gr.update(value=False)
def download_model():
REPO_ID = 'vinthony/SadTalker-V002rc'
snapshot_download(repo_id=REPO_ID, local_dir='./checkpoints', local_dir_use_symlinks=True)
# New: Gộp 2 nút thành 1, output audio là input cho video
import soundfile as sf
def generate_voice_and_video(ref_audio, ref_text, gen_text, speed, source_image, 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):
# 1. Sinh audio từ TTS
(final_sample_rate, final_wave), _ = infer_tts(ref_audio, ref_text, gen_text, speed)
# Lưu ra file tạm
tmp_audio = tempfile.NamedTemporaryFile(suffix=".wav", delete=False)
sf.write(tmp_audio.name, final_wave, final_sample_rate)
# 2. Gọi SadTalker với audio vừa sinh ra
sad_talker = SadTalker(lazy_load=True)
video_path = sad_talker.test(
source_image,
tmp_audio.name,
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
)
return tmp_audio.name, video_path
def sadtalker_demo():
download_model()
with gr.Blocks(analytics_enabled=False) as sadtalker_interface:
gr.Markdown("""
# 🎤 F5-TTS: Vietnamese Text-to-Speech Synthesis & SadTalker Video
# Nhập text, upload sample voice và ảnh để tạo video nói chuyện.
""")
with gr.Row():
ref_audio = gr.Audio(label="🔊 Sample Voice", type="filepath")
ref_text = gr.Textbox(label="📝 Reference Transcript (optional)", placeholder="Nhập transcript tiếng Việt cho sample voice nếu có...", lines=2)
gen_text = gr.Textbox(label="📝 Text", placeholder="Enter the text to generate voice...", lines=3)
speed = gr.Slider(0.3, 2.0, value=1.0, step=0.1, label="⚡ Speed")
with gr.Row():
source_image = gr.Image(label="Source image", type="filepath", elem_id="img2img_image")
with gr.Row():
# Các setting cho SadTalker
with gr.Column():
preprocess_type = gr.Radio(['crop', 'resize','full', 'extcrop', 'extfull'], value='crop', label='preprocess', info="How to handle input image?")
is_still_mode = gr.Checkbox(label="Still Mode (fewer head motion, works with preprocess `full`)")
enhancer = gr.Checkbox(label="GFPGAN as Face enhancer")
batch_size = gr.Slider(label="batch size in generation", step=1, maximum=10, value=1)
size_of_image = gr.Radio([256, 512], value=256, label='face model resolution', info="use 256/512 model?")
pose_style = gr.Slider(minimum=0, maximum=45, step=1, label="Pose style", value=0)
facerender = gr.Radio(['facevid2vid','pirender'], value='facevid2vid', label='facerender', info="which face render?")
exp_weight = gr.Slider(minimum=0, maximum=3, step=0.1, label="expression scale", value=1)
use_ref_video = gr.Checkbox(label="Use Reference Video")
ref_video = gr.Video(label="Reference Video", elem_id="vidref")
ref_info = gr.Radio(['pose', 'blink','pose+blink', 'all'], value='pose', label='Reference Video',info="How to borrow from reference Video?((fully transfer, aka, video driving mode))")
use_idle_mode = gr.Checkbox(label="Use Idle Animation")
length_of_audio = gr.Number(value=5, label="The length(seconds) of the generated video.")
blink_every = gr.Checkbox(label="use eye blink", value=True)
btn_generate = gr.Button("🔥 Generate Voice & Video")
with gr.Row():
output_audio = gr.Audio(label="🎧 Generated Audio", type="filepath")
gen_video = gr.Video(label="Generated video", format="mp4", scale=1)
btn_generate.click(
generate_voice_and_video,
inputs=[ref_audio, ref_text, gen_text, speed, source_image, 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=[output_audio, gen_video]
)
return sadtalker_interface
if __name__ == "__main__":
demo = sadtalker_demo()
demo.queue(max_size=10, api_open=True)
demo.launch(debug=True, server_name="0.0.0.0")