scenefab 2.2.0__tar.gz → 2.4.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- scenefab-2.4.2/PKG-INFO +451 -0
- scenefab-2.4.2/README.md +374 -0
- scenefab-2.4.2/config/app_config.yaml +10 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/pyproject.toml +5 -1
- scenefab-2.4.2/resources/README.md +73 -0
- scenefab-2.4.2/resources/app_icon.svg +136 -0
- scenefab-2.4.2/resources/icons/app_icon.png +0 -0
- scenefab-2.4.2/resources/icons/app_icon_1024.png +0 -0
- scenefab-2.4.2/resources/icons/app_icon_128.png +0 -0
- scenefab-2.4.2/resources/icons/app_icon_256.png +0 -0
- scenefab-2.4.2/resources/icons/app_icon_32.png +0 -0
- scenefab-2.4.2/resources/icons/app_icon_512.png +0 -0
- scenefab-2.4.2/resources/icons/app_icon_64.png +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/api/main.py +10 -11
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/api/routers/export.py +66 -16
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/api/routers/pipeline.py +57 -5
- scenefab-2.4.2/src/scenefab/api/routers/plugins.py +194 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/api/routers/projects.py +37 -5
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/application.py +50 -117
- scenefab-2.4.2/src/scenefab/core/__init__.py +67 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/core/audit.py +2 -2
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/core/base_worker.py +33 -16
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/core/di_container.py +37 -100
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/core/event_types.py +0 -50
- scenefab-2.2.0/src/scenefab/core/streaming_llm_worker.py → scenefab-2.4.2/src/scenefab/core/stream_worker.py +30 -29
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/core/task_model.py +2 -2
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/core/task_store.py +19 -22
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/core/unified_event_bus.py +14 -21
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/exceptions.py +0 -49
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/main.py +30 -13
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/models/__init__.py +0 -15
- scenefab-2.2.0/src/scenefab/models/project_file_metadata.py → scenefab-2.4.2/src/scenefab/models/file_metadata.py +6 -21
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/models/project.py +1 -35
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/models/project_models.py +12 -52
- scenefab-2.4.2/src/scenefab/models/serialization.py +20 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/pipeline/__init__.py +17 -5
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/pipeline/assembly_steps.py +136 -91
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/pipeline/evaluation_steps.py +21 -93
- scenefab-2.4.2/src/scenefab/pipeline/fp_workflow.py +123 -0
- scenefab-2.4.2/src/scenefab/pipeline/narration/__init__.py +55 -0
- scenefab-2.2.0/src/scenefab/pipeline/narration_context.py → scenefab-2.4.2/src/scenefab/pipeline/narration/context.py +24 -13
- scenefab-2.2.0/src/scenefab/pipeline/narration.py → scenefab-2.4.2/src/scenefab/pipeline/narration/engine.py +18 -20
- scenefab-2.2.0/src/scenefab/pipeline/narration_evaluator.py → scenefab-2.4.2/src/scenefab/pipeline/narration/evaluator.py +149 -74
- scenefab-2.2.0/src/scenefab/pipeline/narration_state_machine.py → scenefab-2.4.2/src/scenefab/pipeline/narration/state_machine.py +153 -109
- scenefab-2.4.2/src/scenefab/pipeline/narration/steps.py +134 -0
- {scenefab-2.2.0/src/scenefab/core → scenefab-2.4.2/src/scenefab/pipeline}/short_drama.py +14 -7
- scenefab-2.4.2/src/scenefab/pipeline/text_utils.py +38 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/pipeline/understanding_steps.py +210 -118
- scenefab-2.4.2/src/scenefab/plugins/examples/cinematic_subtitle/__init__.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/plugins/loader.py +3 -1
- scenefab-2.4.2/src/scenefab/project/__init__.py +19 -0
- scenefab-2.2.0/src/scenefab/project_manager.py → scenefab-2.4.2/src/scenefab/project/manager.py +100 -195
- scenefab-2.2.0/src/scenefab/project_template_manager.py → scenefab-2.4.2/src/scenefab/project/template_mgr.py +221 -290
- {scenefab-2.2.0/src/scenefab → scenefab-2.4.2/src/scenefab/project}/template_models.py +1 -1
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/secure_key_manager.py +41 -15
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/__init__.py +1 -6
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/ai/__init__.py +6 -16
- scenefab-2.4.2/src/scenefab/services/ai/base.py +28 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/ai/base_llm_provider.py +85 -113
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/ai/llm_manager.py +5 -5
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/ai/providers/__init__.py +0 -12
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/ai/providers/claude.py +9 -32
- scenefab-2.4.2/src/scenefab/services/ai/providers/deepseek.py +98 -0
- scenefab-2.4.2/src/scenefab/services/ai/providers/doubao.py +43 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/ai/providers/gemini.py +24 -70
- scenefab-2.4.2/src/scenefab/services/ai/providers/glm5.py +18 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/ai/providers/hunyuan.py +11 -15
- scenefab-2.4.2/src/scenefab/services/ai/providers/kimi.py +18 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/ai/providers/local.py +5 -2
- scenefab-2.4.2/src/scenefab/services/ai/providers/openai_compat.py +91 -0
- scenefab-2.4.2/src/scenefab/services/ai/providers/qwen.py +15 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/ai/providers/qwen37.py +85 -78
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/ai/retry.py +1 -1
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/ai/scene_analyzer.py +137 -19
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/ai/scene_models.py +1 -1
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/ai/script_generator/script_generator.py +19 -55
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/ai/script_stream.py +9 -157
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/ai/subtitle_extractor.py +1 -1
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/ai/subtitle_merger.py +4 -5
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/ai/subtitle_speech.py +2 -2
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/ai/subtitle_translator.py +13 -17
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/ai/tts_providers.py +9 -26
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/ai/vision_base.py +35 -0
- scenefab-2.4.2/src/scenefab/services/ai/vision_providers.py +118 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/ai/voice_models.py +3 -1
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/export/__init__.py +16 -23
- scenefab-2.2.0/src/scenefab/services/export/batch_export_manager.py → scenefab-2.4.2/src/scenefab/services/export/batch_export.py +41 -27
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/export/export_manager.py +71 -5
- scenefab-2.4.2/src/scenefab/services/export/export_utils.py +99 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/export/jianying_exporter.py +15 -9
- scenefab-2.4.2/src/scenefab/services/export/subtitle_exporter.py +75 -0
- scenefab-2.2.0/src/scenefab/services/export/direct_video_exporter.py → scenefab-2.4.2/src/scenefab/services/export/video_exporter.py +212 -113
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/orchestration/__init__.py +0 -20
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/orchestration/pipe_models.py +9 -10
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/video/__init__.py +45 -18
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/video/base_maker.py +0 -111
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/video/cache/frame_cache.py +40 -14
- {scenefab-2.2.0/src/scenefab/services/video_tools → scenefab-2.4.2/src/scenefab/services/video}/caption_gen.py +2 -1
- {scenefab-2.2.0/src/scenefab/services/video_tools → scenefab-2.4.2/src/scenefab/services/video}/hardware.py +16 -16
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/video/highlight_detector.py +4 -2
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/video/models/monologue.py +24 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/video/monologue_maker.py +115 -57
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/video/pipeline_integrator.py +10 -35
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/video/scene_converter.py +2 -5
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/video/session.py +15 -22
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/video/track_builder.py +1 -1
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/video/video_interleaver.py +12 -4
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/video_understanding/api_adapters.py +2 -1
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/video_understanding/core.py +13 -4
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/video_understanding/story_builder.py +1 -1
- scenefab-2.4.2/src/scenefab/settings/__init__.py +22 -0
- scenefab-2.2.0/src/scenefab/settings.py → scenefab-2.4.2/src/scenefab/settings/config.py +76 -109
- scenefab-2.2.0/src/scenefab/settings_data.py → scenefab-2.4.2/src/scenefab/settings/definitions.py +17 -23
- scenefab-2.2.0/src/scenefab/settings_manager.py → scenefab-2.4.2/src/scenefab/settings/manager.py +37 -37
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/signals_bridge.py +2 -2
- scenefab-2.4.2/src/scenefab/ui/__init__.py +26 -0
- scenefab-2.4.2/src/scenefab/ui/main/controls.py +63 -0
- scenefab-2.4.2/src/scenefab/ui/main/main_window/__init__.py +779 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/ui/main/main_window/nav_components.py +28 -23
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/ui/main/main_window/status_bar.py +36 -5
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/ui/main/main_window/top_bar.py +2 -2
- scenefab-2.4.2/src/scenefab/ui/main/page_router.py +103 -0
- scenefab-2.4.2/src/scenefab/ui/main/pages/__init__.py +28 -0
- scenefab-2.4.2/src/scenefab/ui/main/pages/assets_page.py +406 -0
- scenefab-2.4.2/src/scenefab/ui/main/pages/home_page.py +378 -0
- scenefab-2.4.2/src/scenefab/ui/main/pages/page_defaults.py +65 -0
- scenefab-2.4.2/src/scenefab/ui/main/pages/page_view_models.py +212 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/ui/main/pages/page_widgets.py +28 -22
- scenefab-2.4.2/src/scenefab/ui/main/pages/production_page.py +264 -0
- scenefab-2.4.2/src/scenefab/ui/main/pages/settings_page.py +563 -0
- scenefab-2.4.2/src/scenefab/ui/main/registry.py +138 -0
- scenefab-2.4.2/src/scenefab/ui/main/system_tray.py +115 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/ui/main/tray_manager.py +2 -2
- scenefab-2.4.2/src/scenefab/ui/theme/__init__.py +62 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/ui/theme/ds_tokens.py +247 -43
- scenefab-2.4.2/src/scenefab/ui/theme/runtime.py +130 -0
- scenefab-2.4.2/src/scenefab/ui/viewmodels/__init__.py +143 -0
- scenefab-2.4.2/src/scenefab/ui/viewmodels/assets_viewmodel.py +261 -0
- scenefab-2.4.2/src/scenefab/ui/viewmodels/home_viewmodel.py +185 -0
- scenefab-2.4.2/src/scenefab/ui/viewmodels/production_viewmodel.py +437 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/update/checker.py +11 -4
- scenefab-2.4.2/src/scenefab/utils/async_bridge.py +57 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/utils/async_subprocess.py +3 -28
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/utils/error_handler.py +23 -69
- scenefab-2.4.2/src/scenefab/utils/json_io.py +72 -0
- scenefab-2.4.2/src/scenefab/utils/lazy_imports.py +66 -0
- scenefab-2.4.2/src/scenefab/utils/project_io.py +135 -0
- scenefab-2.4.2/src/scenefab/utils/retry.py +143 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/utils/security.py +59 -25
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/utils/singleton.py +4 -13
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/utils/version.py +1 -1
- scenefab-2.4.2/src/scenefab.egg-info/PKG-INFO +451 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab.egg-info/SOURCES.txt +65 -117
- scenefab-2.4.2/tests/test_api_routers_coverage.py +266 -0
- scenefab-2.4.2/tests/test_assets_viewmodel.py +128 -0
- scenefab-2.4.2/tests/test_batch_export.py +34 -0
- scenefab-2.4.2/tests/test_benchmark.py +53 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/tests/test_config_manager.py +1 -22
- {scenefab-2.2.0 → scenefab-2.4.2}/tests/test_exceptions.py +10 -25
- scenefab-2.4.2/tests/test_fp_workflow.py +60 -0
- scenefab-2.4.2/tests/test_frame_cache_disk_fallback.py +159 -0
- scenefab-2.4.2/tests/test_home_viewmodel.py +127 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/tests/test_integration.py +23 -13
- scenefab-2.4.2/tests/test_page_vm.py +22 -0
- scenefab-2.4.2/tests/test_production_viewmodel.py +240 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/tests/test_project_manager.py +6 -3
- {scenefab-2.2.0 → scenefab-2.4.2}/tests/test_resources.py +14 -4
- scenefab-2.2.0/tests/test_script_generator_streaming.py → scenefab-2.4.2/tests/test_script_stream.py +0 -6
- {scenefab-2.2.0 → scenefab-2.4.2}/tests/test_service_container.py +3 -3
- scenefab-2.2.0/tests/test_project_settings_manager.py → scenefab-2.4.2/tests/test_settings_mgr.py +67 -1
- {scenefab-2.2.0 → scenefab-2.4.2}/tests/test_smoke_pipeline.py +130 -210
- scenefab-2.4.2/tests/test_template_mgr.py +420 -0
- scenefab-2.4.2/tests/test_text_utils.py +59 -0
- scenefab-2.4.2/tests/test_theme.py +115 -0
- scenefab-2.4.2/tests/test_theme_runtime.py +167 -0
- scenefab-2.4.2/tests/test_ui_module_smoke.py +139 -0
- scenefab-2.4.2/tests/test_update_checker.py +295 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/tests/test_version.py +0 -6
- scenefab-2.4.2/tests/test_video_exporter.py +219 -0
- scenefab-2.2.0/PKG-INFO +0 -179
- scenefab-2.2.0/README.md +0 -102
- scenefab-2.2.0/config/app_config.yaml +0 -82
- scenefab-2.2.0/resources/README.md +0 -43
- scenefab-2.2.0/resources/app_icon.svg +0 -57
- scenefab-2.2.0/resources/icons/app_icon.png +0 -0
- scenefab-2.2.0/resources/icons/app_icon_128.png +0 -0
- scenefab-2.2.0/resources/icons/app_icon_256.png +0 -0
- scenefab-2.2.0/resources/icons/app_icon_32.png +0 -0
- scenefab-2.2.0/resources/icons/app_icon_512.png +0 -0
- scenefab-2.2.0/resources/icons/app_icon_64.png +0 -0
- scenefab-2.2.0/resources/styles/dark_theme.qss +0 -431
- scenefab-2.2.0/resources/styles/light_theme.qss +0 -431
- scenefab-2.2.0/src/scenefab/api/routers/plugins.py +0 -154
- scenefab-2.2.0/src/scenefab/cache_impl/__init__.py +0 -25
- scenefab-2.2.0/src/scenefab/cache_impl/disk_cache.py +0 -331
- scenefab-2.2.0/src/scenefab/cache_impl/memory_cache.py +0 -303
- scenefab-2.2.0/src/scenefab/cache_manager.py +0 -213
- scenefab-2.2.0/src/scenefab/core/__init__.py +0 -194
- scenefab-2.2.0/src/scenefab/core/batch_processor.py +0 -526
- scenefab-2.2.0/src/scenefab/core/config_v2.py +0 -448
- scenefab-2.2.0/src/scenefab/core/event_store.py +0 -420
- scenefab-2.2.0/src/scenefab/core/pipeline_engine.py +0 -655
- scenefab-2.2.0/src/scenefab/core/platform_adapter.py +0 -650
- scenefab-2.2.0/src/scenefab/core/platform_extended.py +0 -622
- scenefab-2.2.0/src/scenefab/core/ws_hub.py +0 -330
- scenefab-2.2.0/src/scenefab/event_bus.py +0 -140
- scenefab-2.2.0/src/scenefab/interfaces/__init__.py +0 -17
- scenefab-2.2.0/src/scenefab/interfaces/cache_interface.py +0 -147
- scenefab-2.2.0/src/scenefab/logger.py +0 -150
- scenefab-2.2.0/src/scenefab/models/enums.py +0 -77
- scenefab-2.2.0/src/scenefab/orchestration/__init__.py +0 -10
- scenefab-2.2.0/src/scenefab/orchestration/pipeline_controller.py +0 -229
- scenefab-2.2.0/src/scenefab/pipeline/narration_steps.py +0 -326
- scenefab-2.2.0/src/scenefab/plugins/examples/cinematic_subtitle/cinematic_sub.py +0 -301
- scenefab-2.2.0/src/scenefab/plugins/examples/deepseek_ai_generator/deepseek_gen.py +0 -354
- scenefab-2.2.0/src/scenefab/registry_models.py +0 -148
- scenefab-2.2.0/src/scenefab/service_container.py +0 -22
- scenefab-2.2.0/src/scenefab/services/ai/adapters/__init__.py +0 -30
- scenefab-2.2.0/src/scenefab/services/ai/adapters/adapter_registry.py +0 -183
- scenefab-2.2.0/src/scenefab/services/ai/adapters/base.py +0 -195
- scenefab-2.2.0/src/scenefab/services/ai/asr.py +0 -157
- scenefab-2.2.0/src/scenefab/services/ai/base.py +0 -100
- scenefab-2.2.0/src/scenefab/services/ai/cache.py +0 -487
- scenefab-2.2.0/src/scenefab/services/ai/errors.py +0 -40
- scenefab-2.2.0/src/scenefab/services/ai/infra/__init__.py +0 -203
- scenefab-2.2.0/src/scenefab/services/ai/interfaces.py +0 -134
- scenefab-2.2.0/src/scenefab/services/ai/llm.py +0 -124
- scenefab-2.2.0/src/scenefab/services/ai/manager.py +0 -116
- scenefab-2.2.0/src/scenefab/services/ai/model_registry.py +0 -203
- scenefab-2.2.0/src/scenefab/services/ai/providers/deepseek.py +0 -144
- scenefab-2.2.0/src/scenefab/services/ai/providers/doubao.py +0 -116
- scenefab-2.2.0/src/scenefab/services/ai/providers/glm5.py +0 -52
- scenefab-2.2.0/src/scenefab/services/ai/providers/kimi.py +0 -56
- scenefab-2.2.0/src/scenefab/services/ai/providers/provider_models.py +0 -226
- scenefab-2.2.0/src/scenefab/services/ai/providers/qwen.py +0 -93
- scenefab-2.2.0/src/scenefab/services/ai/scene_analyzer_v2.py +0 -230
- scenefab-2.2.0/src/scenefab/services/ai/secure_subtitle_extractor.py +0 -169
- scenefab-2.2.0/src/scenefab/services/ai/sensevoice_provider.py +0 -637
- scenefab-2.2.0/src/scenefab/services/ai/tts.py +0 -208
- scenefab-2.2.0/src/scenefab/services/ai/vision.py +0 -167
- scenefab-2.2.0/src/scenefab/services/ai/vision_providers.py +0 -414
- scenefab-2.2.0/src/scenefab/services/ai/whisper_asr_provider.py +0 -305
- scenefab-2.2.0/src/scenefab/services/export/export_utils.py +0 -204
- scenefab-2.2.0/src/scenefab/services/export/subtitle_exporter.py +0 -70
- scenefab-2.2.0/src/scenefab/services/orchestration/pipeline_project_manager.py +0 -489
- scenefab-2.2.0/src/scenefab/services/video/grouping/__init__.py +0 -20
- scenefab-2.2.0/src/scenefab/services/video/grouping/smart_grouper.py +0 -428
- scenefab-2.2.0/src/scenefab/services/video/selection/__init__.py +0 -14
- scenefab-2.2.0/src/scenefab/services/video/selection/seg_selector.py +0 -194
- scenefab-2.2.0/src/scenefab/services/video_tools/__init__.py +0 -39
- scenefab-2.2.0/src/scenefab/task_manager.py +0 -519
- scenefab-2.2.0/src/scenefab/ui/__init__.py +0 -9
- scenefab-2.2.0/src/scenefab/ui/main/main_window/__init__.py +0 -273
- scenefab-2.2.0/src/scenefab/ui/main/pages/__init__.py +0 -13
- scenefab-2.2.0/src/scenefab/ui/main/pages/assets_page.py +0 -151
- scenefab-2.2.0/src/scenefab/ui/main/pages/home_page.py +0 -205
- scenefab-2.2.0/src/scenefab/ui/main/pages/production_page.py +0 -179
- scenefab-2.2.0/src/scenefab/ui/main/pages/settings_page.py +0 -249
- scenefab-2.2.0/src/scenefab/ui/theme/__init__.py +0 -3
- scenefab-2.2.0/src/scenefab/ui/theme/base_styles.py +0 -147
- scenefab-2.2.0/src/scenefab/ui/theme/theme_manager.py +0 -333
- scenefab-2.2.0/src/scenefab/ui/theme/tokens.py +0 -114
- scenefab-2.2.0/src/scenefab/utils/performance.py +0 -222
- scenefab-2.2.0/src/scenefab/utils/pickle_io.py +0 -35
- scenefab-2.2.0/src/scenefab/utils/secure_config_loader.py +0 -430
- scenefab-2.2.0/src/scenefab/utils/shortcut_manager.py +0 -384
- scenefab-2.2.0/src/scenefab/version_manager.py +0 -573
- scenefab-2.2.0/src/scenefab/version_models.py +0 -92
- scenefab-2.2.0/src/scenefab.egg-info/PKG-INFO +0 -179
- scenefab-2.2.0/tests/test_ai_service_manager.py +0 -104
- scenefab-2.2.0/tests/test_arch_v21.py +0 -645
- scenefab-2.2.0/tests/test_assembly_steps.py +0 -584
- scenefab-2.2.0/tests/test_base_exporter.py +0 -135
- scenefab-2.2.0/tests/test_benchmark.py +0 -101
- scenefab-2.2.0/tests/test_cache_manager.py +0 -86
- scenefab-2.2.0/tests/test_caption_generator.py +0 -231
- scenefab-2.2.0/tests/test_core_v2.py +0 -804
- scenefab-2.2.0/tests/test_direct_video_exporter.py +0 -106
- scenefab-2.2.0/tests/test_evaluation_steps.py +0 -721
- scenefab-2.2.0/tests/test_export_presets.py +0 -52
- scenefab-2.2.0/tests/test_ffmpeg_tool.py +0 -338
- scenefab-2.2.0/tests/test_highlight_detector.py +0 -90
- scenefab-2.2.0/tests/test_issue82_regression.py +0 -198
- scenefab-2.2.0/tests/test_jianying_exporter.py +0 -178
- scenefab-2.2.0/tests/test_llm_base.py +0 -141
- scenefab-2.2.0/tests/test_llm_cache.py +0 -289
- scenefab-2.2.0/tests/test_llm_providers.py +0 -69
- scenefab-2.2.0/tests/test_logger.py +0 -87
- scenefab-2.2.0/tests/test_model_catalog.py +0 -390
- scenefab-2.2.0/tests/test_monologue_maker.py +0 -129
- scenefab-2.2.0/tests/test_narration_state_machine.py +0 -481
- scenefab-2.2.0/tests/test_performance.py +0 -154
- scenefab-2.2.0/tests/test_pipeline_project_manager.py +0 -34
- scenefab-2.2.0/tests/test_project_models.py +0 -124
- scenefab-2.2.0/tests/test_project_template_manager.py +0 -99
- scenefab-2.2.0/tests/test_project_version_manager.py +0 -100
- scenefab-2.2.0/tests/test_script_generator.py +0 -87
- scenefab-2.2.0/tests/test_subtitle_extractor.py +0 -109
- scenefab-2.2.0/tests/test_tray_manager.py +0 -104
- scenefab-2.2.0/tests/test_ui_main_window.py +0 -41
- scenefab-2.2.0/tests/test_understanding_steps.py +0 -606
- scenefab-2.2.0/tests/test_video_maker.py +0 -135
- scenefab-2.2.0/tests/test_vision_providers.py +0 -149
- scenefab-2.2.0/tests/test_voice_generator.py +0 -142
- {scenefab-2.2.0 → scenefab-2.4.2}/LICENSE +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/MANIFEST.in +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/config/llm.yaml +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/config/logging.conf +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/resources/icon.icns +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/resources/icon.ico +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/setup.cfg +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/__init__.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/__main__.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/api/__init__.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/api/routers/__init__.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/api/routers/health.py +0 -0
- {scenefab-2.2.0/src/scenefab/tests → scenefab-2.4.2/src/scenefab/api/schemas}/__init__.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/api/schemas/models.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/core/ffmpeg_safe.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/models/constants.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/models/media.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/models/narration.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/models/video.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/plugins/__init__.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/plugins/examples/deepseek_ai_generator/__init__.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/plugins/interfaces/__init__.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/plugins/interfaces/ai_generator.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/plugins/interfaces/base.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/plugins/interfaces/export_plugin.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/plugins/registry.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/py.typed +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/ai/model_catalog.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/ai/provider_types.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/ai/scene_scorer.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/ai/script_generator/__init__.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/ai/script_generator/_prompt_builder.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/ai/script_generator/_response_parser.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/ai/script_generator/_style_prompts.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/ai/script_models.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/ai/subtitle_types.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/ai/voice_generator.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/export/jianying_adapter.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/export/presets.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/orchestration/enums.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/video/analyzer.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/video/cache/__init__.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/video/extraction/__init__.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/video/extraction/emotion_peak.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/video/extraction/first_person.py +0 -0
- {scenefab-2.2.0/src/scenefab/services/video_tools → scenefab-2.4.2/src/scenefab/services/video}/ffmpeg_tool.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/video/models/__init__.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/video/models/perspective.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/video/perspective_mapper.py +0 -0
- {scenefab-2.2.0/src/scenefab/services/video_tools → scenefab-2.4.2/src/scenefab/services/video}/probe.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/video/processor.py +0 -0
- /scenefab-2.2.0/src/scenefab/services/video_tools/base.py → /scenefab-2.4.2/src/scenefab/services/video/tool_base.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/video_understanding/__init__.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/services/video_understanding/models.py +0 -0
- /scenefab-2.2.0/src/scenefab/settings_types.py → /scenefab-2.4.2/src/scenefab/settings/types.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/templates/ai_enhancement/project_template.json +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/templates/ai_enhancement/template_info.json +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/templates/ai_enhancement/template_metadata.json +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/templates/video_tutorial/project_template.json +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/templates/video_tutorial/template_info.json +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/templates/video_tutorial/template_metadata.json +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/ui/main/__init__.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/ui/main/main_window/content_area.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/update/__init__.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab/utils/__init__.py +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab.egg-info/dependency_links.txt +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab.egg-info/entry_points.txt +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab.egg-info/requires.txt +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/src/scenefab.egg-info/top_level.txt +0 -0
- {scenefab-2.2.0 → scenefab-2.4.2}/tests/test_secure_key_manager.py +0 -0
scenefab-2.4.2/PKG-INFO
ADDED
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: scenefab
|
|
3
|
+
Version: 2.4.2
|
|
4
|
+
Summary: SceneFab - AI 影视解说视频创作工具,一键完成智能拆条 · 解说生成 · 配音合成
|
|
5
|
+
Author-email: Agions <agions@qq.com>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/Agions/scene-fab
|
|
8
|
+
Project-URL: Documentation, https://agions.github.io/scene-fab/
|
|
9
|
+
Project-URL: Repository, https://github.com/Agions/scene-fab.git
|
|
10
|
+
Project-URL: Issues, https://github.com/Agions/scene-fab/issues
|
|
11
|
+
Project-URL: Changelog, https://github.com/Agions/scene-fab/releases
|
|
12
|
+
Keywords: video,AI,film-commentary,scene-detection,TTS,短视频,影视解说
|
|
13
|
+
Classifier: Development Status :: 4 - Beta
|
|
14
|
+
Classifier: Environment :: X11 Applications :: Qt
|
|
15
|
+
Classifier: Environment :: MacOS X
|
|
16
|
+
Classifier: Environment :: Win32 (MS Windows)
|
|
17
|
+
Classifier: Intended Audience :: End Users/Desktop
|
|
18
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
19
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
20
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
21
|
+
Classifier: Operating System :: MacOS
|
|
22
|
+
Classifier: Programming Language :: Python :: 3
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
24
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
25
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
26
|
+
Classifier: Topic :: Multimedia :: Video
|
|
27
|
+
Classifier: Topic :: Multimedia :: Video :: Non-Linear Editor
|
|
28
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
29
|
+
Requires-Python: >=3.10
|
|
30
|
+
Description-Content-Type: text/markdown
|
|
31
|
+
License-File: LICENSE
|
|
32
|
+
Requires-Dist: PySide6>=6.9.0
|
|
33
|
+
Requires-Dist: Shiboken6>=6.9.0
|
|
34
|
+
Requires-Dist: opencv-python>=4.8.1
|
|
35
|
+
Requires-Dist: numpy>=1.26.0
|
|
36
|
+
Requires-Dist: pillow>=10.1.0
|
|
37
|
+
Requires-Dist: pydub>=0.25.0
|
|
38
|
+
Requires-Dist: soundfile>=0.12.0
|
|
39
|
+
Requires-Dist: edge-tts>=6.1.0
|
|
40
|
+
Requires-Dist: scenedetect>=0.6.0
|
|
41
|
+
Requires-Dist: requests>=2.31.0
|
|
42
|
+
Requires-Dist: httpx>=0.25.0
|
|
43
|
+
Requires-Dist: pydantic>=2.5.0
|
|
44
|
+
Requires-Dist: pydantic-settings>=2.0.0
|
|
45
|
+
Requires-Dist: python-dotenv>=1.0.0
|
|
46
|
+
Requires-Dist: pyyaml>=6.0.1
|
|
47
|
+
Requires-Dist: psutil>=5.9.6
|
|
48
|
+
Requires-Dist: cryptography>=41.0.0
|
|
49
|
+
Requires-Dist: keyring>=24.0.0
|
|
50
|
+
Requires-Dist: openai>=1.0.0
|
|
51
|
+
Requires-Dist: google-generativeai>=0.8.0
|
|
52
|
+
Requires-Dist: moviepy>=1.0.3
|
|
53
|
+
Requires-Dist: packaging>=21.0
|
|
54
|
+
Provides-Extra: ai-full
|
|
55
|
+
Requires-Dist: faster-whisper>=1.0.0; extra == "ai-full"
|
|
56
|
+
Requires-Dist: torch>=2.0.0; extra == "ai-full"
|
|
57
|
+
Requires-Dist: librosa>=0.10.0; extra == "ai-full"
|
|
58
|
+
Provides-Extra: translation
|
|
59
|
+
Requires-Dist: deepl>=1.18.0; extra == "translation"
|
|
60
|
+
Provides-Extra: api
|
|
61
|
+
Requires-Dist: fastapi>=0.109.0; extra == "api"
|
|
62
|
+
Requires-Dist: uvicorn>=0.27.0; extra == "api"
|
|
63
|
+
Provides-Extra: all
|
|
64
|
+
Requires-Dist: scenefab[ai-full,api,translation]; extra == "all"
|
|
65
|
+
Provides-Extra: dev
|
|
66
|
+
Requires-Dist: pytest>=7.4.0; extra == "dev"
|
|
67
|
+
Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
|
|
68
|
+
Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
|
|
69
|
+
Requires-Dist: pytest-timeout>=2.1.0; extra == "dev"
|
|
70
|
+
Requires-Dist: black>=23.11.0; extra == "dev"
|
|
71
|
+
Requires-Dist: mypy>=1.7.0; extra == "dev"
|
|
72
|
+
Requires-Dist: ruff>=0.1.0; extra == "dev"
|
|
73
|
+
Requires-Dist: types-requests>=2.31.0; extra == "dev"
|
|
74
|
+
Requires-Dist: types-PyYAML>=6.0.0; extra == "dev"
|
|
75
|
+
Requires-Dist: types-PySide6>=6.6.0; extra == "dev"
|
|
76
|
+
Dynamic: license-file
|
|
77
|
+
|
|
78
|
+
<div align="center">
|
|
79
|
+
|
|
80
|
+
<img src="assets/logo-horizontal.svg" alt="SceneFab" width="480"/>
|
|
81
|
+
|
|
82
|
+
# SceneFab · AI 影视解说视频创作工具
|
|
83
|
+
|
|
84
|
+
> **从素材理解、脚本生成、配音合成到多平台导出,一站式自动化生产流程**
|
|
85
|
+
|
|
86
|
+
[](https://github.com/Agions/scene-fab/releases)
|
|
87
|
+
[](https://www.python.org/)
|
|
88
|
+
[](https://doc.qt.io/qtforpython/)
|
|
89
|
+
[](https://ffmpeg.org/)
|
|
90
|
+
[](LICENSE)
|
|
91
|
+
|
|
92
|
+
[](https://github.com/Agions/scene-fab/actions)
|
|
93
|
+
[](https://agions.github.io/scene-fab/)
|
|
94
|
+
[](https://github.com/Agions/scene-fab/stargazers)
|
|
95
|
+
[](https://github.com/Agions/scene-fab/issues)
|
|
96
|
+
|
|
97
|
+
[**在线文档**](https://agions.github.io/scene-fab/) · [**下载安装**](https://github.com/Agions/scene-fab/releases) · [**快速开始**](#快速开始) · [**报告问题**](https://github.com/Agions/scene-fab/issues/new?template=bug_report.md) · [**功能建议**](https://github.com/Agions/scene-fab/discussions)
|
|
98
|
+
|
|
99
|
+
</div>
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## 🎬 它是什么?
|
|
104
|
+
|
|
105
|
+
**SceneFab** 是一款面向影视和短剧**第一人称解说**的 AI 视频创作工具。它将视频理解、脚本生成、配音合成、字幕装配和平台导出串成标准化流程,支持从单集创作到整季批量生产的完整链路。
|
|
106
|
+
|
|
107
|
+
系统围绕 **DAG 并行流水线引擎** 构建,采用事件驱动架构,支持 10+ 个 LLM 提供商和多平台导出预设。
|
|
108
|
+
|
|
109
|
+
### 解决什么问题?
|
|
110
|
+
|
|
111
|
+
| 痛点 | SceneFab 方案 |
|
|
112
|
+
|------|---------------|
|
|
113
|
+
| 🎞️ 视频拆条全靠手工打点,效率低 | AI 智能语义拆条(Qwen2.5-VL),按情节自动切分 |
|
|
114
|
+
| 📝 写脚本要理解人物关系 + 桥段 + 节奏 | 剧情图谱 + 桥段识别 + 第一人称 Hook→主体→钩子结构 |
|
|
115
|
+
| 🎙️ 配音成本高、音色不一致 | Edge-TTS 多音色 + F5-TTS 音色克隆,本地运行 |
|
|
116
|
+
| ⏱️ 字幕和配音对不齐 | 50ms 精度时间戳对齐,偏差 < 50ms 验收标准 |
|
|
117
|
+
| 📱 多平台导出参数杂 | 8 平台预设(抖音/B站/小红书/YouTube/TikTok...),一键导出 |
|
|
118
|
+
| 📚 短剧整季批量生产成本高 | 整季批量 + 断点续传 + 并行 worker + 实时进度追踪 |
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## 🚀 核心能力
|
|
123
|
+
|
|
124
|
+
<table>
|
|
125
|
+
<tr>
|
|
126
|
+
<td align="center" width="33%">
|
|
127
|
+
<h3>🎬 AI 视频理解</h3>
|
|
128
|
+
<p>场景分析 · 人物识别 · 情绪峰值检测<br/>桥段识别 · StoryGraph 剧情图谱</p>
|
|
129
|
+
</td>
|
|
130
|
+
<td align="center" width="33%">
|
|
131
|
+
<h3>📝 第一人称脚本</h3>
|
|
132
|
+
<p>Hook 改写 · 桥段模板 · 多模型复核<br/>字数约束 · 风格预设(7 种)</p>
|
|
133
|
+
</td>
|
|
134
|
+
<td align="center" width="33%">
|
|
135
|
+
<h3>🎙️ 智能配音合成</h3>
|
|
136
|
+
<p>Edge-TTS 多音色 · F5-TTS 克隆<br/>50ms 时间戳对齐 · 音量稳定</p>
|
|
137
|
+
</td>
|
|
138
|
+
</tr>
|
|
139
|
+
<tr>
|
|
140
|
+
<td align="center">
|
|
141
|
+
<h3>📐 字幕装配</h3>
|
|
142
|
+
<p>SRT/ASS 双格式 · 安全区控制<br/>样式保留 · 多平台适配</p>
|
|
143
|
+
</td>
|
|
144
|
+
<td align="center">
|
|
145
|
+
<h3>📱 多平台导出</h3>
|
|
146
|
+
<p>8 平台预设 · H.264/H.265<br/>剪映草稿 JSON · MP4 直出</p>
|
|
147
|
+
</td>
|
|
148
|
+
<td align="center">
|
|
149
|
+
<h3>🔄 批量生产</h3>
|
|
150
|
+
<p>整季批量 · 断点续传 · 并行 worker<br/>实时进度 · 失败重试</p>
|
|
151
|
+
</td>
|
|
152
|
+
</tr>
|
|
153
|
+
</table>
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## ⚡ 快速开始
|
|
158
|
+
|
|
159
|
+
### 📥 安装 SceneFab
|
|
160
|
+
|
|
161
|
+
#### 方式一:下载安装包(推荐新手)
|
|
162
|
+
|
|
163
|
+
从 [Releases](https://github.com/Agions/scene-fab/releases) 下载对应平台的安装包:
|
|
164
|
+
|
|
165
|
+
| 平台 | 文件 | 系统要求 |
|
|
166
|
+
|------|------|----------|
|
|
167
|
+
| Windows | `SceneFab-Setup-x.x.x.exe` | Windows 10+ |
|
|
168
|
+
| macOS | `SceneFab-x.x.x.dmg` | macOS 11+ (Apple Silicon / Intel) |
|
|
169
|
+
| Linux | `SceneFab-x.x.x.AppImage` | Ubuntu 20.04+ / glibc 2.31+ |
|
|
170
|
+
|
|
171
|
+
#### 方式二:pip 安装(推荐开发者)
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
# 1. 安装 SceneFab
|
|
175
|
+
pip install scenefab
|
|
176
|
+
|
|
177
|
+
# 2. 验证 FFmpeg(必需依赖)
|
|
178
|
+
ffmpeg -version
|
|
179
|
+
# 应输出:ffmpeg version 6.x ...
|
|
180
|
+
|
|
181
|
+
# 如果未安装 FFmpeg:
|
|
182
|
+
brew install ffmpeg # macOS
|
|
183
|
+
sudo apt install ffmpeg # Ubuntu/Debian
|
|
184
|
+
winget install ffmpeg # Windows
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### ⚙️ 配置 AI 服务
|
|
188
|
+
|
|
189
|
+
编辑 `config/llm.yaml`,填入至少一个 API Key:
|
|
190
|
+
|
|
191
|
+
```yaml
|
|
192
|
+
LLM:
|
|
193
|
+
default_provider: "deepseek"
|
|
194
|
+
|
|
195
|
+
deepseek:
|
|
196
|
+
enabled: true
|
|
197
|
+
api_key: "sk-your-deepseek-key"
|
|
198
|
+
model: "deepseek-v4-pro"
|
|
199
|
+
|
|
200
|
+
qwen:
|
|
201
|
+
enabled: true
|
|
202
|
+
api_key: "sk-your-qwen-key"
|
|
203
|
+
model: "qwen3.7-max"
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
或使用环境变量(更安全):
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
export DEEPSEEK_API_KEY="sk-your-deepseek-key"
|
|
210
|
+
export QWEN_API_KEY="sk-your-qwen-key"
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### ▶️ 启动 SceneFab
|
|
214
|
+
|
|
215
|
+
```bash
|
|
216
|
+
# 启动 GUI(默认)
|
|
217
|
+
scenefab
|
|
218
|
+
|
|
219
|
+
# 查看版本
|
|
220
|
+
scenefab --version
|
|
221
|
+
|
|
222
|
+
# 查看帮助
|
|
223
|
+
scenefab --help
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
详细说明请参阅 [在线文档 - 快速开始](https://agions.github.io/scene-fab/guide/quick-start)。
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## 🏗️ 技术架构
|
|
231
|
+
|
|
232
|
+
SceneFab 采用**事件驱动的 DAG 并行流水线**架构,每个模块职责清晰、易于扩展:
|
|
233
|
+
|
|
234
|
+
```mermaid
|
|
235
|
+
flowchart TB
|
|
236
|
+
subgraph Client["桌面客户端 (PySide6 6.9+)"]
|
|
237
|
+
UI[工作台 · 创作流程 · 项目资产]
|
|
238
|
+
ViewModel[MVVM ViewModel]
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
subgraph Core["核心引擎"]
|
|
242
|
+
Bus[事件总线]
|
|
243
|
+
Engine[DAG 流水线引擎]
|
|
244
|
+
DI[依赖注入容器]
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
subgraph Services["业务服务"]
|
|
248
|
+
AI[AI 服务<br/>LLM · 视觉 · TTS · 脚本生成]
|
|
249
|
+
Video[视频服务<br/>分析 · 处理 · 导出]
|
|
250
|
+
Export[导出服务<br/>剪映 · MP4 · 字幕]
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
subgraph Pipeline["生产流水线"]
|
|
254
|
+
Import[① 素材导入]
|
|
255
|
+
Analyze[② 场景分析]
|
|
256
|
+
Script[③ 脚本生成]
|
|
257
|
+
Voice[④ 配音合成]
|
|
258
|
+
Caption[⑤ 字幕对齐]
|
|
259
|
+
Pub[⑥ 导出发布]
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
UI --> ViewModel
|
|
263
|
+
ViewModel --> Bus
|
|
264
|
+
Bus --> Engine
|
|
265
|
+
Engine --> DI
|
|
266
|
+
DI --> AI
|
|
267
|
+
DI --> Video
|
|
268
|
+
DI --> Export
|
|
269
|
+
Engine --> Pipeline
|
|
270
|
+
|
|
271
|
+
Import --> Analyze
|
|
272
|
+
Analyze --> Script
|
|
273
|
+
Script --> Voice
|
|
274
|
+
Voice --> Caption
|
|
275
|
+
Caption --> Pub
|
|
276
|
+
|
|
277
|
+
classDef brand fill:#0e7490,stroke:#22d3ee,color:#fff
|
|
278
|
+
classDef accent fill:#7c3aed,stroke:#a855f7,color:#fff
|
|
279
|
+
class Engine,DI,Bus brand
|
|
280
|
+
class AI,Video,Export accent
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
### 关键设计决策
|
|
284
|
+
|
|
285
|
+
- **MVVM 架构** — UI 与业务逻辑解耦(v2.4.0 全面 ViewModel 化)
|
|
286
|
+
- **事件驱动** — 解耦模块通信,所有状态变更可追溯
|
|
287
|
+
- **DAG 流水线** — 支持并行执行和断点续传
|
|
288
|
+
- **插件化** — LLM / TTS / 视觉模型均可热插拔
|
|
289
|
+
- **本地优先** — 视频数据不出本机,仅 AI 调用走云端
|
|
290
|
+
|
|
291
|
+
---
|
|
292
|
+
|
|
293
|
+
## 🛠️ 技术栈
|
|
294
|
+
|
|
295
|
+
| 组件 | 技术选型 | 用途 |
|
|
296
|
+
|------|----------|------|
|
|
297
|
+
| 桌面端 | PySide6 6.9+ | Qt 跨平台 GUI |
|
|
298
|
+
| 视频处理 | FFmpeg 6.x · OpenCV · MoviePy | 音视频分析与合成 |
|
|
299
|
+
| AI 推理 | OpenAI SDK · google-generativeai | LLM 和视觉模型调用 |
|
|
300
|
+
| 语音合成 | Edge-TTS · F5-TTS | 解说配音生成 |
|
|
301
|
+
| 场景检测 | PySceneDetect | 视频场景自动分割 |
|
|
302
|
+
| 数据验证 | Pydantic 2.5+ | 结构化数据校验 |
|
|
303
|
+
| 配置管理 | PyYAML · python-dotenv | YAML/环境变量配置 |
|
|
304
|
+
| 安全 | cryptography · keyring | API 密钥加密存储 |
|
|
305
|
+
| HTTP API | FastAPI · uvicorn | 可选 REST API 服务 |
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
## 📁 项目结构
|
|
310
|
+
|
|
311
|
+
```
|
|
312
|
+
scene-fab/
|
|
313
|
+
├── src/scenefab/ # 主包
|
|
314
|
+
│ ├── core/ # 基础设施(事件总线 · DI · 审计 · 流水线引擎)
|
|
315
|
+
│ ├── models/ # 数据模型(项目 · 视频 · 叙述 · 媒体)
|
|
316
|
+
│ ├── services/ # 业务服务
|
|
317
|
+
│ │ ├── ai/ # AI 服务(LLM · 视觉 · TTS · 脚本生成)
|
|
318
|
+
│ │ ├── video/ # 视频服务(分析 · 处理 · 导出)
|
|
319
|
+
│ │ ├── export/ # 导出服务(剪映 · MP4 · 字幕)
|
|
320
|
+
│ │ └── video_tools/ # 视频工具(FFmpeg · 探测 · 硬件加速)
|
|
321
|
+
│ ├── pipeline/ # 生产流水线(状态机 · 步骤 · 评估)
|
|
322
|
+
│ ├── plugins/ # 插件系统(加载 · 注册 · 接口)
|
|
323
|
+
│ ├── api/ # HTTP API(FastAPI 路由)
|
|
324
|
+
│ ├── ui/ # 用户界面(PySide6 页面 · 主题)
|
|
325
|
+
│ └── utils/ # 工具函数(安全 · 版本 · 日志)
|
|
326
|
+
├── tests/ # 测试套件
|
|
327
|
+
├── docs/ # VitePress 文档站
|
|
328
|
+
├── assets/ # 品牌资源(logo · 徽章)
|
|
329
|
+
├── resources/ # 应用资源(图标 · 样式)
|
|
330
|
+
├── scripts/ # 构建/工具脚本
|
|
331
|
+
└── config/ # 配置文件
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
---
|
|
335
|
+
|
|
336
|
+
## 📚 文档导航
|
|
337
|
+
|
|
338
|
+
| 文档 | 说明 |
|
|
339
|
+
|------|------|
|
|
340
|
+
| [在线文档](https://agions.github.io/scene-fab/) | 完整文档中心(VitePress) |
|
|
341
|
+
| [快速开始](https://agions.github.io/scene-fab/guide/quick-start) | 3 步安装、配置和首次运行 |
|
|
342
|
+
| [安装指南](https://agions.github.io/scene-fab/guide/installation) | 各平台完整安装步骤 |
|
|
343
|
+
| [AI 配置](https://agions.github.io/scene-fab/guide/ai-configuration) | 多服务商配置详解 |
|
|
344
|
+
| [CLI 参考](https://agions.github.io/scene-fab/guide/cli-reference) | 命令行使用说明 |
|
|
345
|
+
| [Python API](https://agions.github.io/scene-fab/guide/python-api) | Python API 完整文档 |
|
|
346
|
+
| [生产规范](https://agions.github.io/scene-fab/guide/first-person-narration-production) | 第一人称解说完整生产流程 |
|
|
347
|
+
| [AI 工作流](https://agions.github.io/scene-fab/guide/ai-video-guide) | 从视频到成片的 AI 流程详解 |
|
|
348
|
+
| [导出发布](https://agions.github.io/scene-fab/guide/exporting) | 导出格式与平台预设 |
|
|
349
|
+
| [疑难排查](https://agions.github.io/scene-fab/guide/troubleshooting) | 常见问题解决 |
|
|
350
|
+
|
|
351
|
+
---
|
|
352
|
+
|
|
353
|
+
## 🗺️ 路线图
|
|
354
|
+
|
|
355
|
+
### ✅ v2.4.0(2026-07-01)— UI 架构升级
|
|
356
|
+
|
|
357
|
+
- [x] **Phase 1** — UI 模块化分层(净 -1536 行死代码)
|
|
358
|
+
- [x] **Phase 2** — ViewModel 化拆分
|
|
359
|
+
- [x] **Phase 3** — 暗色主题 + 运行时切换端到端
|
|
360
|
+
- [x] **品牌重塑** — 双色调 logo 系统 + OG image + 渲染 pipeline
|
|
361
|
+
|
|
362
|
+
### 🚧 v2.5.0(计划中)
|
|
363
|
+
|
|
364
|
+
- [ ] **drag-drop 文件拖拽**(`AssetsPage` 的 `dragEnterEvent`/`dropEvent`)
|
|
365
|
+
- [ ] **ViewModel 严格分层**(移除 `TYPE_CHECKING` hack, viewmodel 不再依赖 UI 类型)
|
|
366
|
+
- [ ] **macOS 公证**(解决 Gatekeeper 拦截)
|
|
367
|
+
- [ ] **批量生产 UI**(整季批量可视化调度)
|
|
368
|
+
|
|
369
|
+
### 💡 v3.0.0(远期)
|
|
370
|
+
|
|
371
|
+
- [ ] **Web 版本** — Tauri 重写桌面端 + Web 端复用核心
|
|
372
|
+
- [ ] **多人协作** — 云端项目同步 + 团队权限
|
|
373
|
+
- [ ] **AI 实时预览** — 边生成边预览,减少等待焦虑
|
|
374
|
+
- [ ] **插件市场** — 第三方 LLM / TTS / 视觉模型接入
|
|
375
|
+
|
|
376
|
+
---
|
|
377
|
+
|
|
378
|
+
## 🤝 贡献
|
|
379
|
+
|
|
380
|
+
欢迎贡献代码、报告问题或提出建议。
|
|
381
|
+
|
|
382
|
+
### 开发环境
|
|
383
|
+
|
|
384
|
+
```bash
|
|
385
|
+
# 克隆仓库
|
|
386
|
+
git clone https://github.com/Agions/scene-fab.git
|
|
387
|
+
cd scene-fab
|
|
388
|
+
|
|
389
|
+
# 安装开发依赖
|
|
390
|
+
pip install -e ".[dev]"
|
|
391
|
+
|
|
392
|
+
# 运行测试
|
|
393
|
+
make test
|
|
394
|
+
|
|
395
|
+
# 代码检查
|
|
396
|
+
make lint
|
|
397
|
+
|
|
398
|
+
# 格式化
|
|
399
|
+
make format
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
### 提交规范(Conventional Commits)
|
|
403
|
+
|
|
404
|
+
| 类型 | 用途 | 示例 |
|
|
405
|
+
|------|------|------|
|
|
406
|
+
| `feat` | 新功能 | `feat(pipeline): add batch production support` |
|
|
407
|
+
| `fix` | Bug 修复 | `fix(ai): handle Qwen API timeout gracefully` |
|
|
408
|
+
| `docs` | 文档变更 | `docs(readme): update installation steps` |
|
|
409
|
+
| `style` | 代码格式(无逻辑变更) | `style(ui): fix indentation in HomePage` |
|
|
410
|
+
| `refactor` | 代码重构 | `refactor(core): split event bus into modules` |
|
|
411
|
+
| `perf` | 性能优化 | `perf(video): cache scene analysis results` |
|
|
412
|
+
| `test` | 测试相关 | `test(services): add e2e for export pipeline` |
|
|
413
|
+
| `chore` | 构建/工具 | `chore(deps): bump PySide6 to 6.9` |
|
|
414
|
+
|
|
415
|
+
提交前请运行 `make lint` 和 `make test`。
|
|
416
|
+
|
|
417
|
+
### 问题反馈
|
|
418
|
+
|
|
419
|
+
- 🐛 [Bug 报告](https://github.com/Agions/scene-fab/issues/new?template=bug_report.md)
|
|
420
|
+
- 💡 [功能建议](https://github.com/Agions/scene-fab/issues/new?template=feature_request.md)
|
|
421
|
+
- 💬 [讨论区](https://github.com/Agions/scene-fab/discussions)
|
|
422
|
+
|
|
423
|
+
---
|
|
424
|
+
|
|
425
|
+
## 🙏 致谢
|
|
426
|
+
|
|
427
|
+
SceneFab 的诞生离不开以下开源项目:
|
|
428
|
+
|
|
429
|
+
- [PySide6](https://doc.qt.io/qtforpython/) — Qt 官方 Python 绑定
|
|
430
|
+
- [FFmpeg](https://ffmpeg.org/) — 跨平台音视频处理
|
|
431
|
+
- [Edge-TTS](https://github.com/rany2/edge-tts) — 免费高质量 TTS
|
|
432
|
+
- [F5-TTS](https://github.com/SWivid/F5-TTS) — 开源音色克隆
|
|
433
|
+
- [PySceneDetect](https://www.scenedetect.com/) — 视频场景检测
|
|
434
|
+
- [Pydantic](https://pydantic-docs.helpmanual.io/) — 数据验证
|
|
435
|
+
- [VitePress](https://vitepress.dev/) — 文档站框架
|
|
436
|
+
|
|
437
|
+
---
|
|
438
|
+
|
|
439
|
+
## 📄 许可证
|
|
440
|
+
|
|
441
|
+
[MIT License](LICENSE) © 2025-2026 [Agions](https://github.com/Agions)
|
|
442
|
+
|
|
443
|
+
---
|
|
444
|
+
|
|
445
|
+
<div align="center">
|
|
446
|
+
|
|
447
|
+
**[⭐ Star](https://github.com/Agions/scene-fab)** · **[🍴 Fork](https://github.com/Agions/scene-fab/fork)** · **[📖 文档](https://agions.github.io/scene-fab/)** · **[📝 更新日志](CHANGELOG.md)**
|
|
448
|
+
|
|
449
|
+
<sub>SceneFab v2.4.0 · Made with ❤️ by [Agions](https://github.com/Agions) and [contributors](https://github.com/Agions/scene-fab/graphs/contributors)</sub>
|
|
450
|
+
|
|
451
|
+
</div>
|