diff --git a/facefusion/apis/endpoints/capabilities.py b/facefusion/apis/endpoints/capabilities.py index 13487b5e..0af0b811 100644 --- a/facefusion/apis/endpoints/capabilities.py +++ b/facefusion/apis/endpoints/capabilities.py @@ -3,6 +3,7 @@ from starlette.responses import JSONResponse from starlette.status import HTTP_200_OK import facefusion.choices +from facefusion import args_store async def get_capabilities(request : Request) -> JSONResponse: @@ -13,6 +14,7 @@ async def get_capabilities(request : Request) -> JSONResponse: 'audio': facefusion.choices.audio_formats, 'image': facefusion.choices.image_formats, 'video': facefusion.choices.video_formats - } + }, + 'arguments': args_store.get_capabilities() } return JSONResponse(capabilities, status_code = HTTP_200_OK) diff --git a/facefusion/args_store.py b/facefusion/args_store.py index a937e0fc..c4355068 100644 --- a/facefusion/args_store.py +++ b/facefusion/args_store.py @@ -1,43 +1,72 @@ -from typing import List +from argparse import Action +from typing import Any, Dict, List from facefusion.types import Args, ArgsStore, Scope ARGS_STORE : ArgsStore =\ { - 'api': [], - 'cli': [], - 'sys': [] + 'api': {}, + 'cli': {}, + 'sys': {} } def get_api_args() -> List[str]: - return ARGS_STORE.get('api') + return list(ARGS_STORE.get('api').keys()) def get_sys_args() -> List[str]: - return ARGS_STORE.get('sys') + return list(ARGS_STORE.get('sys').keys()) def get_cli_args() -> List[str]: - return ARGS_STORE.get('cli') + return list(ARGS_STORE.get('cli').keys()) + + +def get_capabilities() -> Dict[str, Any]: + return ARGS_STORE.get('api') def register_args(keys : List[str], scopes : List[Scope]) -> None: for key in keys: + entry =\ + { + 'default': None, + 'choices': None + } + for scope in scopes: if scope == 'api': - ARGS_STORE['api'].append(key) + ARGS_STORE['api'][key] = entry if scope == 'cli': - ARGS_STORE['cli'].append(key) + ARGS_STORE['cli'][key] = entry if scope == 'sys': - ARGS_STORE['sys'].append(key) + ARGS_STORE['sys'][key] = entry + + +def register_argument(action : Action, scopes : List[Scope]) -> None: + key = action.dest + choices : Any = list(action.choices) if action.choices else None + entry =\ + { + 'default': action.default, + 'choices': choices + } + + for scope in scopes: + if scope == 'api': + ARGS_STORE['api'][key] = entry + if scope == 'cli': + ARGS_STORE['cli'][key] = entry + if scope == 'sys': + ARGS_STORE['sys'][key] = entry def filter_api_args(args : Args) -> Args: api_args =\ { - key: args.get(key) for key in args if key in get_api_args() #type:ignore[literal-required] + key: args.get(key) for key in args if key in ARGS_STORE.get('api') #type:ignore[literal-required] } return api_args @@ -45,7 +74,7 @@ def filter_api_args(args : Args) -> Args: def filter_sys_args(args : Args) -> Args: sys_args =\ { - key: args.get(key) for key in args if key in get_sys_args() #type:ignore[literal-required] + key: args.get(key) for key in args if key in ARGS_STORE.get('sys') #type:ignore[literal-required] } return sys_args @@ -53,7 +82,7 @@ def filter_sys_args(args : Args) -> Args: def filter_cli_args(args : Args) -> Args: cli_args =\ { - key: args.get(key) for key in args if key in get_cli_args() #type:ignore[literal-required] + key: args.get(key) for key in args if key in ARGS_STORE.get('cli') #type:ignore[literal-required] } return cli_args @@ -61,6 +90,6 @@ def filter_cli_args(args : Args) -> Args: def filter_step_args(args : Args) -> Args: step_args =\ { - key: args.get(key) for key in args if key in get_cli_args() and key not in get_sys_args() #type:ignore[literal-required] + key: args.get(key) for key in args if key in ARGS_STORE.get('cli') and key not in ARGS_STORE.get('sys') #type:ignore[literal-required] } return step_args diff --git a/facefusion/processors/modules/age_modifier/core.py b/facefusion/processors/modules/age_modifier/core.py index dfd1be4d..98f9d611 100755 --- a/facefusion/processors/modules/age_modifier/core.py +++ b/facefusion/processors/modules/age_modifier/core.py @@ -29,41 +29,6 @@ from facefusion.vision import match_frame_color, read_static_image, read_static_ def create_static_model_set(download_scope : DownloadScope) -> ModelSet: return\ { - 'fran': - { - '__metadata__': - { - 'vendor': 'ry-lu', - 'license': 'mit', - 'year': 2024 - }, - 'hashes': - { - 'age_modifier': - { - 'url': resolve_download_url('models-3.6.0', 'fran.hash'), - 'path': resolve_relative_path('../.assets/models/fran.hash') - } - }, - 'sources': - { - 'age_modifier': - { - 'url': resolve_download_url('models-3.6.0', 'fran.onnx'), - 'path': resolve_relative_path('../.assets/models/fran.onnx') - } - }, - 'templates': - { - 'target': 'ffhq_512', - }, - 'sizes': - { - 'target': (1024, 1024), - }, - 'mean': [ 0.0, 0.0, 0.0 ], - 'standard_deviation': [ 1.0, 1.0, 1.0 ] - }, 'styleganex_age': { '__metadata__': @@ -97,9 +62,7 @@ def create_static_model_set(download_scope : DownloadScope) -> ModelSet: { 'target': (256, 256), 'target_with_background': (384, 384) - }, - 'mean': [ 0.5, 0.5, 0.5 ], - 'standard_deviation': [ 0.5, 0.5, 0.5 ] + } } } @@ -124,9 +87,10 @@ def get_model_options() -> ModelOptions: def register_args(program : ArgumentParser) -> None: group_processors = find_argument_group(program, 'processors') if group_processors: - group_processors.add_argument('--age-modifier-model', help = translator.get('help.model', __package__), default = config.get_str_value('processors', 'age_modifier_model', 'fran'), choices = age_modifier_choices.age_modifier_models) - group_processors.add_argument('--age-modifier-direction', help = translator.get('help.direction', __package__), type = int, default = config.get_int_value('processors', 'age_modifier_direction', '0'), choices = age_modifier_choices.age_modifier_direction_range, metavar = create_int_metavar(age_modifier_choices.age_modifier_direction_range)) - facefusion.args_store.register_args([ 'age_modifier_model', 'age_modifier_direction' ], scopes = [ 'api', 'cli' ]) + age_modifier_model_action = group_processors.add_argument('--age-modifier-model', help = translator.get('help.model', __package__), default = config.get_str_value('processors', 'age_modifier_model', 'styleganex_age'), choices = age_modifier_choices.age_modifier_models) + age_modifier_direction_action = group_processors.add_argument('--age-modifier-direction', help = translator.get('help.direction', __package__), type = int, default = config.get_int_value('processors', 'age_modifier_direction', '0'), choices = age_modifier_choices.age_modifier_direction_range, metavar = create_int_metavar(age_modifier_choices.age_modifier_direction_range)) + facefusion.args_store.register_argument(age_modifier_model_action, scopes = [ 'api', 'cli' ]) + facefusion.args_store.register_argument(age_modifier_direction_action, scopes = [ 'api', 'cli' ]) def apply_args(args : Args, apply_state_item : ApplyStateItem) -> None: @@ -172,57 +136,32 @@ def modify_age(target_face : Face, temp_vision_frame : VisionFrame) -> VisionFra model_sizes = get_model_options().get('sizes') face_landmark_5 = target_face.landmark_set.get('5/68').copy() crop_vision_frame, affine_matrix = warp_face_by_face_landmark_5(temp_vision_frame, face_landmark_5, model_templates.get('target'), model_sizes.get('target')) + extend_face_landmark_5 = scale_face_landmark_5(face_landmark_5, 0.875) + extend_vision_frame, extend_affine_matrix = warp_face_by_face_landmark_5(temp_vision_frame, extend_face_landmark_5, model_templates.get('target_with_background'), model_sizes.get('target_with_background')) + extend_vision_frame_raw = extend_vision_frame.copy() + box_mask = create_box_mask(extend_vision_frame, state_manager.get_item('face_mask_blur'), (0, 0, 0, 0)) + crop_masks =\ + [ + box_mask + ] - if state_manager.get_item('age_modifier_model') == 'fran': - box_mask = create_box_mask(crop_vision_frame, state_manager.get_item('face_mask_blur'), (0, 0, 0, 0)) - crop_masks =\ - [ - box_mask - ] + if 'occlusion' in state_manager.get_item('face_mask_types'): + occlusion_mask = create_occlusion_mask(crop_vision_frame) + temp_matrix = merge_matrix([ extend_affine_matrix, cv2.invertAffineTransform(affine_matrix) ]) + occlusion_mask = cv2.warpAffine(occlusion_mask, temp_matrix, model_sizes.get('target_with_background')) + crop_masks.append(occlusion_mask) - if 'occlusion' in state_manager.get_item('face_mask_types'): - occlusion_mask = create_occlusion_mask(crop_vision_frame) - crop_masks.append(occlusion_mask) - - crop_vision_frame = prepare_vision_frame(crop_vision_frame) - target_age = numpy.mean(target_face.age) - age_modifier_direction = numpy.array([ target_age, target_age + state_manager.get_item('age_modifier_direction') ], dtype = numpy.float32) / 100 - age_modifier_direction = age_modifier_direction.clip(0, 1) - crop_vision_frame = forward(crop_vision_frame, crop_vision_frame, age_modifier_direction) - crop_vision_frame = normalize_vision_frame(crop_vision_frame) - crop_mask = numpy.minimum.reduce(crop_masks).clip(0, 1) - paste_vision_frame = paste_back(temp_vision_frame, crop_vision_frame, crop_mask, affine_matrix) - return paste_vision_frame - - if state_manager.get_item('age_modifier_model') == 'styleganex_age': - extend_face_landmark_5 = scale_face_landmark_5(face_landmark_5, 0.875) - extend_vision_frame, extend_affine_matrix = warp_face_by_face_landmark_5(temp_vision_frame, extend_face_landmark_5, model_templates.get('target_with_background'), model_sizes.get('target_with_background')) - extend_vision_frame_raw = extend_vision_frame.copy() - box_mask = create_box_mask(extend_vision_frame, state_manager.get_item('face_mask_blur'), (0, 0, 0, 0)) - crop_masks =\ - [ - box_mask - ] - - if 'occlusion' in state_manager.get_item('face_mask_types'): - occlusion_mask = create_occlusion_mask(crop_vision_frame) - temp_matrix = merge_matrix([ extend_affine_matrix, cv2.invertAffineTransform(affine_matrix) ]) - occlusion_mask = cv2.warpAffine(occlusion_mask, temp_matrix, model_sizes.get('target_with_background')) - crop_masks.append(occlusion_mask) - - crop_vision_frame = prepare_vision_frame(crop_vision_frame) - extend_vision_frame = prepare_vision_frame(extend_vision_frame) - age_modifier_direction = numpy.array(numpy.interp(state_manager.get_item('age_modifier_direction'), [ -100, 100 ], [ 2.5, -2.5 ])).astype(numpy.float32) - extend_vision_frame = forward(crop_vision_frame, extend_vision_frame, age_modifier_direction) - extend_vision_frame = normalize_extend_frame(extend_vision_frame) - extend_vision_frame = match_frame_color(extend_vision_frame_raw, extend_vision_frame) - extend_affine_matrix *= (model_sizes.get('target')[0] * 4) / model_sizes.get('target_with_background')[0] - crop_mask = numpy.minimum.reduce(crop_masks).clip(0, 1) - crop_mask = cv2.resize(crop_mask, (model_sizes.get('target')[0] * 4, model_sizes.get('target')[1] * 4)) - paste_vision_frame = paste_back(temp_vision_frame, extend_vision_frame, crop_mask, extend_affine_matrix) - return paste_vision_frame - - return temp_vision_frame + crop_vision_frame = prepare_vision_frame(crop_vision_frame) + extend_vision_frame = prepare_vision_frame(extend_vision_frame) + age_modifier_direction = numpy.array(numpy.interp(state_manager.get_item('age_modifier_direction'), [ -100, 100 ], [ 2.5, -2.5 ])).astype(numpy.float32) + extend_vision_frame = forward(crop_vision_frame, extend_vision_frame, age_modifier_direction) + extend_vision_frame = normalize_extend_frame(extend_vision_frame) + extend_vision_frame = match_frame_color(extend_vision_frame_raw, extend_vision_frame) + extend_affine_matrix *= (model_sizes.get('target')[0] * 4) / model_sizes.get('target_with_background')[0] + crop_mask = numpy.minimum.reduce(crop_masks).clip(0, 1) + crop_mask = cv2.resize(crop_mask, (model_sizes.get('target')[0] * 4, model_sizes.get('target')[1] * 4)) + paste_vision_frame = paste_back(temp_vision_frame, extend_vision_frame, crop_mask, extend_affine_matrix) + return paste_vision_frame def forward(crop_vision_frame : VisionFrame, extend_vision_frame : VisionFrame, age_modifier_direction : AgeModifierDirection) -> VisionFrame: @@ -247,24 +186,12 @@ def forward(crop_vision_frame : VisionFrame, extend_vision_frame : VisionFrame, def prepare_vision_frame(vision_frame : VisionFrame) -> VisionFrame: - model_mean = get_model_options().get('mean') - model_standard_deviation = get_model_options().get('standard_deviation') vision_frame = vision_frame[:, :, ::-1] / 255.0 - vision_frame = (vision_frame - model_mean) / model_standard_deviation + vision_frame = (vision_frame - 0.5) / 0.5 vision_frame = numpy.expand_dims(vision_frame.transpose(2, 0, 1), axis = 0).astype(numpy.float32) return vision_frame -def normalize_vision_frame(vision_frame : VisionFrame) -> VisionFrame: - model_mean = get_model_options().get('mean') - model_standard_deviation = get_model_options().get('standard_deviation') - vision_frame = vision_frame.transpose(1, 2, 0) - vision_frame = vision_frame * model_standard_deviation + model_mean - vision_frame = vision_frame.clip(0, 1) - vision_frame = vision_frame[:, :, ::-1] * 255 - return vision_frame - - def normalize_extend_frame(extend_vision_frame : VisionFrame) -> VisionFrame: model_sizes = get_model_options().get('sizes') extend_vision_frame = numpy.clip(extend_vision_frame, -1, 1) diff --git a/facefusion/processors/modules/background_remover/core.py b/facefusion/processors/modules/background_remover/core.py index dda62415..751150df 100644 --- a/facefusion/processors/modules/background_remover/core.py +++ b/facefusion/processors/modules/background_remover/core.py @@ -420,9 +420,10 @@ def get_model_options() -> ModelOptions: def register_args(program : ArgumentParser) -> None: group_processors = find_argument_group(program, 'processors') if group_processors: - group_processors.add_argument('--background-remover-model', help = translator.get('help.model', __package__), default = config.get_str_value('processors', 'background_remover_model', 'rmbg_2.0'), choices = background_remover_choices.background_remover_models) - group_processors.add_argument('--background-remover-color', help = translator.get('help.color', __package__), type = partial(sanitize_int_range, int_range = background_remover_choices.background_remover_color_range), default = config.get_int_list('processors', 'background_remover_color', '0 0 0 0'), nargs = '+') - facefusion.args_store.register_args([ 'background_remover_model', 'background_remover_color' ], scopes = [ 'api', 'cli' ]) + background_remover_model_action = group_processors.add_argument('--background-remover-model', help = translator.get('help.model', __package__), default = config.get_str_value('processors', 'background_remover_model', 'rmbg_2.0'), choices = background_remover_choices.background_remover_models) + background_remover_color_action = group_processors.add_argument('--background-remover-color', help = translator.get('help.color', __package__), type = partial(sanitize_int_range, int_range = background_remover_choices.background_remover_color_range), default = config.get_int_list('processors', 'background_remover_color', '0 0 0 0'), nargs = '+') + facefusion.args_store.register_argument(background_remover_model_action, scopes = [ 'api', 'cli' ]) + facefusion.args_store.register_argument(background_remover_color_action, scopes = [ 'api', 'cli' ]) def apply_args(args : Args, apply_state_item : ApplyStateItem) -> None: diff --git a/facefusion/processors/modules/deep_swapper/core.py b/facefusion/processors/modules/deep_swapper/core.py index 577df558..9b382ad2 100755 --- a/facefusion/processors/modules/deep_swapper/core.py +++ b/facefusion/processors/modules/deep_swapper/core.py @@ -276,9 +276,10 @@ def get_model_size() -> Size: def register_args(program : ArgumentParser) -> None: group_processors = find_argument_group(program, 'processors') if group_processors: - group_processors.add_argument('--deep-swapper-model', help = translator.get('help.model', __package__), default = config.get_str_value('processors', 'deep_swapper_model', 'iperov/elon_musk_224'), choices = deep_swapper_choices.deep_swapper_models) - group_processors.add_argument('--deep-swapper-morph', help = translator.get('help.morph', __package__), type = int, default = config.get_int_value('processors', 'deep_swapper_morph', '100'), choices = deep_swapper_choices.deep_swapper_morph_range, metavar = create_int_metavar(deep_swapper_choices.deep_swapper_morph_range)) - facefusion.args_store.register_args([ 'deep_swapper_model', 'deep_swapper_morph' ], scopes = [ 'api', 'cli' ]) + deep_swapper_model_action = group_processors.add_argument('--deep-swapper-model', help = translator.get('help.model', __package__), default = config.get_str_value('processors', 'deep_swapper_model', 'iperov/elon_musk_224'), choices = deep_swapper_choices.deep_swapper_models) + deep_swapper_morph_action = group_processors.add_argument('--deep-swapper-morph', help = translator.get('help.morph', __package__), type = int, default = config.get_int_value('processors', 'deep_swapper_morph', '100'), choices = deep_swapper_choices.deep_swapper_morph_range, metavar = create_int_metavar(deep_swapper_choices.deep_swapper_morph_range)) + facefusion.args_store.register_argument(deep_swapper_model_action, scopes = [ 'api', 'cli' ]) + facefusion.args_store.register_argument(deep_swapper_morph_action, scopes = [ 'api', 'cli' ]) def apply_args(args : Args, apply_state_item : ApplyStateItem) -> None: diff --git a/facefusion/processors/modules/expression_restorer/core.py b/facefusion/processors/modules/expression_restorer/core.py index 2793be8e..bfa731fc 100755 --- a/facefusion/processors/modules/expression_restorer/core.py +++ b/facefusion/processors/modules/expression_restorer/core.py @@ -99,10 +99,12 @@ def get_model_options() -> ModelOptions: def register_args(program : ArgumentParser) -> None: group_processors = find_argument_group(program, 'processors') if group_processors: - group_processors.add_argument('--expression-restorer-model', help = translator.get('help.model', __package__), default = config.get_str_value('processors', 'expression_restorer_model', 'live_portrait'), choices = expression_restorer_choices.expression_restorer_models) - group_processors.add_argument('--expression-restorer-factor', help = translator.get('help.factor', __package__), type = int, default = config.get_int_value('processors', 'expression_restorer_factor', '80'), choices = expression_restorer_choices.expression_restorer_factor_range, metavar = create_int_metavar(expression_restorer_choices.expression_restorer_factor_range)) - group_processors.add_argument('--expression-restorer-areas', help = translator.get('help.areas', __package__).format(choices = ', '.join(expression_restorer_choices.expression_restorer_areas)), default = config.get_str_list('processors', 'expression_restorer_areas', ' '.join(expression_restorer_choices.expression_restorer_areas)), choices = expression_restorer_choices.expression_restorer_areas, nargs = '+', metavar = 'EXPRESSION_RESTORER_AREAS') - facefusion.args_store.register_args([ 'expression_restorer_model', 'expression_restorer_factor', 'expression_restorer_areas' ], scopes = [ 'api', 'cli' ]) + expression_restorer_model_action = group_processors.add_argument('--expression-restorer-model', help = translator.get('help.model', __package__), default = config.get_str_value('processors', 'expression_restorer_model', 'live_portrait'), choices = expression_restorer_choices.expression_restorer_models) + expression_restorer_factor_action = group_processors.add_argument('--expression-restorer-factor', help = translator.get('help.factor', __package__), type = int, default = config.get_int_value('processors', 'expression_restorer_factor', '80'), choices = expression_restorer_choices.expression_restorer_factor_range, metavar = create_int_metavar(expression_restorer_choices.expression_restorer_factor_range)) + expression_restorer_areas_action = group_processors.add_argument('--expression-restorer-areas', help = translator.get('help.areas', __package__).format(choices = ', '.join(expression_restorer_choices.expression_restorer_areas)), default = config.get_str_list('processors', 'expression_restorer_areas', ' '.join(expression_restorer_choices.expression_restorer_areas)), choices = expression_restorer_choices.expression_restorer_areas, nargs = '+', metavar = 'EXPRESSION_RESTORER_AREAS') + facefusion.args_store.register_argument(expression_restorer_model_action, scopes = [ 'api', 'cli' ]) + facefusion.args_store.register_argument(expression_restorer_factor_action, scopes = [ 'api', 'cli' ]) + facefusion.args_store.register_argument(expression_restorer_areas_action, scopes = [ 'api', 'cli' ]) def apply_args(args : Args, apply_state_item : ApplyStateItem) -> None: diff --git a/facefusion/processors/modules/face_debugger/core.py b/facefusion/processors/modules/face_debugger/core.py index 7ece4416..90970497 100755 --- a/facefusion/processors/modules/face_debugger/core.py +++ b/facefusion/processors/modules/face_debugger/core.py @@ -30,8 +30,8 @@ def clear_inference_pool() -> None: def register_args(program : ArgumentParser) -> None: group_processors = find_argument_group(program, 'processors') if group_processors: - group_processors.add_argument('--face-debugger-items', help = translator.get('help.items', __package__).format(choices = ', '.join(face_debugger_choices.face_debugger_items)), default = config.get_str_list('processors', 'face_debugger_items', 'face-landmark-5/68 face-mask'), choices = face_debugger_choices.face_debugger_items, nargs = '+', metavar = 'FACE_DEBUGGER_ITEMS') - facefusion.args_store.register_args([ 'face_debugger_items' ], scopes = [ 'api', 'cli' ]) + face_debugger_items_action = group_processors.add_argument('--face-debugger-items', help = translator.get('help.items', __package__).format(choices = ', '.join(face_debugger_choices.face_debugger_items)), default = config.get_str_list('processors', 'face_debugger_items', 'face-landmark-5/68 face-mask'), choices = face_debugger_choices.face_debugger_items, nargs = '+', metavar = 'FACE_DEBUGGER_ITEMS') + facefusion.args_store.register_argument(face_debugger_items_action, scopes = [ 'api', 'cli' ]) def apply_args(args : Args, apply_state_item : ApplyStateItem) -> None: diff --git a/facefusion/processors/modules/face_editor/core.py b/facefusion/processors/modules/face_editor/core.py index 41380bdb..ef559391 100755 --- a/facefusion/processors/modules/face_editor/core.py +++ b/facefusion/processors/modules/face_editor/core.py @@ -129,22 +129,36 @@ def get_model_options() -> ModelOptions: def register_args(program : ArgumentParser) -> None: group_processors = find_argument_group(program, 'processors') if group_processors: - group_processors.add_argument('--face-editor-model', help = translator.get('help.model', __package__), default = config.get_str_value('processors', 'face_editor_model', 'live_portrait'), choices = face_editor_choices.face_editor_models) - group_processors.add_argument('--face-editor-eyebrow-direction', help = translator.get('help.eyebrow_direction', __package__), type = float, default = config.get_float_value('processors', 'face_editor_eyebrow_direction', '0'), choices = face_editor_choices.face_editor_eyebrow_direction_range, metavar = create_float_metavar(face_editor_choices.face_editor_eyebrow_direction_range)) - group_processors.add_argument('--face-editor-eye-gaze-horizontal', help = translator.get('help.eye_gaze_horizontal', __package__), type = float, default = config.get_float_value('processors', 'face_editor_eye_gaze_horizontal', '0'), choices = face_editor_choices.face_editor_eye_gaze_horizontal_range, metavar = create_float_metavar(face_editor_choices.face_editor_eye_gaze_horizontal_range)) - group_processors.add_argument('--face-editor-eye-gaze-vertical', help = translator.get('help.eye_gaze_vertical', __package__), type = float, default = config.get_float_value('processors', 'face_editor_eye_gaze_vertical', '0'), choices = face_editor_choices.face_editor_eye_gaze_vertical_range, metavar = create_float_metavar(face_editor_choices.face_editor_eye_gaze_vertical_range)) - group_processors.add_argument('--face-editor-eye-open-ratio', help = translator.get('help.eye_open_ratio', __package__), type = float, default = config.get_float_value('processors', 'face_editor_eye_open_ratio', '0'), choices = face_editor_choices.face_editor_eye_open_ratio_range, metavar = create_float_metavar(face_editor_choices.face_editor_eye_open_ratio_range)) - group_processors.add_argument('--face-editor-lip-open-ratio', help = translator.get('help.lip_open_ratio', __package__), type = float, default = config.get_float_value('processors', 'face_editor_lip_open_ratio', '0'), choices = face_editor_choices.face_editor_lip_open_ratio_range, metavar = create_float_metavar(face_editor_choices.face_editor_lip_open_ratio_range)) - group_processors.add_argument('--face-editor-mouth-grim', help = translator.get('help.mouth_grim', __package__), type = float, default = config.get_float_value('processors', 'face_editor_mouth_grim', '0'), choices = face_editor_choices.face_editor_mouth_grim_range, metavar = create_float_metavar(face_editor_choices.face_editor_mouth_grim_range)) - group_processors.add_argument('--face-editor-mouth-pout', help = translator.get('help.mouth_pout', __package__), type = float, default = config.get_float_value('processors', 'face_editor_mouth_pout', '0'), choices = face_editor_choices.face_editor_mouth_pout_range, metavar = create_float_metavar(face_editor_choices.face_editor_mouth_pout_range)) - group_processors.add_argument('--face-editor-mouth-purse', help = translator.get('help.mouth_purse', __package__), type = float, default = config.get_float_value('processors', 'face_editor_mouth_purse', '0'), choices = face_editor_choices.face_editor_mouth_purse_range, metavar = create_float_metavar(face_editor_choices.face_editor_mouth_purse_range)) - group_processors.add_argument('--face-editor-mouth-smile', help = translator.get('help.mouth_smile', __package__), type = float, default = config.get_float_value('processors', 'face_editor_mouth_smile', '0'), choices = face_editor_choices.face_editor_mouth_smile_range, metavar = create_float_metavar(face_editor_choices.face_editor_mouth_smile_range)) - group_processors.add_argument('--face-editor-mouth-position-horizontal', help = translator.get('help.mouth_position_horizontal', __package__), type = float, default = config.get_float_value('processors', 'face_editor_mouth_position_horizontal', '0'), choices = face_editor_choices.face_editor_mouth_position_horizontal_range, metavar = create_float_metavar(face_editor_choices.face_editor_mouth_position_horizontal_range)) - group_processors.add_argument('--face-editor-mouth-position-vertical', help = translator.get('help.mouth_position_vertical', __package__), type = float, default = config.get_float_value('processors', 'face_editor_mouth_position_vertical', '0'), choices = face_editor_choices.face_editor_mouth_position_vertical_range, metavar = create_float_metavar(face_editor_choices.face_editor_mouth_position_vertical_range)) - group_processors.add_argument('--face-editor-head-pitch', help = translator.get('help.head_pitch', __package__), type = float, default = config.get_float_value('processors', 'face_editor_head_pitch', '0'), choices = face_editor_choices.face_editor_head_pitch_range, metavar = create_float_metavar(face_editor_choices.face_editor_head_pitch_range)) - group_processors.add_argument('--face-editor-head-yaw', help = translator.get('help.head_yaw', __package__), type = float, default = config.get_float_value('processors', 'face_editor_head_yaw', '0'), choices = face_editor_choices.face_editor_head_yaw_range, metavar = create_float_metavar(face_editor_choices.face_editor_head_yaw_range)) - group_processors.add_argument('--face-editor-head-roll', help = translator.get('help.head_roll', __package__), type = float, default = config.get_float_value('processors', 'face_editor_head_roll', '0'), choices = face_editor_choices.face_editor_head_roll_range, metavar = create_float_metavar(face_editor_choices.face_editor_head_roll_range)) - facefusion.args_store.register_args([ 'face_editor_model', 'face_editor_eyebrow_direction', 'face_editor_eye_gaze_horizontal', 'face_editor_eye_gaze_vertical', 'face_editor_eye_open_ratio', 'face_editor_lip_open_ratio', 'face_editor_mouth_grim', 'face_editor_mouth_pout', 'face_editor_mouth_purse', 'face_editor_mouth_smile', 'face_editor_mouth_position_horizontal', 'face_editor_mouth_position_vertical', 'face_editor_head_pitch', 'face_editor_head_yaw', 'face_editor_head_roll' ], scopes = [ 'api', 'cli' ]) + face_editor_model_action = group_processors.add_argument('--face-editor-model', help = translator.get('help.model', __package__), default = config.get_str_value('processors', 'face_editor_model', 'live_portrait'), choices = face_editor_choices.face_editor_models) + face_editor_eyebrow_direction_action = group_processors.add_argument('--face-editor-eyebrow-direction', help = translator.get('help.eyebrow_direction', __package__), type = float, default = config.get_float_value('processors', 'face_editor_eyebrow_direction', '0'), choices = face_editor_choices.face_editor_eyebrow_direction_range, metavar = create_float_metavar(face_editor_choices.face_editor_eyebrow_direction_range)) + face_editor_eye_gaze_horizontal_action = group_processors.add_argument('--face-editor-eye-gaze-horizontal', help = translator.get('help.eye_gaze_horizontal', __package__), type = float, default = config.get_float_value('processors', 'face_editor_eye_gaze_horizontal', '0'), choices = face_editor_choices.face_editor_eye_gaze_horizontal_range, metavar = create_float_metavar(face_editor_choices.face_editor_eye_gaze_horizontal_range)) + face_editor_eye_gaze_vertical_action = group_processors.add_argument('--face-editor-eye-gaze-vertical', help = translator.get('help.eye_gaze_vertical', __package__), type = float, default = config.get_float_value('processors', 'face_editor_eye_gaze_vertical', '0'), choices = face_editor_choices.face_editor_eye_gaze_vertical_range, metavar = create_float_metavar(face_editor_choices.face_editor_eye_gaze_vertical_range)) + face_editor_eye_open_ratio_action = group_processors.add_argument('--face-editor-eye-open-ratio', help = translator.get('help.eye_open_ratio', __package__), type = float, default = config.get_float_value('processors', 'face_editor_eye_open_ratio', '0'), choices = face_editor_choices.face_editor_eye_open_ratio_range, metavar = create_float_metavar(face_editor_choices.face_editor_eye_open_ratio_range)) + face_editor_lip_open_ratio_action = group_processors.add_argument('--face-editor-lip-open-ratio', help = translator.get('help.lip_open_ratio', __package__), type = float, default = config.get_float_value('processors', 'face_editor_lip_open_ratio', '0'), choices = face_editor_choices.face_editor_lip_open_ratio_range, metavar = create_float_metavar(face_editor_choices.face_editor_lip_open_ratio_range)) + face_editor_mouth_grim_action = group_processors.add_argument('--face-editor-mouth-grim', help = translator.get('help.mouth_grim', __package__), type = float, default = config.get_float_value('processors', 'face_editor_mouth_grim', '0'), choices = face_editor_choices.face_editor_mouth_grim_range, metavar = create_float_metavar(face_editor_choices.face_editor_mouth_grim_range)) + face_editor_mouth_pout_action = group_processors.add_argument('--face-editor-mouth-pout', help = translator.get('help.mouth_pout', __package__), type = float, default = config.get_float_value('processors', 'face_editor_mouth_pout', '0'), choices = face_editor_choices.face_editor_mouth_pout_range, metavar = create_float_metavar(face_editor_choices.face_editor_mouth_pout_range)) + face_editor_mouth_purse_action = group_processors.add_argument('--face-editor-mouth-purse', help = translator.get('help.mouth_purse', __package__), type = float, default = config.get_float_value('processors', 'face_editor_mouth_purse', '0'), choices = face_editor_choices.face_editor_mouth_purse_range, metavar = create_float_metavar(face_editor_choices.face_editor_mouth_purse_range)) + face_editor_mouth_smile_action = group_processors.add_argument('--face-editor-mouth-smile', help = translator.get('help.mouth_smile', __package__), type = float, default = config.get_float_value('processors', 'face_editor_mouth_smile', '0'), choices = face_editor_choices.face_editor_mouth_smile_range, metavar = create_float_metavar(face_editor_choices.face_editor_mouth_smile_range)) + face_editor_mouth_position_horizontal_action = group_processors.add_argument('--face-editor-mouth-position-horizontal', help = translator.get('help.mouth_position_horizontal', __package__), type = float, default = config.get_float_value('processors', 'face_editor_mouth_position_horizontal', '0'), choices = face_editor_choices.face_editor_mouth_position_horizontal_range, metavar = create_float_metavar(face_editor_choices.face_editor_mouth_position_horizontal_range)) + face_editor_mouth_position_vertical_action = group_processors.add_argument('--face-editor-mouth-position-vertical', help = translator.get('help.mouth_position_vertical', __package__), type = float, default = config.get_float_value('processors', 'face_editor_mouth_position_vertical', '0'), choices = face_editor_choices.face_editor_mouth_position_vertical_range, metavar = create_float_metavar(face_editor_choices.face_editor_mouth_position_vertical_range)) + face_editor_head_pitch_action = group_processors.add_argument('--face-editor-head-pitch', help = translator.get('help.head_pitch', __package__), type = float, default = config.get_float_value('processors', 'face_editor_head_pitch', '0'), choices = face_editor_choices.face_editor_head_pitch_range, metavar = create_float_metavar(face_editor_choices.face_editor_head_pitch_range)) + face_editor_head_yaw_action = group_processors.add_argument('--face-editor-head-yaw', help = translator.get('help.head_yaw', __package__), type = float, default = config.get_float_value('processors', 'face_editor_head_yaw', '0'), choices = face_editor_choices.face_editor_head_yaw_range, metavar = create_float_metavar(face_editor_choices.face_editor_head_yaw_range)) + face_editor_head_roll_action = group_processors.add_argument('--face-editor-head-roll', help = translator.get('help.head_roll', __package__), type = float, default = config.get_float_value('processors', 'face_editor_head_roll', '0'), choices = face_editor_choices.face_editor_head_roll_range, metavar = create_float_metavar(face_editor_choices.face_editor_head_roll_range)) + facefusion.args_store.register_argument(face_editor_model_action, scopes = [ 'api', 'cli' ]) + facefusion.args_store.register_argument(face_editor_eyebrow_direction_action, scopes = [ 'api', 'cli' ]) + facefusion.args_store.register_argument(face_editor_eye_gaze_horizontal_action, scopes = [ 'api', 'cli' ]) + facefusion.args_store.register_argument(face_editor_eye_gaze_vertical_action, scopes = [ 'api', 'cli' ]) + facefusion.args_store.register_argument(face_editor_eye_open_ratio_action, scopes = [ 'api', 'cli' ]) + facefusion.args_store.register_argument(face_editor_lip_open_ratio_action, scopes = [ 'api', 'cli' ]) + facefusion.args_store.register_argument(face_editor_mouth_grim_action, scopes = [ 'api', 'cli' ]) + facefusion.args_store.register_argument(face_editor_mouth_pout_action, scopes = [ 'api', 'cli' ]) + facefusion.args_store.register_argument(face_editor_mouth_purse_action, scopes = [ 'api', 'cli' ]) + facefusion.args_store.register_argument(face_editor_mouth_smile_action, scopes = [ 'api', 'cli' ]) + facefusion.args_store.register_argument(face_editor_mouth_position_horizontal_action, scopes = [ 'api', 'cli' ]) + facefusion.args_store.register_argument(face_editor_mouth_position_vertical_action, scopes = [ 'api', 'cli' ]) + facefusion.args_store.register_argument(face_editor_head_pitch_action, scopes = [ 'api', 'cli' ]) + facefusion.args_store.register_argument(face_editor_head_yaw_action, scopes = [ 'api', 'cli' ]) + facefusion.args_store.register_argument(face_editor_head_roll_action, scopes = [ 'api', 'cli' ]) def apply_args(args : Args, apply_state_item : ApplyStateItem) -> None: diff --git a/facefusion/processors/modules/face_enhancer/core.py b/facefusion/processors/modules/face_enhancer/core.py index 0b5a64fa..0337adf5 100755 --- a/facefusion/processors/modules/face_enhancer/core.py +++ b/facefusion/processors/modules/face_enhancer/core.py @@ -292,10 +292,12 @@ def get_model_options() -> ModelOptions: def register_args(program : ArgumentParser) -> None: group_processors = find_argument_group(program, 'processors') if group_processors: - group_processors.add_argument('--face-enhancer-model', help = translator.get('help.model', __package__), default = config.get_str_value('processors', 'face_enhancer_model', 'gfpgan_1.4'), choices = face_enhancer_choices.face_enhancer_models) - group_processors.add_argument('--face-enhancer-blend', help = translator.get('help.blend', __package__), type = int, default = config.get_int_value('processors', 'face_enhancer_blend', '80'), choices = face_enhancer_choices.face_enhancer_blend_range, metavar = create_int_metavar(face_enhancer_choices.face_enhancer_blend_range)) - group_processors.add_argument('--face-enhancer-weight', help = translator.get('help.weight', __package__), type = float, default = config.get_float_value('processors', 'face_enhancer_weight', '0.5'), choices = face_enhancer_choices.face_enhancer_weight_range, metavar = create_float_metavar(face_enhancer_choices.face_enhancer_weight_range)) - facefusion.args_store.register_args([ 'face_enhancer_model', 'face_enhancer_blend', 'face_enhancer_weight' ], scopes = [ 'api', 'cli' ]) + face_enhancer_model_action = group_processors.add_argument('--face-enhancer-model', help = translator.get('help.model', __package__), default = config.get_str_value('processors', 'face_enhancer_model', 'gfpgan_1.4'), choices = face_enhancer_choices.face_enhancer_models) + face_enhancer_blend_action = group_processors.add_argument('--face-enhancer-blend', help = translator.get('help.blend', __package__), type = int, default = config.get_int_value('processors', 'face_enhancer_blend', '80'), choices = face_enhancer_choices.face_enhancer_blend_range, metavar = create_int_metavar(face_enhancer_choices.face_enhancer_blend_range)) + face_enhancer_weight_action = group_processors.add_argument('--face-enhancer-weight', help = translator.get('help.weight', __package__), type = float, default = config.get_float_value('processors', 'face_enhancer_weight', '0.5'), choices = face_enhancer_choices.face_enhancer_weight_range, metavar = create_float_metavar(face_enhancer_choices.face_enhancer_weight_range)) + facefusion.args_store.register_argument(face_enhancer_model_action, scopes = [ 'api', 'cli' ]) + facefusion.args_store.register_argument(face_enhancer_blend_action, scopes = [ 'api', 'cli' ]) + facefusion.args_store.register_argument(face_enhancer_weight_action, scopes = [ 'api', 'cli' ]) def apply_args(args : Args, apply_state_item : ApplyStateItem) -> None: diff --git a/facefusion/processors/modules/face_swapper/core.py b/facefusion/processors/modules/face_swapper/core.py index 494ecf57..b10b7f47 100755 --- a/facefusion/processors/modules/face_swapper/core.py +++ b/facefusion/processors/modules/face_swapper/core.py @@ -513,12 +513,14 @@ def get_model_name() -> str: def register_args(program : ArgumentParser) -> None: group_processors = find_argument_group(program, 'processors') if group_processors: - group_processors.add_argument('--face-swapper-model', help = translator.get('help.model', __package__), default = config.get_str_value('processors', 'face_swapper_model', 'hyperswap_1a_256'), choices = face_swapper_choices.face_swapper_models) + face_swapper_model_action = group_processors.add_argument('--face-swapper-model', help = translator.get('help.model', __package__), default = config.get_str_value('processors', 'face_swapper_model', 'hyperswap_1a_256'), choices = face_swapper_choices.face_swapper_models) known_args, _ = program.parse_known_args() face_swapper_pixel_boost_choices = face_swapper_choices.face_swapper_set.get(known_args.face_swapper_model) - group_processors.add_argument('--face-swapper-pixel-boost', help = translator.get('help.pixel_boost', __package__), default = config.get_str_value('processors', 'face_swapper_pixel_boost', get_first(face_swapper_pixel_boost_choices)), choices = face_swapper_pixel_boost_choices) - group_processors.add_argument('--face-swapper-weight', help = translator.get('help.weight', __package__), type = float, default = config.get_float_value('processors', 'face_swapper_weight', '0.5'), choices = face_swapper_choices.face_swapper_weight_range) - facefusion.args_store.register_args([ 'face_swapper_model', 'face_swapper_pixel_boost', 'face_swapper_weight' ], scopes = [ 'api', 'cli' ]) + face_swapper_pixel_boost_action = group_processors.add_argument('--face-swapper-pixel-boost', help = translator.get('help.pixel_boost', __package__), default = config.get_str_value('processors', 'face_swapper_pixel_boost', get_first(face_swapper_pixel_boost_choices)), choices = face_swapper_pixel_boost_choices) + face_swapper_weight_action = group_processors.add_argument('--face-swapper-weight', help = translator.get('help.weight', __package__), type = float, default = config.get_float_value('processors', 'face_swapper_weight', '0.5'), choices = face_swapper_choices.face_swapper_weight_range) + facefusion.args_store.register_argument(face_swapper_model_action, scopes = [ 'api', 'cli' ]) + facefusion.args_store.register_argument(face_swapper_pixel_boost_action, scopes = [ 'api', 'cli' ]) + facefusion.args_store.register_argument(face_swapper_weight_action, scopes = [ 'api', 'cli' ]) def apply_args(args : Args, apply_state_item : ApplyStateItem) -> None: diff --git a/facefusion/processors/modules/frame_colorizer/core.py b/facefusion/processors/modules/frame_colorizer/core.py index f81ad1d8..62f920a5 100644 --- a/facefusion/processors/modules/frame_colorizer/core.py +++ b/facefusion/processors/modules/frame_colorizer/core.py @@ -184,10 +184,12 @@ def get_model_options() -> ModelOptions: def register_args(program : ArgumentParser) -> None: group_processors = find_argument_group(program, 'processors') if group_processors: - group_processors.add_argument('--frame-colorizer-model', help = translator.get('help.model', __package__), default = config.get_str_value('processors', 'frame_colorizer_model', 'ddcolor'), choices = frame_colorizer_choices.frame_colorizer_models) - group_processors.add_argument('--frame-colorizer-size', help = translator.get('help.size', __package__), type = str, default = config.get_str_value('processors', 'frame_colorizer_size', '256x256'), choices = frame_colorizer_choices.frame_colorizer_sizes) - group_processors.add_argument('--frame-colorizer-blend', help = translator.get('help.blend', __package__), type = int, default = config.get_int_value('processors', 'frame_colorizer_blend', '100'), choices = frame_colorizer_choices.frame_colorizer_blend_range, metavar = create_int_metavar(frame_colorizer_choices.frame_colorizer_blend_range)) - facefusion.args_store.register_args([ 'frame_colorizer_model', 'frame_colorizer_blend', 'frame_colorizer_size' ], scopes = [ 'api', 'cli' ]) + frame_colorizer_model_action = group_processors.add_argument('--frame-colorizer-model', help = translator.get('help.model', __package__), default = config.get_str_value('processors', 'frame_colorizer_model', 'ddcolor'), choices = frame_colorizer_choices.frame_colorizer_models) + frame_colorizer_size_action = group_processors.add_argument('--frame-colorizer-size', help = translator.get('help.size', __package__), type = str, default = config.get_str_value('processors', 'frame_colorizer_size', '256x256'), choices = frame_colorizer_choices.frame_colorizer_sizes) + frame_colorizer_blend_action = group_processors.add_argument('--frame-colorizer-blend', help = translator.get('help.blend', __package__), type = int, default = config.get_int_value('processors', 'frame_colorizer_blend', '100'), choices = frame_colorizer_choices.frame_colorizer_blend_range, metavar = create_int_metavar(frame_colorizer_choices.frame_colorizer_blend_range)) + facefusion.args_store.register_argument(frame_colorizer_model_action, scopes = [ 'api', 'cli' ]) + facefusion.args_store.register_argument(frame_colorizer_size_action, scopes = [ 'api', 'cli' ]) + facefusion.args_store.register_argument(frame_colorizer_blend_action, scopes = [ 'api', 'cli' ]) def apply_args(args : Args, apply_state_item : ApplyStateItem) -> None: diff --git a/facefusion/processors/modules/frame_enhancer/core.py b/facefusion/processors/modules/frame_enhancer/core.py index bc6b2a8f..f1d6ba26 100644 --- a/facefusion/processors/modules/frame_enhancer/core.py +++ b/facefusion/processors/modules/frame_enhancer/core.py @@ -573,9 +573,10 @@ def get_frame_enhancer_model() -> str: def register_args(program : ArgumentParser) -> None: group_processors = find_argument_group(program, 'processors') if group_processors: - group_processors.add_argument('--frame-enhancer-model', help = translator.get('help.model', __package__), default = config.get_str_value('processors', 'frame_enhancer_model', 'span_kendata_x4'), choices = frame_enhancer_choices.frame_enhancer_models) - group_processors.add_argument('--frame-enhancer-blend', help = translator.get('help.blend', __package__), type = int, default = config.get_int_value('processors', 'frame_enhancer_blend', '80'), choices = frame_enhancer_choices.frame_enhancer_blend_range, metavar = create_int_metavar(frame_enhancer_choices.frame_enhancer_blend_range)) - facefusion.args_store.register_args([ 'frame_enhancer_model', 'frame_enhancer_blend' ], scopes = [ 'api', 'cli' ]) + frame_enhancer_model_action = group_processors.add_argument('--frame-enhancer-model', help = translator.get('help.model', __package__), default = config.get_str_value('processors', 'frame_enhancer_model', 'span_kendata_x4'), choices = frame_enhancer_choices.frame_enhancer_models) + frame_enhancer_blend_action = group_processors.add_argument('--frame-enhancer-blend', help = translator.get('help.blend', __package__), type = int, default = config.get_int_value('processors', 'frame_enhancer_blend', '80'), choices = frame_enhancer_choices.frame_enhancer_blend_range, metavar = create_int_metavar(frame_enhancer_choices.frame_enhancer_blend_range)) + facefusion.args_store.register_argument(frame_enhancer_model_action, scopes = [ 'api', 'cli' ]) + facefusion.args_store.register_argument(frame_enhancer_blend_action, scopes = [ 'api', 'cli' ]) def apply_args(args : Args, apply_state_item : ApplyStateItem) -> None: diff --git a/facefusion/processors/modules/lip_syncer/core.py b/facefusion/processors/modules/lip_syncer/core.py index 6bf6d310..5e77c63d 100755 --- a/facefusion/processors/modules/lip_syncer/core.py +++ b/facefusion/processors/modules/lip_syncer/core.py @@ -132,9 +132,10 @@ def get_model_options() -> ModelOptions: def register_args(program : ArgumentParser) -> None: group_processors = find_argument_group(program, 'processors') if group_processors: - group_processors.add_argument('--lip-syncer-model', help = translator.get('help.model', __package__), default = config.get_str_value('processors', 'lip_syncer_model', 'wav2lip_gan_96'), choices = lip_syncer_choices.lip_syncer_models) - group_processors.add_argument('--lip-syncer-weight', help = translator.get('help.weight', __package__), type = float, default = config.get_float_value('processors', 'lip_syncer_weight', '0.5'), choices = lip_syncer_choices.lip_syncer_weight_range, metavar = create_float_metavar(lip_syncer_choices.lip_syncer_weight_range)) - facefusion.args_store.register_args([ 'lip_syncer_model', 'lip_syncer_weight' ], scopes = [ 'api', 'cli' ]) + lip_syncer_model_action = group_processors.add_argument('--lip-syncer-model', help = translator.get('help.model', __package__), default = config.get_str_value('processors', 'lip_syncer_model', 'wav2lip_gan_96'), choices = lip_syncer_choices.lip_syncer_models) + lip_syncer_weight_action = group_processors.add_argument('--lip-syncer-weight', help = translator.get('help.weight', __package__), type = float, default = config.get_float_value('processors', 'lip_syncer_weight', '0.5'), choices = lip_syncer_choices.lip_syncer_weight_range, metavar = create_float_metavar(lip_syncer_choices.lip_syncer_weight_range)) + facefusion.args_store.register_argument(lip_syncer_model_action, scopes = [ 'api', 'cli' ]) + facefusion.args_store.register_argument(lip_syncer_weight_action, scopes = [ 'api', 'cli' ]) def apply_args(args : Args, apply_state_item : ApplyStateItem) -> None: diff --git a/facefusion/program.py b/facefusion/program.py index 4cb9ae88..d0e4b013 100755 --- a/facefusion/program.py +++ b/facefusion/program.py @@ -23,8 +23,8 @@ def create_help_formatter_large(prog : str) -> HelpFormatter: def create_config_path_program() -> ArgumentParser: program = ArgumentParser(add_help = False) group_paths = program.add_argument_group('paths') - group_paths.add_argument('--config-path', help = translator.get('help.config_path'), default = 'facefusion.ini') - args_store.register_args([ 'config_path' ], scopes = [ 'cli' ]) + config_path_action = group_paths.add_argument('--config-path', help = translator.get('help.config_path'), default = 'facefusion.ini') + args_store.register_argument(config_path_action, scopes = [ 'cli' ]) apply_config_path(program) return program @@ -32,143 +32,164 @@ def create_config_path_program() -> ArgumentParser: def create_workflow_program() -> ArgumentParser: program = ArgumentParser(add_help = False) group_paths = program.add_argument_group('paths') - group_paths.add_argument('--workflow', help = translator.get('help.workflow'), default = config.get_str_value('workflow', 'workflow', 'auto'), choices = facefusion.choices.workflows) - args_store.register_args([ 'workflow' ], scopes = [ 'api', 'cli' ]) + workflow_action = group_paths.add_argument('--workflow', help = translator.get('help.workflow'), default = config.get_str_value('workflow', 'workflow', 'auto'), choices = facefusion.choices.workflows) + args_store.register_argument(workflow_action, scopes = [ 'api', 'cli' ]) return program def create_temp_path_program() -> ArgumentParser: program = ArgumentParser(add_help = False) group_paths = program.add_argument_group('paths') - group_paths.add_argument('--temp-path', help = translator.get('help.temp_path'), default = config.get_str_value('paths', 'temp_path', tempfile.gettempdir())) - args_store.register_args([ 'temp_path' ], scopes = [ 'cli' ]) + temp_path_action = group_paths.add_argument('--temp-path', help = translator.get('help.temp_path'), default = config.get_str_value('paths', 'temp_path', tempfile.gettempdir())) + args_store.register_argument(temp_path_action, scopes = [ 'cli' ]) return program def create_jobs_path_program() -> ArgumentParser: program = ArgumentParser(add_help = False) group_paths = program.add_argument_group('paths') - group_paths.add_argument('--jobs-path', help = translator.get('help.jobs_path'), default = config.get_str_value('paths', 'jobs_path', '.jobs')) - args_store.register_args([ 'jobs_path' ], scopes = [ 'cli' ]) + jobs_path_action = group_paths.add_argument('--jobs-path', help = translator.get('help.jobs_path'), default = config.get_str_value('paths', 'jobs_path', '.jobs')) + args_store.register_argument(jobs_path_action, scopes = [ 'cli' ]) return program def create_source_paths_program() -> ArgumentParser: program = ArgumentParser(add_help = False) group_paths = program.add_argument_group('paths') - group_paths.add_argument('-s', '--source-paths', help = translator.get('help.source_paths'), default = config.get_str_list('paths', 'source_paths'), nargs = '+') - args_store.register_args([ 'source_paths' ], scopes = [ 'cli' ]) + source_paths_action = group_paths.add_argument('-s', '--source-paths', help = translator.get('help.source_paths'), default = config.get_str_list('paths', 'source_paths'), nargs = '+') + args_store.register_argument(source_paths_action, scopes = [ 'cli' ]) return program def create_target_path_program() -> ArgumentParser: program = ArgumentParser(add_help = False) group_paths = program.add_argument_group('paths') - group_paths.add_argument('-t', '--target-path', help = translator.get('help.target_path'), default = config.get_str_value('paths', 'target_path')) - args_store.register_args([ 'target_path' ], scopes = [ 'cli' ]) + target_path_action = group_paths.add_argument('-t', '--target-path', help = translator.get('help.target_path'), default = config.get_str_value('paths', 'target_path')) + args_store.register_argument(target_path_action, scopes = [ 'cli' ]) return program def create_output_path_program() -> ArgumentParser: program = ArgumentParser(add_help = False) group_paths = program.add_argument_group('paths') - group_paths.add_argument('-o', '--output-path', help = translator.get('help.output_path'), default = config.get_str_value('paths', 'output_path')) - args_store.register_args([ 'output_path' ], scopes = [ 'cli' ]) + output_path_action = group_paths.add_argument('-o', '--output-path', help = translator.get('help.output_path'), default = config.get_str_value('paths', 'output_path')) + args_store.register_argument(output_path_action, scopes = [ 'cli' ]) return program def create_source_pattern_program() -> ArgumentParser: program = ArgumentParser(add_help = False) group_patterns = program.add_argument_group('patterns') - group_patterns.add_argument('-s', '--source-pattern', help = translator.get('help.source_pattern'), default = config.get_str_value('patterns', 'source_pattern')) - args_store.register_args([ 'source_pattern' ], scopes = [ 'cli' ]) + source_pattern_action = group_patterns.add_argument('-s', '--source-pattern', help = translator.get('help.source_pattern'), default = config.get_str_value('patterns', 'source_pattern')) + args_store.register_argument(source_pattern_action, scopes = [ 'cli' ]) return program def create_target_pattern_program() -> ArgumentParser: program = ArgumentParser(add_help = False) group_patterns = program.add_argument_group('patterns') - group_patterns.add_argument('-t', '--target-pattern', help = translator.get('help.target_pattern'), default = config.get_str_value('patterns', 'target_pattern')) - args_store.register_args([ 'target_pattern' ], scopes = [ 'cli' ]) + target_pattern_action = group_patterns.add_argument('-t', '--target-pattern', help = translator.get('help.target_pattern'), default = config.get_str_value('patterns', 'target_pattern')) + args_store.register_argument(target_pattern_action, scopes = [ 'cli' ]) return program def create_output_pattern_program() -> ArgumentParser: program = ArgumentParser(add_help = False) group_patterns = program.add_argument_group('patterns') - group_patterns.add_argument('-o', '--output-pattern', help = translator.get('help.output_pattern'), default = config.get_str_value('patterns', 'output_pattern')) - args_store.register_args([ 'output_pattern' ], scopes = [ 'cli' ]) + output_pattern_action = group_patterns.add_argument('-o', '--output-pattern', help = translator.get('help.output_pattern'), default = config.get_str_value('patterns', 'output_pattern')) + args_store.register_argument(output_pattern_action, scopes = [ 'cli' ]) return program def create_face_detector_program() -> ArgumentParser: program = ArgumentParser(add_help = False) group_face_detector = program.add_argument_group('face detector') - group_face_detector.add_argument('--face-detector-model', help = translator.get('help.face_detector_model'), default = config.get_str_value('face_detector', 'face_detector_model', 'yolo_face'), choices = facefusion.choices.face_detector_models) + face_detector_model_action = group_face_detector.add_argument('--face-detector-model', help = translator.get('help.face_detector_model'), default = config.get_str_value('face_detector', 'face_detector_model', 'yolo_face'), choices = facefusion.choices.face_detector_models) known_args, _ = program.parse_known_args() face_detector_size_choices = facefusion.choices.face_detector_set.get(known_args.face_detector_model) - group_face_detector.add_argument('--face-detector-size', help = translator.get('help.face_detector_size'), default = config.get_str_value('face_detector', 'face_detector_size', get_last(face_detector_size_choices)), choices = face_detector_size_choices) - group_face_detector.add_argument('--face-detector-margin', help = translator.get('help.face_detector_margin'), type = partial(sanitize_int_range, int_range = facefusion.choices.face_detector_margin_range), default = config.get_int_list('face_detector', 'face_detector_margin', '0 0 0 0'), nargs = '+') - group_face_detector.add_argument('--face-detector-angles', help = translator.get('help.face_detector_angles'), type = int, default = config.get_int_list('face_detector', 'face_detector_angles', '0'), choices = facefusion.choices.face_detector_angles, nargs = '+', metavar = 'FACE_DETECTOR_ANGLES') - group_face_detector.add_argument('--face-detector-score', help = translator.get('help.face_detector_score'), type = float, default = config.get_float_value('face_detector', 'face_detector_score', '0.5'), choices = facefusion.choices.face_detector_score_range, metavar = create_float_metavar(facefusion.choices.face_detector_score_range)) - args_store.register_args([ 'face_detector_model', 'face_detector_size', 'face_detector_margin', 'face_detector_angles', 'face_detector_score' ], scopes = [ 'api', 'cli' ]) + face_detector_size_action = group_face_detector.add_argument('--face-detector-size', help = translator.get('help.face_detector_size'), default = config.get_str_value('face_detector', 'face_detector_size', get_last(face_detector_size_choices)), choices = face_detector_size_choices) + face_detector_margin_action = group_face_detector.add_argument('--face-detector-margin', help = translator.get('help.face_detector_margin'), type = partial(sanitize_int_range, int_range = facefusion.choices.face_detector_margin_range), default = config.get_int_list('face_detector', 'face_detector_margin', '0 0 0 0'), nargs = '+') + face_detector_angles_action = group_face_detector.add_argument('--face-detector-angles', help = translator.get('help.face_detector_angles'), type = int, default = config.get_int_list('face_detector', 'face_detector_angles', '0'), choices = facefusion.choices.face_detector_angles, nargs = '+', metavar = 'FACE_DETECTOR_ANGLES') + face_detector_score_action = group_face_detector.add_argument('--face-detector-score', help = translator.get('help.face_detector_score'), type = float, default = config.get_float_value('face_detector', 'face_detector_score', '0.5'), choices = facefusion.choices.face_detector_score_range, metavar = create_float_metavar(facefusion.choices.face_detector_score_range)) + args_store.register_argument(face_detector_model_action, scopes = [ 'api', 'cli' ]) + args_store.register_argument(face_detector_size_action, scopes = [ 'api', 'cli' ]) + args_store.register_argument(face_detector_margin_action, scopes = [ 'api', 'cli' ]) + args_store.register_argument(face_detector_angles_action, scopes = [ 'api', 'cli' ]) + args_store.register_argument(face_detector_score_action, scopes = [ 'api', 'cli' ]) return program def create_face_landmarker_program() -> ArgumentParser: program = ArgumentParser(add_help = False) group_face_landmarker = program.add_argument_group('face landmarker') - group_face_landmarker.add_argument('--face-landmarker-model', help = translator.get('help.face_landmarker_model'), default = config.get_str_value('face_landmarker', 'face_landmarker_model', '2dfan4'), choices = facefusion.choices.face_landmarker_models) - group_face_landmarker.add_argument('--face-landmarker-score', help = translator.get('help.face_landmarker_score'), type = float, default = config.get_float_value('face_landmarker', 'face_landmarker_score', '0.5'), choices = facefusion.choices.face_landmarker_score_range, metavar = create_float_metavar(facefusion.choices.face_landmarker_score_range)) - args_store.register_args([ 'face_landmarker_model', 'face_landmarker_score' ], scopes = [ 'api', 'cli' ]) + face_landmarker_model_action = group_face_landmarker.add_argument('--face-landmarker-model', help = translator.get('help.face_landmarker_model'), default = config.get_str_value('face_landmarker', 'face_landmarker_model', '2dfan4'), choices = facefusion.choices.face_landmarker_models) + face_landmarker_score_action = group_face_landmarker.add_argument('--face-landmarker-score', help = translator.get('help.face_landmarker_score'), type = float, default = config.get_float_value('face_landmarker', 'face_landmarker_score', '0.5'), choices = facefusion.choices.face_landmarker_score_range, metavar = create_float_metavar(facefusion.choices.face_landmarker_score_range)) + args_store.register_argument(face_landmarker_model_action, scopes = [ 'api', 'cli' ]) + args_store.register_argument(face_landmarker_score_action, scopes = [ 'api', 'cli' ]) return program def create_face_selector_program() -> ArgumentParser: program = ArgumentParser(add_help = False) group_face_selector = program.add_argument_group('face selector') - group_face_selector.add_argument('--face-selector-mode', help = translator.get('help.face_selector_mode'), default = config.get_str_value('face_selector', 'face_selector_mode', 'reference'), choices = facefusion.choices.face_selector_modes) - group_face_selector.add_argument('--face-selector-order', help = translator.get('help.face_selector_order'), default = config.get_str_value('face_selector', 'face_selector_order', 'large-small'), choices = facefusion.choices.face_selector_orders) - group_face_selector.add_argument('--face-selector-age-start', help = translator.get('help.face_selector_age_start'), type = int, default = config.get_int_value('face_selector', 'face_selector_age_start'), choices = facefusion.choices.face_selector_age_range, metavar = create_int_metavar(facefusion.choices.face_selector_age_range)) - group_face_selector.add_argument('--face-selector-age-end', help = translator.get('help.face_selector_age_end'), type = int, default = config.get_int_value('face_selector', 'face_selector_age_end'), choices = facefusion.choices.face_selector_age_range, metavar = create_int_metavar(facefusion.choices.face_selector_age_range)) - group_face_selector.add_argument('--face-selector-gender', help = translator.get('help.face_selector_gender'), default = config.get_str_value('face_selector', 'face_selector_gender'), choices = facefusion.choices.face_selector_genders) - group_face_selector.add_argument('--face-selector-race', help = translator.get('help.face_selector_race'), default = config.get_str_value('face_selector', 'face_selector_race'), choices = facefusion.choices.face_selector_races) - group_face_selector.add_argument('--reference-face-position', help = translator.get('help.reference_face_position'), type = int, default = config.get_int_value('face_selector', 'reference_face_position', '0')) - group_face_selector.add_argument('--reference-face-distance', help = translator.get('help.reference_face_distance'), type = float, default = config.get_float_value('face_selector', 'reference_face_distance', '0.3'), choices = facefusion.choices.reference_face_distance_range, metavar = create_float_metavar(facefusion.choices.reference_face_distance_range)) - group_face_selector.add_argument('--reference-frame-number', help = translator.get('help.reference_frame_number'), type = int, default = config.get_int_value('face_selector', 'reference_frame_number', '0')) - args_store.register_args([ 'face_selector_mode', 'face_selector_order', 'face_selector_gender', 'face_selector_race', 'face_selector_age_start', 'face_selector_age_end', 'reference_face_position', 'reference_face_distance', 'reference_frame_number' ], scopes = [ 'api', 'cli' ]) + face_selector_mode_action = group_face_selector.add_argument('--face-selector-mode', help = translator.get('help.face_selector_mode'), default = config.get_str_value('face_selector', 'face_selector_mode', 'reference'), choices = facefusion.choices.face_selector_modes) + face_selector_order_action = group_face_selector.add_argument('--face-selector-order', help = translator.get('help.face_selector_order'), default = config.get_str_value('face_selector', 'face_selector_order', 'large-small'), choices = facefusion.choices.face_selector_orders) + face_selector_age_start_action = group_face_selector.add_argument('--face-selector-age-start', help = translator.get('help.face_selector_age_start'), type = int, default = config.get_int_value('face_selector', 'face_selector_age_start'), choices = facefusion.choices.face_selector_age_range, metavar = create_int_metavar(facefusion.choices.face_selector_age_range)) + face_selector_age_end_action = group_face_selector.add_argument('--face-selector-age-end', help = translator.get('help.face_selector_age_end'), type = int, default = config.get_int_value('face_selector', 'face_selector_age_end'), choices = facefusion.choices.face_selector_age_range, metavar = create_int_metavar(facefusion.choices.face_selector_age_range)) + face_selector_gender_action = group_face_selector.add_argument('--face-selector-gender', help = translator.get('help.face_selector_gender'), default = config.get_str_value('face_selector', 'face_selector_gender'), choices = facefusion.choices.face_selector_genders) + face_selector_race_action = group_face_selector.add_argument('--face-selector-race', help = translator.get('help.face_selector_race'), default = config.get_str_value('face_selector', 'face_selector_race'), choices = facefusion.choices.face_selector_races) + reference_face_position_action = group_face_selector.add_argument('--reference-face-position', help = translator.get('help.reference_face_position'), type = int, default = config.get_int_value('face_selector', 'reference_face_position', '0')) + reference_face_distance_action = group_face_selector.add_argument('--reference-face-distance', help = translator.get('help.reference_face_distance'), type = float, default = config.get_float_value('face_selector', 'reference_face_distance', '0.3'), choices = facefusion.choices.reference_face_distance_range, metavar = create_float_metavar(facefusion.choices.reference_face_distance_range)) + reference_frame_number_action = group_face_selector.add_argument('--reference-frame-number', help = translator.get('help.reference_frame_number'), type = int, default = config.get_int_value('face_selector', 'reference_frame_number', '0')) + args_store.register_argument(face_selector_mode_action, scopes = [ 'api', 'cli' ]) + args_store.register_argument(face_selector_order_action, scopes = [ 'api', 'cli' ]) + args_store.register_argument(face_selector_age_start_action, scopes = [ 'api', 'cli' ]) + args_store.register_argument(face_selector_age_end_action, scopes = [ 'api', 'cli' ]) + args_store.register_argument(face_selector_gender_action, scopes = [ 'api', 'cli' ]) + args_store.register_argument(face_selector_race_action, scopes = [ 'api', 'cli' ]) + args_store.register_argument(reference_face_position_action, scopes = [ 'api', 'cli' ]) + args_store.register_argument(reference_face_distance_action, scopes = [ 'api', 'cli' ]) + args_store.register_argument(reference_frame_number_action, scopes = [ 'api', 'cli' ]) return program def create_face_masker_program() -> ArgumentParser: program = ArgumentParser(add_help = False) group_face_masker = program.add_argument_group('face masker') - group_face_masker.add_argument('--face-occluder-model', help = translator.get('help.face_occluder_model'), default = config.get_str_value('face_masker', 'face_occluder_model', 'xseg_1'), choices = facefusion.choices.face_occluder_models) - group_face_masker.add_argument('--face-parser-model', help = translator.get('help.face_parser_model'), default = config.get_str_value('face_masker', 'face_parser_model', 'bisenet_resnet_34'), choices = facefusion.choices.face_parser_models) - group_face_masker.add_argument('--face-mask-types', help = translator.get('help.face_mask_types').format(choices = ', '.join(facefusion.choices.face_mask_types)), default = config.get_str_list('face_masker', 'face_mask_types', 'box'), choices = facefusion.choices.face_mask_types, nargs = '+', metavar = 'FACE_MASK_TYPES') - group_face_masker.add_argument('--face-mask-areas', help = translator.get('help.face_mask_areas').format(choices = ', '.join(facefusion.choices.face_mask_areas)), default = config.get_str_list('face_masker', 'face_mask_areas', ' '.join(facefusion.choices.face_mask_areas)), choices = facefusion.choices.face_mask_areas, nargs = '+', metavar = 'FACE_MASK_AREAS') - group_face_masker.add_argument('--face-mask-regions', help = translator.get('help.face_mask_regions').format(choices = ', '.join(facefusion.choices.face_mask_regions)), default = config.get_str_list('face_masker', 'face_mask_regions', ' '.join(facefusion.choices.face_mask_regions)), choices = facefusion.choices.face_mask_regions, nargs = '+', metavar = 'FACE_MASK_REGIONS') - group_face_masker.add_argument('--face-mask-blur', help = translator.get('help.face_mask_blur'), type = float, default = config.get_float_value('face_masker', 'face_mask_blur', '0.3'), choices = facefusion.choices.face_mask_blur_range, metavar = create_float_metavar(facefusion.choices.face_mask_blur_range)) - group_face_masker.add_argument('--face-mask-padding', help = translator.get('help.face_mask_padding'), type = partial(sanitize_int_range, int_range = facefusion.choices.face_mask_padding_range), default = config.get_int_list('face_masker', 'face_mask_padding', '0 0 0 0'), nargs = '+') - args_store.register_args([ 'face_occluder_model', 'face_parser_model', 'face_mask_types', 'face_mask_areas', 'face_mask_regions', 'face_mask_blur', 'face_mask_padding' ], scopes = [ 'api', 'cli' ]) + face_occluder_model_action = group_face_masker.add_argument('--face-occluder-model', help = translator.get('help.face_occluder_model'), default = config.get_str_value('face_masker', 'face_occluder_model', 'xseg_1'), choices = facefusion.choices.face_occluder_models) + face_parser_model_action = group_face_masker.add_argument('--face-parser-model', help = translator.get('help.face_parser_model'), default = config.get_str_value('face_masker', 'face_parser_model', 'bisenet_resnet_34'), choices = facefusion.choices.face_parser_models) + face_mask_types_action = group_face_masker.add_argument('--face-mask-types', help = translator.get('help.face_mask_types').format(choices = ', '.join(facefusion.choices.face_mask_types)), default = config.get_str_list('face_masker', 'face_mask_types', 'box'), choices = facefusion.choices.face_mask_types, nargs = '+', metavar = 'FACE_MASK_TYPES') + face_mask_areas_action = group_face_masker.add_argument('--face-mask-areas', help = translator.get('help.face_mask_areas').format(choices = ', '.join(facefusion.choices.face_mask_areas)), default = config.get_str_list('face_masker', 'face_mask_areas', ' '.join(facefusion.choices.face_mask_areas)), choices = facefusion.choices.face_mask_areas, nargs = '+', metavar = 'FACE_MASK_AREAS') + face_mask_regions_action = group_face_masker.add_argument('--face-mask-regions', help = translator.get('help.face_mask_regions').format(choices = ', '.join(facefusion.choices.face_mask_regions)), default = config.get_str_list('face_masker', 'face_mask_regions', ' '.join(facefusion.choices.face_mask_regions)), choices = facefusion.choices.face_mask_regions, nargs = '+', metavar = 'FACE_MASK_REGIONS') + face_mask_blur_action = group_face_masker.add_argument('--face-mask-blur', help = translator.get('help.face_mask_blur'), type = float, default = config.get_float_value('face_masker', 'face_mask_blur', '0.3'), choices = facefusion.choices.face_mask_blur_range, metavar = create_float_metavar(facefusion.choices.face_mask_blur_range)) + face_mask_padding_action = group_face_masker.add_argument('--face-mask-padding', help = translator.get('help.face_mask_padding'), type = partial(sanitize_int_range, int_range = facefusion.choices.face_mask_padding_range), default = config.get_int_list('face_masker', 'face_mask_padding', '0 0 0 0'), nargs = '+') + args_store.register_argument(face_occluder_model_action, scopes = [ 'api', 'cli' ]) + args_store.register_argument(face_parser_model_action, scopes = [ 'api', 'cli' ]) + args_store.register_argument(face_mask_types_action, scopes = [ 'api', 'cli' ]) + args_store.register_argument(face_mask_areas_action, scopes = [ 'api', 'cli' ]) + args_store.register_argument(face_mask_regions_action, scopes = [ 'api', 'cli' ]) + args_store.register_argument(face_mask_blur_action, scopes = [ 'api', 'cli' ]) + args_store.register_argument(face_mask_padding_action, scopes = [ 'api', 'cli' ]) return program def create_voice_extractor_program() -> ArgumentParser: program = ArgumentParser(add_help = False) group_voice_extractor = program.add_argument_group('voice extractor') - group_voice_extractor.add_argument('--voice-extractor-model', help = translator.get('help.voice_extractor_model'), default = config.get_str_value('voice_extractor', 'voice_extractor_model', 'kim_vocal_2'), choices = facefusion.choices.voice_extractor_models) - args_store.register_args([ 'voice_extractor_model' ], scopes = [ 'api', 'cli' ]) + voice_extractor_model_action = group_voice_extractor.add_argument('--voice-extractor-model', help = translator.get('help.voice_extractor_model'), default = config.get_str_value('voice_extractor', 'voice_extractor_model', 'kim_vocal_2'), choices = facefusion.choices.voice_extractor_models) + args_store.register_argument(voice_extractor_model_action, scopes = [ 'api', 'cli' ]) return program def create_frame_extraction_program() -> ArgumentParser: program = ArgumentParser(add_help = False) group_frame_extraction = program.add_argument_group('frame extraction') - group_frame_extraction.add_argument('--trim-frame-start', help = translator.get('help.trim_frame_start'), type = int, default = facefusion.config.get_int_value('frame_extraction', 'trim_frame_start')) - group_frame_extraction.add_argument('--trim-frame-end', help = translator.get('help.trim_frame_end'), type = int, default = facefusion.config.get_int_value('frame_extraction', 'trim_frame_end')) - group_frame_extraction.add_argument('--temp-frame-format', help = translator.get('help.temp_frame_format'), default = config.get_str_value('frame_extraction', 'temp_frame_format', 'png'), choices = facefusion.choices.temp_frame_formats) - args_store.register_args([ 'trim_frame_start', 'trim_frame_end', 'temp_frame_format' ], scopes = [ 'api', 'cli' ]) + trim_frame_start_action = group_frame_extraction.add_argument('--trim-frame-start', help = translator.get('help.trim_frame_start'), type = int, default = facefusion.config.get_int_value('frame_extraction', 'trim_frame_start')) + trim_frame_end_action = group_frame_extraction.add_argument('--trim-frame-end', help = translator.get('help.trim_frame_end'), type = int, default = facefusion.config.get_int_value('frame_extraction', 'trim_frame_end')) + temp_frame_format_action = group_frame_extraction.add_argument('--temp-frame-format', help = translator.get('help.temp_frame_format'), default = config.get_str_value('frame_extraction', 'temp_frame_format', 'png'), choices = facefusion.choices.temp_frame_formats) + args_store.register_argument(trim_frame_start_action, scopes = [ 'api', 'cli' ]) + args_store.register_argument(trim_frame_end_action, scopes = [ 'api', 'cli' ]) + args_store.register_argument(temp_frame_format_action, scopes = [ 'api', 'cli' ]) return program @@ -176,17 +197,26 @@ def create_output_creation_program() -> ArgumentParser: program = ArgumentParser(add_help = False) available_encoder_set = get_available_encoder_set() group_output_creation = program.add_argument_group('output creation') - group_output_creation.add_argument('--output-image-quality', help = translator.get('help.output_image_quality'), type = int, default = config.get_int_value('output_creation', 'output_image_quality', '80'), choices = facefusion.choices.output_image_quality_range, metavar = create_int_metavar(facefusion.choices.output_image_quality_range)) - group_output_creation.add_argument('--output-image-scale', help = translator.get('help.output_image_scale'), type = float, default = config.get_float_value('output_creation', 'output_image_scale', '1.0'), choices = facefusion.choices.output_image_scale_range) - group_output_creation.add_argument('--output-audio-encoder', help = translator.get('help.output_audio_encoder'), default = config.get_str_value('output_creation', 'output_audio_encoder', get_first(available_encoder_set.get('audio'))), choices = available_encoder_set.get('audio')) - group_output_creation.add_argument('--output-audio-quality', help = translator.get('help.output_audio_quality'), type = int, default = config.get_int_value('output_creation', 'output_audio_quality', '80'), choices = facefusion.choices.output_audio_quality_range, metavar = create_int_metavar(facefusion.choices.output_audio_quality_range)) - group_output_creation.add_argument('--output-audio-volume', help = translator.get('help.output_audio_volume'), type = int, default = config.get_int_value('output_creation', 'output_audio_volume', '100'), choices = facefusion.choices.output_audio_volume_range, metavar = create_int_metavar(facefusion.choices.output_audio_volume_range)) - group_output_creation.add_argument('--output-video-encoder', help = translator.get('help.output_video_encoder'), default = config.get_str_value('output_creation', 'output_video_encoder', get_first(available_encoder_set.get('video'))), choices = available_encoder_set.get('video')) - group_output_creation.add_argument('--output-video-preset', help = translator.get('help.output_video_preset'), default = config.get_str_value('output_creation', 'output_video_preset', 'veryfast'), choices = facefusion.choices.output_video_presets) - group_output_creation.add_argument('--output-video-quality', help = translator.get('help.output_video_quality'), type = int, default = config.get_int_value('output_creation', 'output_video_quality', '80'), choices = facefusion.choices.output_video_quality_range, metavar = create_int_metavar(facefusion.choices.output_video_quality_range)) - group_output_creation.add_argument('--output-video-scale', help = translator.get('help.output_video_scale'), type = float, default = config.get_float_value('output_creation', 'output_video_scale', '1.0'), choices = facefusion.choices.output_video_scale_range) - group_output_creation.add_argument('--output-video-fps', help = translator.get('help.output_video_fps'), type = float, default = config.get_float_value('output_creation', 'output_video_fps')) - args_store.register_args([ 'output_image_quality', 'output_image_scale', 'output_audio_encoder', 'output_audio_quality', 'output_audio_volume', 'output_video_encoder', 'output_video_preset', 'output_video_quality', 'output_video_scale', 'output_video_fps' ], scopes = [ 'api', 'cli' ]) + output_image_quality_action = group_output_creation.add_argument('--output-image-quality', help = translator.get('help.output_image_quality'), type = int, default = config.get_int_value('output_creation', 'output_image_quality', '80'), choices = facefusion.choices.output_image_quality_range, metavar = create_int_metavar(facefusion.choices.output_image_quality_range)) + output_image_scale_action = group_output_creation.add_argument('--output-image-scale', help = translator.get('help.output_image_scale'), type = float, default = config.get_float_value('output_creation', 'output_image_scale', '1.0'), choices = facefusion.choices.output_image_scale_range) + output_audio_encoder_action = group_output_creation.add_argument('--output-audio-encoder', help = translator.get('help.output_audio_encoder'), default = config.get_str_value('output_creation', 'output_audio_encoder', get_first(available_encoder_set.get('audio'))), choices = available_encoder_set.get('audio')) + output_audio_quality_action = group_output_creation.add_argument('--output-audio-quality', help = translator.get('help.output_audio_quality'), type = int, default = config.get_int_value('output_creation', 'output_audio_quality', '80'), choices = facefusion.choices.output_audio_quality_range, metavar = create_int_metavar(facefusion.choices.output_audio_quality_range)) + output_audio_volume_action = group_output_creation.add_argument('--output-audio-volume', help = translator.get('help.output_audio_volume'), type = int, default = config.get_int_value('output_creation', 'output_audio_volume', '100'), choices = facefusion.choices.output_audio_volume_range, metavar = create_int_metavar(facefusion.choices.output_audio_volume_range)) + output_video_encoder_action = group_output_creation.add_argument('--output-video-encoder', help = translator.get('help.output_video_encoder'), default = config.get_str_value('output_creation', 'output_video_encoder', get_first(available_encoder_set.get('video'))), choices = available_encoder_set.get('video')) + output_video_preset_action = group_output_creation.add_argument('--output-video-preset', help = translator.get('help.output_video_preset'), default = config.get_str_value('output_creation', 'output_video_preset', 'veryfast'), choices = facefusion.choices.output_video_presets) + output_video_quality_action = group_output_creation.add_argument('--output-video-quality', help = translator.get('help.output_video_quality'), type = int, default = config.get_int_value('output_creation', 'output_video_quality', '80'), choices = facefusion.choices.output_video_quality_range, metavar = create_int_metavar(facefusion.choices.output_video_quality_range)) + output_video_scale_action = group_output_creation.add_argument('--output-video-scale', help = translator.get('help.output_video_scale'), type = float, default = config.get_float_value('output_creation', 'output_video_scale', '1.0'), choices = facefusion.choices.output_video_scale_range) + output_video_fps_action = group_output_creation.add_argument('--output-video-fps', help = translator.get('help.output_video_fps'), type = float, default = config.get_float_value('output_creation', 'output_video_fps')) + args_store.register_argument(output_image_quality_action, scopes = [ 'api', 'cli' ]) + args_store.register_argument(output_image_scale_action, scopes = [ 'api', 'cli' ]) + args_store.register_argument(output_audio_encoder_action, scopes = [ 'api', 'cli' ]) + args_store.register_argument(output_audio_quality_action, scopes = [ 'api', 'cli' ]) + args_store.register_argument(output_audio_volume_action, scopes = [ 'api', 'cli' ]) + args_store.register_argument(output_video_encoder_action, scopes = [ 'api', 'cli' ]) + args_store.register_argument(output_video_preset_action, scopes = [ 'api', 'cli' ]) + args_store.register_argument(output_video_quality_action, scopes = [ 'api', 'cli' ]) + args_store.register_argument(output_video_scale_action, scopes = [ 'api', 'cli' ]) + args_store.register_argument(output_video_fps_action, scopes = [ 'api', 'cli' ]) return program @@ -194,8 +224,8 @@ def create_processors_program() -> ArgumentParser: program = ArgumentParser(add_help = False) available_processors = [ get_file_name(file_path) for file_path in resolve_file_paths('facefusion/processors/modules') ] group_processors = program.add_argument_group('processors') - group_processors.add_argument('--processors', help = translator.get('help.processors').format(choices = ', '.join(available_processors)), default = config.get_str_list('processors', 'processors', 'face_swapper'), choices = available_processors, nargs = '+') - args_store.register_args([ 'processors' ], scopes = [ 'api', 'cli' ]) + processors_action = group_processors.add_argument('--processors', help = translator.get('help.processors').format(choices = ', '.join(available_processors)), default = config.get_str_list('processors', 'processors', 'face_swapper'), choices = available_processors, nargs = '+') + args_store.register_argument(processors_action, scopes = [ 'api', 'cli' ]) for processor_module in get_processors_modules(available_processors): processor_module.register_args(program) return program @@ -204,16 +234,16 @@ def create_processors_program() -> ArgumentParser: def create_download_providers_program() -> ArgumentParser: program = ArgumentParser(add_help = False) group_download = program.add_argument_group('download') - group_download.add_argument('--download-providers', help = translator.get('help.download_providers').format(choices = ', '.join(facefusion.choices.download_providers)), default = config.get_str_list('download', 'download_providers', ' '.join(facefusion.choices.download_providers)), choices = facefusion.choices.download_providers, nargs = '+', metavar = 'DOWNLOAD_PROVIDERS') - args_store.register_args([ 'download_providers' ], scopes = [ 'cli', 'sys' ]) + download_providers_action = group_download.add_argument('--download-providers', help = translator.get('help.download_providers').format(choices = ', '.join(facefusion.choices.download_providers)), default = config.get_str_list('download', 'download_providers', ' '.join(facefusion.choices.download_providers)), choices = facefusion.choices.download_providers, nargs = '+', metavar = 'DOWNLOAD_PROVIDERS') + args_store.register_argument(download_providers_action, scopes = [ 'cli', 'sys' ]) return program def create_download_scope_program() -> ArgumentParser: program = ArgumentParser(add_help = False) group_download = program.add_argument_group('download') - group_download.add_argument('--download-scope', help = translator.get('help.download_scope'), default = config.get_str_value('download', 'download_scope', 'lite'), choices = facefusion.choices.download_scopes) - args_store.register_args([ 'download_scope' ], scopes = [ 'cli', 'sys' ]) + download_scope_action = group_download.add_argument('--download-scope', help = translator.get('help.download_scope'), default = config.get_str_value('download', 'download_scope', 'lite'), choices = facefusion.choices.download_scopes) + args_store.register_argument(download_scope_action, scopes = [ 'cli', 'sys' ]) return program @@ -238,34 +268,36 @@ def create_execution_program() -> ArgumentParser: program = ArgumentParser(add_help = False) available_execution_providers = get_available_execution_providers() group_execution = program.add_argument_group('execution') - group_execution.add_argument('--execution-device-ids', help = translator.get('help.execution_device_ids'), type = int, default = config.get_str_list('execution', 'execution_device_ids', '0'), nargs = '+', metavar = 'EXECUTION_DEVICE_IDS') - group_execution.add_argument('--execution-providers', help = translator.get('help.execution_providers').format(choices = ', '.join(available_execution_providers)), default = config.get_str_list('execution', 'execution_providers', get_first(available_execution_providers)), choices = available_execution_providers, nargs = '+', metavar = 'EXECUTION_PROVIDERS') - group_execution.add_argument('--execution-thread-count', help = translator.get('help.execution_thread_count'), type = int, default = config.get_int_value('execution', 'execution_thread_count', '8'), choices = facefusion.choices.execution_thread_count_range, metavar = create_int_metavar(facefusion.choices.execution_thread_count_range)) - args_store.register_args([ 'execution_device_ids', 'execution_providers', 'execution_thread_count' ], scopes = [ 'cli', 'sys' ]) + execution_device_ids_action = group_execution.add_argument('--execution-device-ids', help = translator.get('help.execution_device_ids'), type = int, default = config.get_str_list('execution', 'execution_device_ids', '0'), nargs = '+', metavar = 'EXECUTION_DEVICE_IDS') + execution_providers_action = group_execution.add_argument('--execution-providers', help = translator.get('help.execution_providers').format(choices = ', '.join(available_execution_providers)), default = config.get_str_list('execution', 'execution_providers', get_first(available_execution_providers)), choices = available_execution_providers, nargs = '+', metavar = 'EXECUTION_PROVIDERS') + execution_thread_count_action = group_execution.add_argument('--execution-thread-count', help = translator.get('help.execution_thread_count'), type = int, default = config.get_int_value('execution', 'execution_thread_count', '8'), choices = facefusion.choices.execution_thread_count_range, metavar = create_int_metavar(facefusion.choices.execution_thread_count_range)) + args_store.register_argument(execution_device_ids_action, scopes = [ 'cli', 'sys' ]) + args_store.register_argument(execution_providers_action, scopes = [ 'cli', 'sys' ]) + args_store.register_argument(execution_thread_count_action, scopes = [ 'cli', 'sys' ]) return program def create_memory_program() -> ArgumentParser: program = ArgumentParser(add_help = False) group_memory = program.add_argument_group('memory') - group_memory.add_argument('--video-memory-strategy', help = translator.get('help.video_memory_strategy'), default = config.get_str_value('memory', 'video_memory_strategy', 'strict'), choices = facefusion.choices.video_memory_strategies) - args_store.register_args([ 'video_memory_strategy' ], scopes = [ 'cli', 'sys' ]) + video_memory_strategy_action = group_memory.add_argument('--video-memory-strategy', help = translator.get('help.video_memory_strategy'), default = config.get_str_value('memory', 'video_memory_strategy', 'strict'), choices = facefusion.choices.video_memory_strategies) + args_store.register_argument(video_memory_strategy_action, scopes = [ 'cli', 'sys' ]) return program def create_log_level_program() -> ArgumentParser: program = ArgumentParser(add_help = False) group_misc = program.add_argument_group('misc') - group_misc.add_argument('--log-level', help = translator.get('help.log_level'), default = config.get_str_value('misc', 'log_level', 'info'), choices = facefusion.choices.log_levels) - args_store.register_args([ 'log_level' ], scopes = [ 'cli' ]) + log_level_action = group_misc.add_argument('--log-level', help = translator.get('help.log_level'), default = config.get_str_value('misc', 'log_level', 'info'), choices = facefusion.choices.log_levels) + args_store.register_argument(log_level_action, scopes = [ 'cli' ]) return program def create_halt_on_error_program() -> ArgumentParser: program = ArgumentParser(add_help = False) group_misc = program.add_argument_group('misc') - group_misc.add_argument('--halt-on-error', help = translator.get('help.halt_on_error'), action = 'store_true', default = config.get_bool_value('misc', 'halt_on_error')) - args_store.register_args([ 'halt_on_error' ], scopes = [ 'cli' ]) + halt_on_error_action = group_misc.add_argument('--halt-on-error', help = translator.get('help.halt_on_error'), action = 'store_true', default = config.get_bool_value('misc', 'halt_on_error')) + args_store.register_argument(halt_on_error_action, scopes = [ 'cli' ]) return program diff --git a/facefusion/types.py b/facefusion/types.py index 13f9ed04..8b2fde5a 100755 --- a/facefusion/types.py +++ b/facefusion/types.py @@ -102,11 +102,12 @@ Scope : TypeAlias = Literal['api', 'cli', 'sys'] ArgsStore = TypedDict('ArgsStore', { - 'api' : List[str], - 'cli' : List[str], - 'sys' : List[str] + 'api' : Dict[str, Any], + 'cli' : Dict[str, Any], + 'sys' : Dict[str, Any] }) + ProcessState = Literal['checking', 'processing', 'stopping', 'pending'] UpdateProgress : TypeAlias = Callable[[int], None] ProcessStep : TypeAlias = Callable[[str, int, Args], bool] diff --git a/tests/test_api_state.py b/tests/test_api_state.py index 1a6f857d..ff6cd4a1 100644 --- a/tests/test_api_state.py +++ b/tests/test_api_state.py @@ -23,8 +23,7 @@ def before_all() -> None: @pytest.fixture(scope = 'module') def test_client() -> Iterator[TestClient]: - args_store.register_args([ 'source_paths', 'target_path' ], scopes = [ 'api' ]) - args_store.register_args([ 'execution_providers' ], scopes = [ 'api' ]) + args_store.register_args([ 'source_paths', 'target_path', 'execution_providers' ], scopes = [ 'api' ]) state_manager.init_item('execution_providers', [ 'cpu' ]) with TestClient(create_api()) as test_client: