Introduce lip syncer weight
This commit is contained in:
@@ -218,3 +218,4 @@ face_enhancer_blend_range : Sequence[int] = create_int_range(0, 100, 1)
|
|||||||
face_enhancer_weight_range : Sequence[float] = create_float_range(0.0, 1.0, 0.05)
|
face_enhancer_weight_range : Sequence[float] = create_float_range(0.0, 1.0, 0.05)
|
||||||
frame_colorizer_blend_range : Sequence[int] = create_int_range(0, 100, 1)
|
frame_colorizer_blend_range : Sequence[int] = create_int_range(0, 100, 1)
|
||||||
frame_enhancer_blend_range : Sequence[int] = create_int_range(0, 100, 1)
|
frame_enhancer_blend_range : Sequence[int] = create_int_range(0, 100, 1)
|
||||||
|
lip_syncer_weight_range : Sequence[float] = create_float_range(0.0, 1.0, 0.05)
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import facefusion.jobs.job_manager
|
|||||||
import facefusion.jobs.job_store
|
import facefusion.jobs.job_store
|
||||||
import facefusion.processors.core as processors
|
import facefusion.processors.core as processors
|
||||||
from facefusion import config, content_analyser, face_classifier, face_detector, face_landmarker, face_masker, face_recognizer, inference_manager, logger, process_manager, state_manager, video_manager, voice_extractor, wording
|
from facefusion import config, content_analyser, face_classifier, face_detector, face_landmarker, face_masker, face_recognizer, inference_manager, logger, process_manager, state_manager, video_manager, voice_extractor, wording
|
||||||
|
from facefusion.common_helper import create_float_metavar
|
||||||
from facefusion.audio import create_empty_audio_frame, get_voice_frame, read_static_voice
|
from facefusion.audio import create_empty_audio_frame, get_voice_frame, read_static_voice
|
||||||
from facefusion.common_helper import get_first
|
from facefusion.common_helper import get_first
|
||||||
from facefusion.download import conditional_download_hashes, conditional_download_sources, resolve_download_url
|
from facefusion.download import conditional_download_hashes, conditional_download_sources, resolve_download_url
|
||||||
@@ -94,11 +95,13 @@ def register_args(program : ArgumentParser) -> None:
|
|||||||
group_processors = find_argument_group(program, 'processors')
|
group_processors = find_argument_group(program, 'processors')
|
||||||
if group_processors:
|
if group_processors:
|
||||||
group_processors.add_argument('--lip-syncer-model', help = wording.get('help.lip_syncer_model'), default = config.get_str_value('processors', 'lip_syncer_model', 'wav2lip_gan_96'), choices = processors_choices.lip_syncer_models)
|
group_processors.add_argument('--lip-syncer-model', help = wording.get('help.lip_syncer_model'), default = config.get_str_value('processors', 'lip_syncer_model', 'wav2lip_gan_96'), choices = processors_choices.lip_syncer_models)
|
||||||
facefusion.jobs.job_store.register_step_keys([ 'lip_syncer_model' ])
|
group_processors.add_argument('--lip-syncer-weight', help = wording.get('help.lip_syncer_weight'), type = float, default = config.get_float_value('processors', 'lip_syncer_weight', '0.5'), choices = processors_choices.lip_syncer_weight_range, metavar = create_float_metavar(processors_choices.lip_syncer_weight_range))
|
||||||
|
facefusion.jobs.job_store.register_step_keys([ 'lip_syncer_model', 'lip_syncer_weight' ])
|
||||||
|
|
||||||
|
|
||||||
def apply_args(args : Args, apply_state_item : ApplyStateItem) -> None:
|
def apply_args(args : Args, apply_state_item : ApplyStateItem) -> None:
|
||||||
apply_state_item('lip_syncer_model', args.get('lip_syncer_model'))
|
apply_state_item('lip_syncer_model', args.get('lip_syncer_model'))
|
||||||
|
apply_state_item('lip_syncer_weight', args.get('lip_syncer_weight'))
|
||||||
|
|
||||||
|
|
||||||
def pre_check() -> bool:
|
def pre_check() -> bool:
|
||||||
@@ -186,6 +189,7 @@ def prepare_audio_frame(temp_audio_frame : AudioFrame) -> AudioFrame:
|
|||||||
temp_audio_frame = numpy.maximum(numpy.exp(-5 * numpy.log(10)), temp_audio_frame)
|
temp_audio_frame = numpy.maximum(numpy.exp(-5 * numpy.log(10)), temp_audio_frame)
|
||||||
temp_audio_frame = numpy.log10(temp_audio_frame) * 1.6 + 3.2
|
temp_audio_frame = numpy.log10(temp_audio_frame) * 1.6 + 3.2
|
||||||
temp_audio_frame = temp_audio_frame.clip(-4, 4).astype(numpy.float32)
|
temp_audio_frame = temp_audio_frame.clip(-4, 4).astype(numpy.float32)
|
||||||
|
temp_audio_frame = temp_audio_frame * (state_manager.get_item('lip_syncer_weight') * 2.0)
|
||||||
temp_audio_frame = numpy.expand_dims(temp_audio_frame, axis = (0, 1))
|
temp_audio_frame = numpy.expand_dims(temp_audio_frame, axis = (0, 1))
|
||||||
return temp_audio_frame
|
return temp_audio_frame
|
||||||
|
|
||||||
|
|||||||
@@ -103,7 +103,8 @@ ProcessorStateKey = Literal\
|
|||||||
'frame_colorizer_blend',
|
'frame_colorizer_blend',
|
||||||
'frame_enhancer_model',
|
'frame_enhancer_model',
|
||||||
'frame_enhancer_blend',
|
'frame_enhancer_blend',
|
||||||
'lip_syncer_model'
|
'lip_syncer_model',
|
||||||
|
'lip_syncer_weight'
|
||||||
]
|
]
|
||||||
ProcessorState = TypedDict('ProcessorState',
|
ProcessorState = TypedDict('ProcessorState',
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,18 +1,21 @@
|
|||||||
from typing import List, Optional
|
from typing import List, Optional, Tuple
|
||||||
|
|
||||||
import gradio
|
import gradio
|
||||||
|
|
||||||
from facefusion import state_manager, wording
|
from facefusion import state_manager, wording
|
||||||
|
from facefusion.common_helper import calc_float_step
|
||||||
from facefusion.processors import choices as processors_choices
|
from facefusion.processors import choices as processors_choices
|
||||||
from facefusion.processors.core import load_processor_module
|
from facefusion.processors.core import load_processor_module
|
||||||
from facefusion.processors.types import LipSyncerModel
|
from facefusion.processors.types import LipSyncerModel
|
||||||
from facefusion.uis.core import get_ui_component, register_ui_component
|
from facefusion.uis.core import get_ui_component, register_ui_component
|
||||||
|
|
||||||
LIP_SYNCER_MODEL_DROPDOWN : Optional[gradio.Dropdown] = None
|
LIP_SYNCER_MODEL_DROPDOWN : Optional[gradio.Dropdown] = None
|
||||||
|
LIP_SYNCER_WEIGHT_SLIDER : Optional[gradio.Slider] = None
|
||||||
|
|
||||||
|
|
||||||
def render() -> None:
|
def render() -> None:
|
||||||
global LIP_SYNCER_MODEL_DROPDOWN
|
global LIP_SYNCER_MODEL_DROPDOWN
|
||||||
|
global LIP_SYNCER_WEIGHT_SLIDER
|
||||||
|
|
||||||
has_lip_syncer = 'lip_syncer' in state_manager.get_item('processors')
|
has_lip_syncer = 'lip_syncer' in state_manager.get_item('processors')
|
||||||
LIP_SYNCER_MODEL_DROPDOWN = gradio.Dropdown(
|
LIP_SYNCER_MODEL_DROPDOWN = gradio.Dropdown(
|
||||||
@@ -21,20 +24,30 @@ def render() -> None:
|
|||||||
value = state_manager.get_item('lip_syncer_model'),
|
value = state_manager.get_item('lip_syncer_model'),
|
||||||
visible = has_lip_syncer
|
visible = has_lip_syncer
|
||||||
)
|
)
|
||||||
|
LIP_SYNCER_WEIGHT_SLIDER = gradio.Slider(
|
||||||
|
label = wording.get('uis.lip_syncer_weight_slider'),
|
||||||
|
value = state_manager.get_item('lip_syncer_weight'),
|
||||||
|
step = calc_float_step(processors_choices.lip_syncer_weight_range),
|
||||||
|
minimum = processors_choices.lip_syncer_weight_range[0],
|
||||||
|
maximum = processors_choices.lip_syncer_weight_range[-1],
|
||||||
|
visible = has_lip_syncer
|
||||||
|
)
|
||||||
register_ui_component('lip_syncer_model_dropdown', LIP_SYNCER_MODEL_DROPDOWN)
|
register_ui_component('lip_syncer_model_dropdown', LIP_SYNCER_MODEL_DROPDOWN)
|
||||||
|
register_ui_component('lip_syncer_weight_slider', LIP_SYNCER_WEIGHT_SLIDER)
|
||||||
|
|
||||||
|
|
||||||
def listen() -> None:
|
def listen() -> None:
|
||||||
LIP_SYNCER_MODEL_DROPDOWN.change(update_lip_syncer_model, inputs = LIP_SYNCER_MODEL_DROPDOWN, outputs = LIP_SYNCER_MODEL_DROPDOWN)
|
LIP_SYNCER_MODEL_DROPDOWN.change(update_lip_syncer_model, inputs = LIP_SYNCER_MODEL_DROPDOWN, outputs = LIP_SYNCER_MODEL_DROPDOWN)
|
||||||
|
LIP_SYNCER_WEIGHT_SLIDER.release(update_lip_syncer_weight, inputs = LIP_SYNCER_WEIGHT_SLIDER)
|
||||||
|
|
||||||
processors_checkbox_group = get_ui_component('processors_checkbox_group')
|
processors_checkbox_group = get_ui_component('processors_checkbox_group')
|
||||||
if processors_checkbox_group:
|
if processors_checkbox_group:
|
||||||
processors_checkbox_group.change(remote_update, inputs = processors_checkbox_group, outputs = LIP_SYNCER_MODEL_DROPDOWN)
|
processors_checkbox_group.change(remote_update, inputs = processors_checkbox_group, outputs = [ LIP_SYNCER_MODEL_DROPDOWN, LIP_SYNCER_WEIGHT_SLIDER ])
|
||||||
|
|
||||||
|
|
||||||
def remote_update(processors : List[str]) -> gradio.Dropdown:
|
def remote_update(processors : List[str]) -> Tuple[gradio.Dropdown, gradio.Slider]:
|
||||||
has_lip_syncer = 'lip_syncer' in processors
|
has_lip_syncer = 'lip_syncer' in processors
|
||||||
return gradio.Dropdown(visible = has_lip_syncer)
|
return gradio.Dropdown(visible = has_lip_syncer), gradio.Slider(visible = has_lip_syncer)
|
||||||
|
|
||||||
|
|
||||||
def update_lip_syncer_model(lip_syncer_model : LipSyncerModel) -> gradio.Dropdown:
|
def update_lip_syncer_model(lip_syncer_model : LipSyncerModel) -> gradio.Dropdown:
|
||||||
@@ -45,3 +58,7 @@ def update_lip_syncer_model(lip_syncer_model : LipSyncerModel) -> gradio.Dropdow
|
|||||||
if lip_syncer_module.pre_check():
|
if lip_syncer_module.pre_check():
|
||||||
return gradio.Dropdown(value = state_manager.get_item('lip_syncer_model'))
|
return gradio.Dropdown(value = state_manager.get_item('lip_syncer_model'))
|
||||||
return gradio.Dropdown()
|
return gradio.Dropdown()
|
||||||
|
|
||||||
|
|
||||||
|
def update_lip_syncer_weight(lip_syncer_weight : float) -> None:
|
||||||
|
state_manager.set_item('lip_syncer_weight', lip_syncer_weight)
|
||||||
|
|||||||
@@ -131,6 +131,7 @@ def listen() -> None:
|
|||||||
'face_enhancer_weight_slider',
|
'face_enhancer_weight_slider',
|
||||||
'frame_colorizer_blend_slider',
|
'frame_colorizer_blend_slider',
|
||||||
'frame_enhancer_blend_slider',
|
'frame_enhancer_blend_slider',
|
||||||
|
'lip_syncer_weight_slider',
|
||||||
'reference_face_distance_slider',
|
'reference_face_distance_slider',
|
||||||
'face_selector_age_range_slider',
|
'face_selector_age_range_slider',
|
||||||
'face_mask_blur_slider',
|
'face_mask_blur_slider',
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ ComponentName = Literal\
|
|||||||
'frame_enhancer_model_dropdown',
|
'frame_enhancer_model_dropdown',
|
||||||
'job_list_job_status_checkbox_group',
|
'job_list_job_status_checkbox_group',
|
||||||
'lip_syncer_model_dropdown',
|
'lip_syncer_model_dropdown',
|
||||||
|
'lip_syncer_weight_slider',
|
||||||
'output_image',
|
'output_image',
|
||||||
'output_video',
|
'output_video',
|
||||||
'output_video_fps_slider',
|
'output_video_fps_slider',
|
||||||
|
|||||||
@@ -303,6 +303,7 @@ WORDING : Dict[str, Any] =\
|
|||||||
'job_runner_job_action_dropdown': 'JOB ACTION',
|
'job_runner_job_action_dropdown': 'JOB ACTION',
|
||||||
'job_runner_job_id_dropdown': 'JOB ID',
|
'job_runner_job_id_dropdown': 'JOB ID',
|
||||||
'lip_syncer_model_dropdown': 'LIP SYNCER MODEL',
|
'lip_syncer_model_dropdown': 'LIP SYNCER MODEL',
|
||||||
|
'lip_syncer_weight_slider': 'LIP SYNCER WEIGHT',
|
||||||
'log_level_dropdown': 'LOG LEVEL',
|
'log_level_dropdown': 'LOG LEVEL',
|
||||||
'output_audio_encoder_dropdown': 'OUTPUT AUDIO ENCODER',
|
'output_audio_encoder_dropdown': 'OUTPUT AUDIO ENCODER',
|
||||||
'output_audio_quality_slider': 'OUTPUT AUDIO QUALITY',
|
'output_audio_quality_slider': 'OUTPUT AUDIO QUALITY',
|
||||||
|
|||||||
Reference in New Issue
Block a user