SadTalker vs MuseTalk — same-input portrait comparison Recorded: 28 October 2026 Page: https://sadtalker.ai/sadtalker-vs-musetalk Hardware: NVIDIA GeForce RTX 3090, 24,576 MiB VRAM. Input: shared synthetic portrait, 512 x 474 PNG; shared 8.000-second mono 16 kHz PCM WAV. Download portrait.png and speech.wav alongside this file. The files were prepared once, then passed unchanged to both models. Input and output SHA-256 hashes, exact revisions and package versions are in results.json. Each model has its own isolated Python environment. SETUP Follow each official project's setup and model-download instructions: https://github.com/OpenTalker/SadTalker https://github.com/TMElyralab/MuseTalk The recorded environments use: SadTalker: Python 3.10, PyTorch 2.1.2 + CUDA 12.1. MuseTalk: Python 3.10, PyTorch 2.0.1 + CUDA 11.8, MMCV 2.0.1. See results.json for the complete version strings and upstream revisions. FFmpeg must be available. The recorded environment was Linux x86_64. SADTALKER From the SadTalker repository, with its environment active, place the shared files in an inputs directory and run: python inference.py --source_image inputs/portrait.png --driven_audio inputs/speech.wav --result_dir results/comparison --size 256 --preprocess full --still --batch_size 2 --expression_scale 1 --pose_style 0 Enhancer and background enhancer are omitted (off). MUSETALK 1.5 From the MuseTalk repository, with its environment active, place the same shared files in an inputs directory. Save comparison.json containing: { "task_0": { "video_path": "inputs/portrait.png", "audio_path": "inputs/speech.wav", "result_name": "result.mp4" } } Run: python -m scripts.inference --inference_config comparison.json --result_dir results/comparison --unet_model_path models/musetalkV15/unet.pth --unet_config models/musetalkV15/musetalk.json --whisper_dir models/whisper --version v15 --fps 25 --batch_size 2 --extra_margin 10 --use_float16 --ffmpeg_path /usr/bin MEASUREMENT Two fresh-process renders per model ran sequentially after setup, in this order: SadTalker 1, MuseTalk 1, SadTalker 2, MuseTalk 2. All model files were local. Wall-clock timing used Python time.monotonic() around subprocess.run(). It includes loading, face preparation, generation, composition and MP4 export. Installation, downloads, input preparation, validation and browser-copy encoding are outside the timed interval. Fresh process means models are loaded again; operating-system disk caches may remain warm between runs. A separate thread sampled this command every 0.5 seconds: nvidia-smi --query-gpu=memory.used,utilization.gpu --format=csv,noheader,nounits The reported peak is whole-device sampled occupancy, including baseline use. It describes this run configuration; use it as an observation when planning memory, rather than a minimum GPU-memory requirement. VALIDATION ffprobe confirmed video and audio, 512 x 474 dimensions, 25 FPS, 200 frames and 8.000-second video/audio duration for each model's exports. Every exported MP4 completed this decode check: ffmpeg -v error -xerror -i result.mp4 -f null - PLAYBACK COPIES The embedded players use H.264 browser copies made after measurement: ffmpeg -i native.mp4 -c:v libx264 -crf 18 -pix_fmt yuv420p -c:a copy -movflags +faststart browser.mp4 No face enhancement was added during this conversion. Native exports are available as sadtalker-native.mp4 and musetalk-native.mp4. Run 1 supplies each embedded example. speech.vtt provides English captions. SCREENSHOTS The SadTalker screenshot comes from our community still-mode workflow guide: https://sadtalker.ai/sadtalker-still-mode The MuseTalk screenshots come from our community ComfyUI guide: https://musetalkai.com/comfyui/ They explain the interfaces and are separate from the CLI measurement above.