scenefab 1.0.0__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-1.0.0/LICENSE +21 -0
- scenefab-1.0.0/MANIFEST.in +8 -0
- scenefab-1.0.0/PKG-INFO +225 -0
- scenefab-1.0.0/README.md +151 -0
- scenefab-1.0.0/config/app_config.yaml +82 -0
- scenefab-1.0.0/config/llm.yaml +94 -0
- scenefab-1.0.0/config/logging.conf +67 -0
- scenefab-1.0.0/pyproject.toml +219 -0
- scenefab-1.0.0/resources/icons/app_icon_128.png +0 -0
- scenefab-1.0.0/resources/icons/app_icon_256.png +0 -0
- scenefab-1.0.0/resources/icons/app_icon_32.png +0 -0
- scenefab-1.0.0/resources/icons/app_icon_512.png +0 -0
- scenefab-1.0.0/resources/icons/app_icon_64.png +0 -0
- scenefab-1.0.0/resources/styles/dark_theme.qss +807 -0
- scenefab-1.0.0/resources/styles/light_theme.qss +371 -0
- scenefab-1.0.0/setup.cfg +4 -0
- scenefab-1.0.0/src/scenefab/__init__.py +3 -0
- scenefab-1.0.0/src/scenefab/__main__.py +17 -0
- scenefab-1.0.0/src/scenefab/_signals.py +45 -0
- scenefab-1.0.0/src/scenefab/ai_services.py +37 -0
- scenefab-1.0.0/src/scenefab/api/__init__.py +7 -0
- scenefab-1.0.0/src/scenefab/api/main.py +108 -0
- scenefab-1.0.0/src/scenefab/api/routers/__init__.py +7 -0
- scenefab-1.0.0/src/scenefab/api/routers/_task_store.py +140 -0
- scenefab-1.0.0/src/scenefab/api/routers/export.py +189 -0
- scenefab-1.0.0/src/scenefab/api/routers/health.py +45 -0
- scenefab-1.0.0/src/scenefab/api/routers/pipeline.py +174 -0
- scenefab-1.0.0/src/scenefab/api/routers/plugins.py +151 -0
- scenefab-1.0.0/src/scenefab/api/routers/projects.py +64 -0
- scenefab-1.0.0/src/scenefab/api/schemas/models.py +107 -0
- scenefab-1.0.0/src/scenefab/application.py +504 -0
- scenefab-1.0.0/src/scenefab/cache_impl/__init__.py +19 -0
- scenefab-1.0.0/src/scenefab/cache_impl/disk_cache.py +324 -0
- scenefab-1.0.0/src/scenefab/cache_impl/memory_cache.py +288 -0
- scenefab-1.0.0/src/scenefab/cache_manager.py +210 -0
- scenefab-1.0.0/src/scenefab/cli/__init__.py +14 -0
- scenefab-1.0.0/src/scenefab/cli/main.py +523 -0
- scenefab-1.0.0/src/scenefab/cli.py +403 -0
- scenefab-1.0.0/src/scenefab/config_manager.py +62 -0
- scenefab-1.0.0/src/scenefab/core/__init__.py +132 -0
- scenefab-1.0.0/src/scenefab/engine.py +30 -0
- scenefab-1.0.0/src/scenefab/event_bus.py +178 -0
- scenefab-1.0.0/src/scenefab/exceptions.py +490 -0
- scenefab-1.0.0/src/scenefab/exporters.py +100 -0
- scenefab-1.0.0/src/scenefab/interfaces/__init__.py +17 -0
- scenefab-1.0.0/src/scenefab/interfaces/cache_interface.py +139 -0
- scenefab-1.0.0/src/scenefab/logger.py +149 -0
- scenefab-1.0.0/src/scenefab/main.py +386 -0
- scenefab-1.0.0/src/scenefab/models/__init__.py +70 -0
- scenefab-1.0.0/src/scenefab/models/media.py +52 -0
- scenefab-1.0.0/src/scenefab/models/narration.py +59 -0
- scenefab-1.0.0/src/scenefab/models/project.py +130 -0
- scenefab-1.0.0/src/scenefab/models/project_models.py +215 -0
- scenefab-1.0.0/src/scenefab/models/video.py +83 -0
- scenefab-1.0.0/src/scenefab/models.py +78 -0
- scenefab-1.0.0/src/scenefab/orchestration/__init__.py +10 -0
- scenefab-1.0.0/src/scenefab/orchestration/pipeline_controller.py +223 -0
- scenefab-1.0.0/src/scenefab/pipeline.py +952 -0
- scenefab-1.0.0/src/scenefab/plugins/__init__.py +16 -0
- scenefab-1.0.0/src/scenefab/plugins/examples/cinematic_subtitle/cinematic_sub.py +278 -0
- scenefab-1.0.0/src/scenefab/plugins/examples/deepseek_ai_generator/__init__.py +5 -0
- scenefab-1.0.0/src/scenefab/plugins/examples/deepseek_ai_generator/deepseek_gen.py +348 -0
- scenefab-1.0.0/src/scenefab/plugins/interfaces/__init__.py +8 -0
- scenefab-1.0.0/src/scenefab/plugins/interfaces/ai_generator.py +119 -0
- scenefab-1.0.0/src/scenefab/plugins/interfaces/base.py +246 -0
- scenefab-1.0.0/src/scenefab/plugins/interfaces/export_plugin.py +80 -0
- scenefab-1.0.0/src/scenefab/plugins/loader.py +407 -0
- scenefab-1.0.0/src/scenefab/plugins/registry.py +305 -0
- scenefab-1.0.0/src/scenefab/project_manager.py +506 -0
- scenefab-1.0.0/src/scenefab/project_template_manager.py +670 -0
- scenefab-1.0.0/src/scenefab/py.typed +2 -0
- scenefab-1.0.0/src/scenefab/registry_models.py +139 -0
- scenefab-1.0.0/src/scenefab/secure_key_manager.py +352 -0
- scenefab-1.0.0/src/scenefab/service_container.py +211 -0
- scenefab-1.0.0/src/scenefab/services/__init__.py +46 -0
- scenefab-1.0.0/src/scenefab/services/ai/__init__.py +104 -0
- scenefab-1.0.0/src/scenefab/services/ai/adapters/__init__.py +30 -0
- scenefab-1.0.0/src/scenefab/services/ai/adapters/adapter_registry.py +154 -0
- scenefab-1.0.0/src/scenefab/services/ai/adapters/base.py +186 -0
- scenefab-1.0.0/src/scenefab/services/ai/asr.py +167 -0
- scenefab-1.0.0/src/scenefab/services/ai/base.py +93 -0
- scenefab-1.0.0/src/scenefab/services/ai/base_llm_provider.py +561 -0
- scenefab-1.0.0/src/scenefab/services/ai/cache.py +466 -0
- scenefab-1.0.0/src/scenefab/services/ai/errors.py +41 -0
- scenefab-1.0.0/src/scenefab/services/ai/infra/__init__.py +200 -0
- scenefab-1.0.0/src/scenefab/services/ai/interfaces.py +130 -0
- scenefab-1.0.0/src/scenefab/services/ai/llm.py +133 -0
- scenefab-1.0.0/src/scenefab/services/ai/llm_manager.py +256 -0
- scenefab-1.0.0/src/scenefab/services/ai/manager.py +102 -0
- scenefab-1.0.0/src/scenefab/services/ai/model_registry.py +198 -0
- scenefab-1.0.0/src/scenefab/services/ai/provider_types.py +57 -0
- scenefab-1.0.0/src/scenefab/services/ai/providers/__init__.py +35 -0
- scenefab-1.0.0/src/scenefab/services/ai/providers/claude.py +179 -0
- scenefab-1.0.0/src/scenefab/services/ai/providers/deepseek.py +184 -0
- scenefab-1.0.0/src/scenefab/services/ai/providers/doubao.py +146 -0
- scenefab-1.0.0/src/scenefab/services/ai/providers/gemini.py +202 -0
- scenefab-1.0.0/src/scenefab/services/ai/providers/glm5.py +72 -0
- scenefab-1.0.0/src/scenefab/services/ai/providers/hunyuan.py +157 -0
- scenefab-1.0.0/src/scenefab/services/ai/providers/kimi.py +77 -0
- scenefab-1.0.0/src/scenefab/services/ai/providers/local.py +218 -0
- scenefab-1.0.0/src/scenefab/services/ai/providers/provider_models.py +206 -0
- scenefab-1.0.0/src/scenefab/services/ai/providers/qwen.py +123 -0
- scenefab-1.0.0/src/scenefab/services/ai/retry.py +282 -0
- scenefab-1.0.0/src/scenefab/services/ai/scene_analyzer.py +348 -0
- scenefab-1.0.0/src/scenefab/services/ai/scene_analyzer_v2.py +231 -0
- scenefab-1.0.0/src/scenefab/services/ai/scene_models.py +71 -0
- scenefab-1.0.0/src/scenefab/services/ai/scene_scorer.py +207 -0
- scenefab-1.0.0/src/scenefab/services/ai/script_generator.py +827 -0
- scenefab-1.0.0/src/scenefab/services/ai/script_models.py +101 -0
- scenefab-1.0.0/src/scenefab/services/ai/script_stream.py +458 -0
- scenefab-1.0.0/src/scenefab/services/ai/secure_subtitle_extractor.py +177 -0
- scenefab-1.0.0/src/scenefab/services/ai/sensevoice_provider.py +574 -0
- scenefab-1.0.0/src/scenefab/services/ai/subtitle_extractor.py +240 -0
- scenefab-1.0.0/src/scenefab/services/ai/subtitle_merger.py +110 -0
- scenefab-1.0.0/src/scenefab/services/ai/subtitle_speech.py +251 -0
- scenefab-1.0.0/src/scenefab/services/ai/subtitle_translator.py +357 -0
- scenefab-1.0.0/src/scenefab/services/ai/subtitle_types.py +31 -0
- scenefab-1.0.0/src/scenefab/services/ai/tts.py +195 -0
- scenefab-1.0.0/src/scenefab/services/ai/tts_providers.py +497 -0
- scenefab-1.0.0/src/scenefab/services/ai/vision.py +166 -0
- scenefab-1.0.0/src/scenefab/services/ai/vision_providers.py +479 -0
- scenefab-1.0.0/src/scenefab/services/ai/voice_generator.py +202 -0
- scenefab-1.0.0/src/scenefab/services/ai/voice_models.py +99 -0
- scenefab-1.0.0/src/scenefab/services/ai/whisper_asr_provider.py +300 -0
- scenefab-1.0.0/src/scenefab/services/ai_service_manager.py +91 -0
- scenefab-1.0.0/src/scenefab/services/audio/__init__.py +58 -0
- scenefab-1.0.0/src/scenefab/services/audio/beat_detector.py +411 -0
- scenefab-1.0.0/src/scenefab/services/audio/sync_engine.py +322 -0
- scenefab-1.0.0/src/scenefab/services/export/__init__.py +99 -0
- scenefab-1.0.0/src/scenefab/services/export/batch_export_manager.py +369 -0
- scenefab-1.0.0/src/scenefab/services/export/direct_video_exporter.py +517 -0
- scenefab-1.0.0/src/scenefab/services/export/export_manager.py +141 -0
- scenefab-1.0.0/src/scenefab/services/export/export_utils.py +191 -0
- scenefab-1.0.0/src/scenefab/services/export/jianying_adapter.py +313 -0
- scenefab-1.0.0/src/scenefab/services/export/jianying_exporter.py +431 -0
- scenefab-1.0.0/src/scenefab/services/export/video_exporter.py +357 -0
- scenefab-1.0.0/src/scenefab/services/orchestration/__init__.py +61 -0
- scenefab-1.0.0/src/scenefab/services/orchestration/enums.py +47 -0
- scenefab-1.0.0/src/scenefab/services/orchestration/pipe_models.py +168 -0
- scenefab-1.0.0/src/scenefab/services/orchestration/pipeline_project_manager.py +506 -0
- scenefab-1.0.0/src/scenefab/services/service_manager.py +280 -0
- scenefab-1.0.0/src/scenefab/services/video/__init__.py +139 -0
- scenefab-1.0.0/src/scenefab/services/video/analyzer.py +108 -0
- scenefab-1.0.0/src/scenefab/services/video/base_maker.py +251 -0
- scenefab-1.0.0/src/scenefab/services/video/cache/__init__.py +10 -0
- scenefab-1.0.0/src/scenefab/services/video/cache/frame_cache.py +272 -0
- scenefab-1.0.0/src/scenefab/services/video/cache/legacy_cache.py +67 -0
- scenefab-1.0.0/src/scenefab/services/video/extraction/__init__.py +23 -0
- scenefab-1.0.0/src/scenefab/services/video/extraction/emotion_peak.py +226 -0
- scenefab-1.0.0/src/scenefab/services/video/extraction/first_person.py +275 -0
- scenefab-1.0.0/src/scenefab/services/video/grouping/__init__.py +20 -0
- scenefab-1.0.0/src/scenefab/services/video/grouping/smart_grouper.py +373 -0
- scenefab-1.0.0/src/scenefab/services/video/highlight_detector.py +546 -0
- scenefab-1.0.0/src/scenefab/services/video/models/__init__.py +21 -0
- scenefab-1.0.0/src/scenefab/services/video/models/monologue.py +65 -0
- scenefab-1.0.0/src/scenefab/services/video/models/perspective.py +206 -0
- scenefab-1.0.0/src/scenefab/services/video/monologue_maker.py +601 -0
- scenefab-1.0.0/src/scenefab/services/video/perspective_mapper.py +281 -0
- scenefab-1.0.0/src/scenefab/services/video/pipeline_integrator.py +508 -0
- scenefab-1.0.0/src/scenefab/services/video/processor.py +196 -0
- scenefab-1.0.0/src/scenefab/services/video/scene_converter.py +198 -0
- scenefab-1.0.0/src/scenefab/services/video/selection/__init__.py +14 -0
- scenefab-1.0.0/src/scenefab/services/video/selection/seg_selector.py +194 -0
- scenefab-1.0.0/src/scenefab/services/video/session.py +265 -0
- scenefab-1.0.0/src/scenefab/services/video/track_builder.py +140 -0
- scenefab-1.0.0/src/scenefab/services/video/video_interleaver.py +366 -0
- scenefab-1.0.0/src/scenefab/services/video_tools/__init__.py +38 -0
- scenefab-1.0.0/src/scenefab/services/video_tools/base.py +187 -0
- scenefab-1.0.0/src/scenefab/services/video_tools/caption_gen.py +420 -0
- scenefab-1.0.0/src/scenefab/services/video_tools/ffmpeg_tool.py +699 -0
- scenefab-1.0.0/src/scenefab/settings.py +297 -0
- scenefab-1.0.0/src/scenefab/settings_data.py +356 -0
- scenefab-1.0.0/src/scenefab/settings_manager.py +564 -0
- scenefab-1.0.0/src/scenefab/settings_types.py +63 -0
- scenefab-1.0.0/src/scenefab/task_manager.py +460 -0
- scenefab-1.0.0/src/scenefab/template_models.py +106 -0
- scenefab-1.0.0/src/scenefab/templates/ai_enhancement/project_template.json +103 -0
- scenefab-1.0.0/src/scenefab/templates/ai_enhancement/template_info.json +22 -0
- scenefab-1.0.0/src/scenefab/templates/ai_enhancement/template_metadata.json +15 -0
- scenefab-1.0.0/src/scenefab/templates/video_tutorial/project_template.json +80 -0
- scenefab-1.0.0/src/scenefab/templates/video_tutorial/template_info.json +22 -0
- scenefab-1.0.0/src/scenefab/templates/video_tutorial/template_metadata.json +16 -0
- scenefab-1.0.0/src/scenefab/tests/__init__.py +0 -0
- scenefab-1.0.0/src/scenefab/ui/__init__.py +9 -0
- scenefab-1.0.0/src/scenefab/ui/common/macos_components.py +42 -0
- scenefab-1.0.0/src/scenefab/ui/components/__init__.py +33 -0
- scenefab-1.0.0/src/scenefab/ui/components/animations.py +299 -0
- scenefab-1.0.0/src/scenefab/ui/components/buttons/__init__.py +87 -0
- scenefab-1.0.0/src/scenefab/ui/components/common_styles.py +219 -0
- scenefab-1.0.0/src/scenefab/ui/components/containers/__init__.py +64 -0
- scenefab-1.0.0/src/scenefab/ui/components/containers/preview_panel.py +227 -0
- scenefab-1.0.0/src/scenefab/ui/components/containers/project_card.py +195 -0
- scenefab-1.0.0/src/scenefab/ui/components/containers/video_player.py +306 -0
- scenefab-1.0.0/src/scenefab/ui/components/design_system.py +579 -0
- scenefab-1.0.0/src/scenefab/ui/components/emotion_controller/__init__.py +23 -0
- scenefab-1.0.0/src/scenefab/ui/components/emotion_controller/curve_wgt.py +522 -0
- scenefab-1.0.0/src/scenefab/ui/components/emotion_controller/emotion_ctrl.py +504 -0
- scenefab-1.0.0/src/scenefab/ui/components/emotion_controller/emotion_presets.py +302 -0
- scenefab-1.0.0/src/scenefab/ui/components/empty_state.py +304 -0
- scenefab-1.0.0/src/scenefab/ui/components/home_components.py +407 -0
- scenefab-1.0.0/src/scenefab/ui/components/inputs/__init__.py +40 -0
- scenefab-1.0.0/src/scenefab/ui/components/labels/__init__.py +60 -0
- scenefab-1.0.0/src/scenefab/ui/components/layout/__init__.py +127 -0
- scenefab-1.0.0/src/scenefab/ui/components/loading/__init__.py +18 -0
- scenefab-1.0.0/src/scenefab/ui/components/loading/pulse_indicator.py +321 -0
- scenefab-1.0.0/src/scenefab/ui/components/loading/skeleton.py +218 -0
- scenefab-1.0.0/src/scenefab/ui/components/narration/__init__.py +11 -0
- scenefab-1.0.0/src/scenefab/ui/components/narration/narration_editor.py +437 -0
- scenefab-1.0.0/src/scenefab/ui/components/onboarding/__init__.py +21 -0
- scenefab-1.0.0/src/scenefab/ui/components/onboarding/feature_tour.py +518 -0
- scenefab-1.0.0/src/scenefab/ui/components/onboarding/onboard_steps.py +445 -0
- scenefab-1.0.0/src/scenefab/ui/components/onboarding/onboard_wizard.py +211 -0
- scenefab-1.0.0/src/scenefab/ui/components/onboarding/welcome.py +300 -0
- scenefab-1.0.0/src/scenefab/ui/components/pro_components.py +421 -0
- scenefab-1.0.0/src/scenefab/ui/components/pro_widgets/__init__.py +9 -0
- scenefab-1.0.0/src/scenefab/ui/components/step_indicator.py +58 -0
- scenefab-1.0.0/src/scenefab/ui/components/subtitle/__init__.py +63 -0
- scenefab-1.0.0/src/scenefab/ui/components/subtitle/subtitle_core.py +473 -0
- scenefab-1.0.0/src/scenefab/ui/components/subtitle/subtitle_models.py +507 -0
- scenefab-1.0.0/src/scenefab/ui/components/subtitle/widgets/__init__.py +20 -0
- scenefab-1.0.0/src/scenefab/ui/components/subtitle/widgets/subtitle_block.py +134 -0
- scenefab-1.0.0/src/scenefab/ui/components/subtitle/widgets/subtitle_track.py +127 -0
- scenefab-1.0.0/src/scenefab/ui/components/subtitle/widgets/time_ruler.py +128 -0
- scenefab-1.0.0/src/scenefab/ui/components/subtitle/widgets/timeline_widget.py +278 -0
- scenefab-1.0.0/src/scenefab/ui/components/timeline/__init__.py +12 -0
- scenefab-1.0.0/src/scenefab/ui/components/timeline/timeline_shuttle.py +555 -0
- scenefab-1.0.0/src/scenefab/ui/icon_manager.py +205 -0
- scenefab-1.0.0/src/scenefab/ui/macos_theme_manager.py +186 -0
- scenefab-1.0.0/src/scenefab/ui/main/__init__.py +3 -0
- scenefab-1.0.0/src/scenefab/ui/main/components/__init__.py +7 -0
- scenefab-1.0.0/src/scenefab/ui/main/components/ai_monitor_panel.py +12 -0
- scenefab-1.0.0/src/scenefab/ui/main/components/effects_panel.py +103 -0
- scenefab-1.0.0/src/scenefab/ui/main/components/export_format_selector.py +145 -0
- scenefab-1.0.0/src/scenefab/ui/main/components/export_monitor.py +520 -0
- scenefab-1.0.0/src/scenefab/ui/main/components/export_panel.py +658 -0
- scenefab-1.0.0/src/scenefab/ui/main/components/export_progress.py +179 -0
- scenefab-1.0.0/src/scenefab/ui/main/components/export_stats.py +96 -0
- scenefab-1.0.0/src/scenefab/ui/main/components/media_library.py +127 -0
- scenefab-1.0.0/src/scenefab/ui/main/components/monitor_models.py +38 -0
- scenefab-1.0.0/src/scenefab/ui/main/components/monitor_pages.py +261 -0
- scenefab-1.0.0/src/scenefab/ui/main/components/monitor_panel.py +636 -0
- scenefab-1.0.0/src/scenefab/ui/main/components/monitor_widgets.py +272 -0
- scenefab-1.0.0/src/scenefab/ui/main/components/navigation_bar.py +285 -0
- scenefab-1.0.0/src/scenefab/ui/main/components/properties_panel.py +261 -0
- scenefab-1.0.0/src/scenefab/ui/main/components/quick_ai_config.py +335 -0
- scenefab-1.0.0/src/scenefab/ui/main/components/status_bar.py +291 -0
- scenefab-1.0.0/src/scenefab/ui/main/components/timeline.py +347 -0
- scenefab-1.0.0/src/scenefab/ui/main/components/video_preview.py +227 -0
- scenefab-1.0.0/src/scenefab/ui/main/constants.py +30 -0
- scenefab-1.0.0/src/scenefab/ui/main/dialogs/model_app_dialog.py +164 -0
- scenefab-1.0.0/src/scenefab/ui/main/dialogs/model_app_pages.py +457 -0
- scenefab-1.0.0/src/scenefab/ui/main/event_handler.py +68 -0
- scenefab-1.0.0/src/scenefab/ui/main/layouts/__init__.py +9 -0
- scenefab-1.0.0/src/scenefab/ui/main/layouts/main_layout.py +95 -0
- scenefab-1.0.0/src/scenefab/ui/main/main_window.py +657 -0
- scenefab-1.0.0/src/scenefab/ui/main/page_loader.py +44 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/__init__.py +15 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/base_page.py +306 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/components/__init__.py +17 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/components/create_proj_dlg.py +219 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/components/drag_helpers.py +151 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/components/proj_details_pnl.py +361 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/components/proj_list_pnl.py +189 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/components/project_cards.py +191 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/components/settings_dialog.py +278 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/components/stats.py +111 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/creation_wizard_page.py +302 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/export_worker.py +63 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/home_page.py +548 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/narration_segment_card.py +194 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/page_base.py +175 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/preview_text_area.py +226 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/projects_page.py +207 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/settings_page.py +400 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/step_analysis.py +261 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/step_base.py +332 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/step_edit.py +276 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/step_export.py +366 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/step_group.py +602 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/step_pipeline.py +308 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/step_preview.py +281 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/step_upload.py +236 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/style_preset_panel.py +189 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/subtitle_style_card.py +114 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/thumbnail_worker.py +65 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/video_drop_zone.py +150 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/video_metadata_panel.py +81 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/video_preview_widget.py +71 -0
- scenefab-1.0.0/src/scenefab/ui/main/pages/video_thumbnail_item.py +125 -0
- scenefab-1.0.0/src/scenefab/ui/theme/__init__.py +3 -0
- scenefab-1.0.0/src/scenefab/ui/theme/animation_helper.py +531 -0
- scenefab-1.0.0/src/scenefab/ui/theme/base_styles.py +121 -0
- scenefab-1.0.0/src/scenefab/ui/theme/ds_tokens.py +382 -0
- scenefab-1.0.0/src/scenefab/ui/theme/qss_variables.py +38 -0
- scenefab-1.0.0/src/scenefab/ui/theme/theme_manager.py +373 -0
- scenefab-1.0.0/src/scenefab/ui/theme/theme_optimizer.py +503 -0
- scenefab-1.0.0/src/scenefab/ui/theme/theme_toggle.py +276 -0
- scenefab-1.0.0/src/scenefab/ui/theme/tokens.py +116 -0
- scenefab-1.0.0/src/scenefab/ui/windows/__init__.py +24 -0
- scenefab-1.0.0/src/scenefab/ui/windows/base_step_window.py +94 -0
- scenefab-1.0.0/src/scenefab/ui/windows/export_window.py +165 -0
- scenefab-1.0.0/src/scenefab/ui/windows/main_window.py +201 -0
- scenefab-1.0.0/src/scenefab/ui/windows/narration_window.py +220 -0
- scenefab-1.0.0/src/scenefab/ui/windows/projects_window.py +250 -0
- scenefab-1.0.0/src/scenefab/ui/windows/scene_window.py +181 -0
- scenefab-1.0.0/src/scenefab/ui/windows/upload_window.py +189 -0
- scenefab-1.0.0/src/scenefab/update/__init__.py +6 -0
- scenefab-1.0.0/src/scenefab/update/checker.py +116 -0
- scenefab-1.0.0/src/scenefab/utils/__init__.py +1 -0
- scenefab-1.0.0/src/scenefab/utils/config.py +237 -0
- scenefab-1.0.0/src/scenefab/utils/error_handler.py +514 -0
- scenefab-1.0.0/src/scenefab/utils/performance.py +217 -0
- scenefab-1.0.0/src/scenefab/utils/secure_config_loader.py +421 -0
- scenefab-1.0.0/src/scenefab/utils/security.py +528 -0
- scenefab-1.0.0/src/scenefab/utils/shortcut_manager.py +313 -0
- scenefab-1.0.0/src/scenefab/utils/task_manager.py +189 -0
- scenefab-1.0.0/src/scenefab/utils/version.py +120 -0
- scenefab-1.0.0/src/scenefab/version_manager.py +557 -0
- scenefab-1.0.0/src/scenefab/version_models.py +91 -0
- scenefab-1.0.0/src/scenefab/video.py +18 -0
- scenefab-1.0.0/src/scenefab.egg-info/PKG-INFO +225 -0
- scenefab-1.0.0/src/scenefab.egg-info/SOURCES.txt +371 -0
- scenefab-1.0.0/src/scenefab.egg-info/dependency_links.txt +1 -0
- scenefab-1.0.0/src/scenefab.egg-info/entry_points.txt +2 -0
- scenefab-1.0.0/src/scenefab.egg-info/requires.txt +43 -0
- scenefab-1.0.0/src/scenefab.egg-info/top_level.txt +1 -0
- scenefab-1.0.0/tests/test_ai_service_manager.py +120 -0
- scenefab-1.0.0/tests/test_application.py +17 -0
- scenefab-1.0.0/tests/test_base_exporter.py +142 -0
- scenefab-1.0.0/tests/test_beat_detector.py +106 -0
- scenefab-1.0.0/tests/test_benchmark.py +101 -0
- scenefab-1.0.0/tests/test_cache_manager.py +87 -0
- scenefab-1.0.0/tests/test_caption_generator.py +232 -0
- scenefab-1.0.0/tests/test_config_manager.py +106 -0
- scenefab-1.0.0/tests/test_direct_video_exporter.py +101 -0
- scenefab-1.0.0/tests/test_error_handler.py +17 -0
- scenefab-1.0.0/tests/test_event_bus.py +102 -0
- scenefab-1.0.0/tests/test_event_handler.py +17 -0
- scenefab-1.0.0/tests/test_exceptions.py +223 -0
- scenefab-1.0.0/tests/test_ffmpeg_tool.py +319 -0
- scenefab-1.0.0/tests/test_highlight_detector.py +89 -0
- scenefab-1.0.0/tests/test_icon_manager.py +17 -0
- scenefab-1.0.0/tests/test_integration.py +315 -0
- scenefab-1.0.0/tests/test_jianying_exporter.py +179 -0
- scenefab-1.0.0/tests/test_llm_base.py +140 -0
- scenefab-1.0.0/tests/test_llm_cache.py +286 -0
- scenefab-1.0.0/tests/test_llm_manager.py +9 -0
- scenefab-1.0.0/tests/test_llm_providers.py +70 -0
- scenefab-1.0.0/tests/test_logger.py +87 -0
- scenefab-1.0.0/tests/test_macOS_theme_manager.py +17 -0
- scenefab-1.0.0/tests/test_monologue_maker.py +94 -0
- scenefab-1.0.0/tests/test_page_loader.py +17 -0
- scenefab-1.0.0/tests/test_performance.py +153 -0
- scenefab-1.0.0/tests/test_project_manager.py +78 -0
- scenefab-1.0.0/tests/test_project_models.py +118 -0
- scenefab-1.0.0/tests/test_project_settings_manager.py +94 -0
- scenefab-1.0.0/tests/test_project_template_manager.py +99 -0
- scenefab-1.0.0/tests/test_project_version_manager.py +52 -0
- scenefab-1.0.0/tests/test_script_generator.py +88 -0
- scenefab-1.0.0/tests/test_script_generator_streaming.py +101 -0
- scenefab-1.0.0/tests/test_secure_key_manager.py +108 -0
- scenefab-1.0.0/tests/test_service_container.py +100 -0
- scenefab-1.0.0/tests/test_subtitle_extractor.py +109 -0
- scenefab-1.0.0/tests/test_sync_engine.py +84 -0
- scenefab-1.0.0/tests/test_task_queue.py +10 -0
- scenefab-1.0.0/tests/test_ui_components.py +17 -0
- scenefab-1.0.0/tests/test_version.py +73 -0
- scenefab-1.0.0/tests/test_video_analyzer.py +17 -0
- scenefab-1.0.0/tests/test_video_enhancer.py +17 -0
- scenefab-1.0.0/tests/test_video_exporter.py +101 -0
- scenefab-1.0.0/tests/test_video_maker.py +135 -0
- scenefab-1.0.0/tests/test_vision_providers.py +155 -0
- scenefab-1.0.0/tests/test_voice_generator.py +17 -0
scenefab-1.0.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Agions
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
include README.md
|
|
2
|
+
include LICENSE
|
|
3
|
+
include pyproject.toml
|
|
4
|
+
recursive-include src/scenefab *.py
|
|
5
|
+
recursive-include src/scenefab/templates *.html *.json *.yaml
|
|
6
|
+
include src/scenefab/py.typed
|
|
7
|
+
recursive-include resources *
|
|
8
|
+
recursive-include config *.yaml *.conf
|
scenefab-1.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: scenefab
|
|
3
|
+
Version: 1.0.0
|
|
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,PySide6,短视频,影视解说
|
|
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: librosa>=0.10.0
|
|
39
|
+
Requires-Dist: soundfile>=0.12.0
|
|
40
|
+
Requires-Dist: faster-whisper>=1.0.0
|
|
41
|
+
Requires-Dist: torch>=2.0.0
|
|
42
|
+
Requires-Dist: edge-tts>=6.1.0
|
|
43
|
+
Requires-Dist: scenedetect>=0.6.0
|
|
44
|
+
Requires-Dist: deepl>=1.18.0
|
|
45
|
+
Requires-Dist: requests>=2.31.0
|
|
46
|
+
Requires-Dist: httpx>=0.25.0
|
|
47
|
+
Requires-Dist: fastapi>=0.109.0
|
|
48
|
+
Requires-Dist: uvicorn>=0.27.0
|
|
49
|
+
Requires-Dist: pydantic>=2.5.0
|
|
50
|
+
Requires-Dist: python-dotenv>=1.0.0
|
|
51
|
+
Requires-Dist: pyyaml>=6.0.1
|
|
52
|
+
Requires-Dist: psutil>=5.9.6
|
|
53
|
+
Requires-Dist: cryptography>=41.0.0
|
|
54
|
+
Requires-Dist: keyring>=24.0.0
|
|
55
|
+
Requires-Dist: openai>=1.0.0
|
|
56
|
+
Requires-Dist: google-generativeai>=0.8.0
|
|
57
|
+
Requires-Dist: moviepy>=1.0.3
|
|
58
|
+
Requires-Dist: packaging>=21.0
|
|
59
|
+
Provides-Extra: dev
|
|
60
|
+
Requires-Dist: pytest>=7.4.0; extra == "dev"
|
|
61
|
+
Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
|
|
62
|
+
Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
|
|
63
|
+
Requires-Dist: pytest-timeout>=2.1.0; extra == "dev"
|
|
64
|
+
Requires-Dist: black>=23.11.0; extra == "dev"
|
|
65
|
+
Requires-Dist: mypy>=1.7.0; extra == "dev"
|
|
66
|
+
Requires-Dist: ruff>=0.1.0; extra == "dev"
|
|
67
|
+
Requires-Dist: types-requests>=2.31.0; extra == "dev"
|
|
68
|
+
Requires-Dist: types-PyYAML>=6.0.0; extra == "dev"
|
|
69
|
+
Requires-Dist: types-PySide6>=6.6.0; extra == "dev"
|
|
70
|
+
Provides-Extra: all
|
|
71
|
+
Requires-Dist: deepl>=1.18.0; extra == "all"
|
|
72
|
+
Requires-Dist: moviepy>=1.0.3; extra == "all"
|
|
73
|
+
Dynamic: license-file
|
|
74
|
+
|
|
75
|
+
# SceneFab
|
|
76
|
+
|
|
77
|
+
**AI 影视解说创作工具 — 智能拆条 · AI 解说生成 · 一键配音合成**
|
|
78
|
+
|
|
79
|
+
[](LICENSE)
|
|
80
|
+
[](https://www.python.org/)
|
|
81
|
+
[](https://qt.io/)
|
|
82
|
+
[](https://github.com/Agions/scene-fab)
|
|
83
|
+
[](https://github.com/Agions/scene-fab/releases)
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## 定位
|
|
88
|
+
|
|
89
|
+
> **SceneFab** — 上传一部电影/短剧,AI 自动完成语义拆条、生成解说稿、合成配音,一键导出解说视频。
|
|
90
|
+
>
|
|
91
|
+
> 从「几天一条」变成「一天十条」。
|
|
92
|
+
|
|
93
|
+
| 成本 | 隐私 | 效率 |
|
|
94
|
+
|------|------|------|
|
|
95
|
+
| < ¥0.01/视频(DeepSeek-V4) | 视频永不上传云端,全本地 | 5-15 分钟/条 |
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## 核心能力
|
|
100
|
+
|
|
101
|
+
| 能力 | 说明 |
|
|
102
|
+
|------|------|
|
|
103
|
+
| 🎬 **AI 语义拆条** | Qwen2.5-VL 理解视频语义,按情节/场景自动切分,无需手动打点 |
|
|
104
|
+
| 🎭 **情感峰值选段** | 视觉 + 音频双维评分,优先选取叙事高潮片段 |
|
|
105
|
+
| ✍️ **AI 解说稿生成** | DeepSeek-V4 生成情感丰富解说,7 种风格一键切换 |
|
|
106
|
+
| 🎙️ **一键配音合成** | Edge-TTS / F5-TTS,50ms 精度字幕对齐 |
|
|
107
|
+
| 📦 **多格式导出** | H.264/H.265 MP4 直出,或原生剪映草稿 JSON |
|
|
108
|
+
| 💻 **命令行原生** | pip 安装即用,支持 Agent 工作流接入(SKILL.md) |
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## 5 步创作流程
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
上传视频(mp4/mov/avi/webm)
|
|
116
|
+
│
|
|
117
|
+
▼
|
|
118
|
+
┌──────────────────────────────────────────┐
|
|
119
|
+
│ Step 1 · AI 语义拆条 │
|
|
120
|
+
│ Qwen2.5-VL 视觉理解,场景边界检测 │
|
|
121
|
+
└──────────────────────────────────────────┘
|
|
122
|
+
│
|
|
123
|
+
▼
|
|
124
|
+
┌──────────────────────────────────────────┐
|
|
125
|
+
│ Step 2 · 情感峰值选段 │
|
|
126
|
+
│ 视觉信息密度 × 0.6 + 音频语调 × 0.4 │
|
|
127
|
+
└──────────────────────────────────────────┘
|
|
128
|
+
│
|
|
129
|
+
▼
|
|
130
|
+
┌──────────────────────────────────────────┐
|
|
131
|
+
│ Step 3 · 解说稿生成 │
|
|
132
|
+
│ DeepSeek-V4 · 7 种情感风格 │
|
|
133
|
+
└──────────────────────────────────────────┘
|
|
134
|
+
│
|
|
135
|
+
▼
|
|
136
|
+
┌──────────────────────────────────────────┐
|
|
137
|
+
│ Step 4 · 配音合成 │
|
|
138
|
+
│ Edge-TTS / F5-TTS + 词级时间戳 │
|
|
139
|
+
└──────────────────────────────────────────┘
|
|
140
|
+
│
|
|
141
|
+
▼
|
|
142
|
+
┌──────────────────────────────────────────┐
|
|
143
|
+
│ Step 5 · 视频合成导出 │
|
|
144
|
+
│ FFmpeg H.264/H.265 · MP4 / 剪映草稿 │
|
|
145
|
+
└──────────────────────────────────────────┘
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## 技术栈
|
|
151
|
+
|
|
152
|
+
| 模块 | 模型 / 技术 | 说明 |
|
|
153
|
+
|------|-----------|------|
|
|
154
|
+
| 语义拆条 | **Qwen2.5-VL** | 视频帧逐帧理解,语义场景边界检测 |
|
|
155
|
+
| 解说生成 | **DeepSeek-V4** | 第一人称视角,7 种预设风格 |
|
|
156
|
+
| 情感评分 | 视觉 + 音频双维 | 画面信息密度 + 语调变化,综合排序 |
|
|
157
|
+
| 配音合成 | **Edge-TTS** · **F5-TTS** | Edge 主流低延迟,F5 零样本音色克隆 |
|
|
158
|
+
| 字幕对齐 | TTS Word-level Timing | 精确到每个字的起止时间,50ms 精度 |
|
|
159
|
+
| 视频合成 | **FFmpeg** | H.264/H.265 编码,本地处理 |
|
|
160
|
+
| 导出格式 | **MP4** · **剪映草稿** | 直出发布 / 继续精剪 |
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## 快速开始
|
|
165
|
+
|
|
166
|
+
### 安装
|
|
167
|
+
|
|
168
|
+
**方式一:从 PyPI 安装(待发布)**
|
|
169
|
+
```bash
|
|
170
|
+
pip install scenefab
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
**方式二:从源码安装(推荐)**
|
|
174
|
+
```bash
|
|
175
|
+
git clone https://github.com/Agions/scene-fab.git
|
|
176
|
+
cd scene-fab
|
|
177
|
+
pip install -e .
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### 运行
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
# GUI 模式
|
|
184
|
+
scenefab gui
|
|
185
|
+
|
|
186
|
+
# 命令行模式
|
|
187
|
+
scenefab commentary create-movie ./movie.mp4 --style 纪录片 --output ./output/
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### 配置 AI(只需一个 Key)
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
# DeepSeek(解说生成主力)
|
|
194
|
+
export DEEPSEEK_API_KEY="sk-..."
|
|
195
|
+
|
|
196
|
+
# 不配置时:Edge-TTS 配音等基础功能仍可正常使用
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## 文档
|
|
202
|
+
|
|
203
|
+
| 文档 | 说明 |
|
|
204
|
+
|------|------|
|
|
205
|
+
| [快速开始](https://agions.github.io/scene-fab/guide/quick-start) | 5 分钟上手 |
|
|
206
|
+
| [功能详解](https://agions.github.io/scene-fab/features) | 全部功能说明 |
|
|
207
|
+
| [AI 工作流](https://agions.github.io/scene-fab/guide/ai-video-guide) | 5 步流水线详解 |
|
|
208
|
+
| [配置参考](https://agions.github.io/scene-fab/config) | 环境变量与配置文件 |
|
|
209
|
+
| [疑难排查](https://agions.github.io/scene-fab/guide/troubleshooting) | 常见问题 |
|
|
210
|
+
|
|
211
|
+
在线文档:**https://agions.github.io/scene-fab/**
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
## 许可证
|
|
216
|
+
|
|
217
|
+
[MIT License](LICENSE) · Copyright © 2025-2026 [Agions](https://github.com/Agions)
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
<div align="center">
|
|
222
|
+
|
|
223
|
+
⭐ 如果 SceneFab 对你有帮助,请给一个 Star
|
|
224
|
+
|
|
225
|
+
</div>
|
scenefab-1.0.0/README.md
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# SceneFab
|
|
2
|
+
|
|
3
|
+
**AI 影视解说创作工具 — 智能拆条 · AI 解说生成 · 一键配音合成**
|
|
4
|
+
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
[](https://www.python.org/)
|
|
7
|
+
[](https://qt.io/)
|
|
8
|
+
[](https://github.com/Agions/scene-fab)
|
|
9
|
+
[](https://github.com/Agions/scene-fab/releases)
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 定位
|
|
14
|
+
|
|
15
|
+
> **SceneFab** — 上传一部电影/短剧,AI 自动完成语义拆条、生成解说稿、合成配音,一键导出解说视频。
|
|
16
|
+
>
|
|
17
|
+
> 从「几天一条」变成「一天十条」。
|
|
18
|
+
|
|
19
|
+
| 成本 | 隐私 | 效率 |
|
|
20
|
+
|------|------|------|
|
|
21
|
+
| < ¥0.01/视频(DeepSeek-V4) | 视频永不上传云端,全本地 | 5-15 分钟/条 |
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 核心能力
|
|
26
|
+
|
|
27
|
+
| 能力 | 说明 |
|
|
28
|
+
|------|------|
|
|
29
|
+
| 🎬 **AI 语义拆条** | Qwen2.5-VL 理解视频语义,按情节/场景自动切分,无需手动打点 |
|
|
30
|
+
| 🎭 **情感峰值选段** | 视觉 + 音频双维评分,优先选取叙事高潮片段 |
|
|
31
|
+
| ✍️ **AI 解说稿生成** | DeepSeek-V4 生成情感丰富解说,7 种风格一键切换 |
|
|
32
|
+
| 🎙️ **一键配音合成** | Edge-TTS / F5-TTS,50ms 精度字幕对齐 |
|
|
33
|
+
| 📦 **多格式导出** | H.264/H.265 MP4 直出,或原生剪映草稿 JSON |
|
|
34
|
+
| 💻 **命令行原生** | pip 安装即用,支持 Agent 工作流接入(SKILL.md) |
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## 5 步创作流程
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
上传视频(mp4/mov/avi/webm)
|
|
42
|
+
│
|
|
43
|
+
▼
|
|
44
|
+
┌──────────────────────────────────────────┐
|
|
45
|
+
│ Step 1 · AI 语义拆条 │
|
|
46
|
+
│ Qwen2.5-VL 视觉理解,场景边界检测 │
|
|
47
|
+
└──────────────────────────────────────────┘
|
|
48
|
+
│
|
|
49
|
+
▼
|
|
50
|
+
┌──────────────────────────────────────────┐
|
|
51
|
+
│ Step 2 · 情感峰值选段 │
|
|
52
|
+
│ 视觉信息密度 × 0.6 + 音频语调 × 0.4 │
|
|
53
|
+
└──────────────────────────────────────────┘
|
|
54
|
+
│
|
|
55
|
+
▼
|
|
56
|
+
┌──────────────────────────────────────────┐
|
|
57
|
+
│ Step 3 · 解说稿生成 │
|
|
58
|
+
│ DeepSeek-V4 · 7 种情感风格 │
|
|
59
|
+
└──────────────────────────────────────────┘
|
|
60
|
+
│
|
|
61
|
+
▼
|
|
62
|
+
┌──────────────────────────────────────────┐
|
|
63
|
+
│ Step 4 · 配音合成 │
|
|
64
|
+
│ Edge-TTS / F5-TTS + 词级时间戳 │
|
|
65
|
+
└──────────────────────────────────────────┘
|
|
66
|
+
│
|
|
67
|
+
▼
|
|
68
|
+
┌──────────────────────────────────────────┐
|
|
69
|
+
│ Step 5 · 视频合成导出 │
|
|
70
|
+
│ FFmpeg H.264/H.265 · MP4 / 剪映草稿 │
|
|
71
|
+
└──────────────────────────────────────────┘
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## 技术栈
|
|
77
|
+
|
|
78
|
+
| 模块 | 模型 / 技术 | 说明 |
|
|
79
|
+
|------|-----------|------|
|
|
80
|
+
| 语义拆条 | **Qwen2.5-VL** | 视频帧逐帧理解,语义场景边界检测 |
|
|
81
|
+
| 解说生成 | **DeepSeek-V4** | 第一人称视角,7 种预设风格 |
|
|
82
|
+
| 情感评分 | 视觉 + 音频双维 | 画面信息密度 + 语调变化,综合排序 |
|
|
83
|
+
| 配音合成 | **Edge-TTS** · **F5-TTS** | Edge 主流低延迟,F5 零样本音色克隆 |
|
|
84
|
+
| 字幕对齐 | TTS Word-level Timing | 精确到每个字的起止时间,50ms 精度 |
|
|
85
|
+
| 视频合成 | **FFmpeg** | H.264/H.265 编码,本地处理 |
|
|
86
|
+
| 导出格式 | **MP4** · **剪映草稿** | 直出发布 / 继续精剪 |
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## 快速开始
|
|
91
|
+
|
|
92
|
+
### 安装
|
|
93
|
+
|
|
94
|
+
**方式一:从 PyPI 安装(待发布)**
|
|
95
|
+
```bash
|
|
96
|
+
pip install scenefab
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**方式二:从源码安装(推荐)**
|
|
100
|
+
```bash
|
|
101
|
+
git clone https://github.com/Agions/scene-fab.git
|
|
102
|
+
cd scene-fab
|
|
103
|
+
pip install -e .
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### 运行
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
# GUI 模式
|
|
110
|
+
scenefab gui
|
|
111
|
+
|
|
112
|
+
# 命令行模式
|
|
113
|
+
scenefab commentary create-movie ./movie.mp4 --style 纪录片 --output ./output/
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### 配置 AI(只需一个 Key)
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
# DeepSeek(解说生成主力)
|
|
120
|
+
export DEEPSEEK_API_KEY="sk-..."
|
|
121
|
+
|
|
122
|
+
# 不配置时:Edge-TTS 配音等基础功能仍可正常使用
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## 文档
|
|
128
|
+
|
|
129
|
+
| 文档 | 说明 |
|
|
130
|
+
|------|------|
|
|
131
|
+
| [快速开始](https://agions.github.io/scene-fab/guide/quick-start) | 5 分钟上手 |
|
|
132
|
+
| [功能详解](https://agions.github.io/scene-fab/features) | 全部功能说明 |
|
|
133
|
+
| [AI 工作流](https://agions.github.io/scene-fab/guide/ai-video-guide) | 5 步流水线详解 |
|
|
134
|
+
| [配置参考](https://agions.github.io/scene-fab/config) | 环境变量与配置文件 |
|
|
135
|
+
| [疑难排查](https://agions.github.io/scene-fab/guide/troubleshooting) | 常见问题 |
|
|
136
|
+
|
|
137
|
+
在线文档:**https://agions.github.io/scene-fab/**
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## 许可证
|
|
142
|
+
|
|
143
|
+
[MIT License](LICENSE) · Copyright © 2025-2026 [Agions](https://github.com/Agions)
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
<div align="center">
|
|
148
|
+
|
|
149
|
+
⭐ 如果 SceneFab 对你有帮助,请给一个 Star
|
|
150
|
+
|
|
151
|
+
</div>
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
cache:
|
|
2
|
+
enabled: true
|
|
3
|
+
max_size: 100
|
|
4
|
+
ttl: 3600
|
|
5
|
+
default_provider: qwen
|
|
6
|
+
llm_providers:
|
|
7
|
+
qwen:
|
|
8
|
+
enabled: true
|
|
9
|
+
api_key: ""
|
|
10
|
+
base_url: "https://dashscope.aliyuncs.com/compatible-mode/v1"
|
|
11
|
+
model: "qwen-plus"
|
|
12
|
+
max_tokens: 8000
|
|
13
|
+
temperature: 0.7
|
|
14
|
+
deepseek:
|
|
15
|
+
enabled: false
|
|
16
|
+
api_key: ""
|
|
17
|
+
base_url: "https://api.deepseek.com"
|
|
18
|
+
model: "deepseek-v4-flash"
|
|
19
|
+
max_tokens: 16384
|
|
20
|
+
temperature: 0.7
|
|
21
|
+
kimi:
|
|
22
|
+
enabled: false
|
|
23
|
+
api_key: ""
|
|
24
|
+
base_url: "https://api.moonshot.cn/v1"
|
|
25
|
+
model: "moonshot-v1-128k"
|
|
26
|
+
max_tokens: 8000
|
|
27
|
+
temperature: 0.7
|
|
28
|
+
glm5:
|
|
29
|
+
enabled: false
|
|
30
|
+
api_key: ""
|
|
31
|
+
base_url: "https://open.bigmodel.cn/api/paas/v4/"
|
|
32
|
+
model: "glm-4-flash"
|
|
33
|
+
max_tokens: 8000
|
|
34
|
+
temperature: 0.7
|
|
35
|
+
openai:
|
|
36
|
+
enabled: false
|
|
37
|
+
api_key: ""
|
|
38
|
+
base_url: "https://api.openai.com/v1"
|
|
39
|
+
model: "gpt-4o"
|
|
40
|
+
max_tokens: 16384
|
|
41
|
+
temperature: 0.7
|
|
42
|
+
claude:
|
|
43
|
+
enabled: false
|
|
44
|
+
api_key: ""
|
|
45
|
+
base_url: "https://api.anthropic.com"
|
|
46
|
+
model: "claude-sonnet-4-20250514"
|
|
47
|
+
max_tokens: 2000
|
|
48
|
+
temperature: 0.7
|
|
49
|
+
gemini:
|
|
50
|
+
enabled: false
|
|
51
|
+
api_key: ""
|
|
52
|
+
base_url: "https://generativelanguage.googleapis.com"
|
|
53
|
+
model: "gemini-2.0-flash-exp"
|
|
54
|
+
max_tokens: 8000
|
|
55
|
+
temperature: 0.7
|
|
56
|
+
local:
|
|
57
|
+
enabled: false
|
|
58
|
+
api_key: ""
|
|
59
|
+
base_url: "http://localhost:11434"
|
|
60
|
+
model: ""
|
|
61
|
+
max_tokens: 4096
|
|
62
|
+
temperature: 0.7
|
|
63
|
+
doubao:
|
|
64
|
+
enabled: false
|
|
65
|
+
api_key: ""
|
|
66
|
+
base_url: "https://ark.cn-beijing.volces.com/api/v3"
|
|
67
|
+
model: "doubao-pro-128k"
|
|
68
|
+
max_tokens: 8000
|
|
69
|
+
temperature: 0.7
|
|
70
|
+
hunyuan:
|
|
71
|
+
enabled: false
|
|
72
|
+
api_key: ""
|
|
73
|
+
base_url: "https://hunyuan.tencentcloudapi.com"
|
|
74
|
+
model: "hunyuan-pro"
|
|
75
|
+
max_tokens: 8000
|
|
76
|
+
temperature: 0.7
|
|
77
|
+
log_level: INFO
|
|
78
|
+
retry:
|
|
79
|
+
backoff_factor: 2.0
|
|
80
|
+
base_delay: 1.0
|
|
81
|
+
max_delay: 60.0
|
|
82
|
+
max_retries: 3
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# SceneFab AI LLM 配置
|
|
2
|
+
|
|
3
|
+
LLM:
|
|
4
|
+
# 默认提供商 (qwen | kimi | glm5 | openai | deepseek | claude | gemini | local | doubao | hunyuan)
|
|
5
|
+
default_provider: "qwen"
|
|
6
|
+
|
|
7
|
+
# 通义千问 Qwen Plus
|
|
8
|
+
qwen:
|
|
9
|
+
enabled: true
|
|
10
|
+
api_key: ${QWEN_API_KEY}
|
|
11
|
+
base_url: "https://dashscope.aliyuncs.com/compatible-mode/v1"
|
|
12
|
+
model: "qwen-plus"
|
|
13
|
+
max_tokens: 8000
|
|
14
|
+
temperature: 0.7
|
|
15
|
+
top_p: 0.9
|
|
16
|
+
|
|
17
|
+
# DeepSeek V4
|
|
18
|
+
deepseek:
|
|
19
|
+
enabled: false
|
|
20
|
+
api_key: ${DEEPSEEK_API_KEY}
|
|
21
|
+
base_url: "https://api.deepseek.com"
|
|
22
|
+
model: "deepseek-v4-flash"
|
|
23
|
+
max_tokens: 16384
|
|
24
|
+
temperature: 0.7
|
|
25
|
+
|
|
26
|
+
# Kimi moonshot-v1
|
|
27
|
+
kimi:
|
|
28
|
+
enabled: false
|
|
29
|
+
api_key: ${KIMI_API_KEY}
|
|
30
|
+
base_url: "https://api.moonshot.cn/v1"
|
|
31
|
+
model: "moonshot-v1-128k"
|
|
32
|
+
max_tokens: 8000
|
|
33
|
+
temperature: 0.7
|
|
34
|
+
|
|
35
|
+
# 智谱 GLM-4
|
|
36
|
+
glm5:
|
|
37
|
+
enabled: false
|
|
38
|
+
api_key: ${GLM5_API_KEY}
|
|
39
|
+
base_url: "https://open.bigmodel.cn/api/paas/v4/"
|
|
40
|
+
model: "glm-4-flash"
|
|
41
|
+
max_tokens: 8000
|
|
42
|
+
temperature: 0.7
|
|
43
|
+
|
|
44
|
+
# OpenAI GPT-4o
|
|
45
|
+
openai:
|
|
46
|
+
enabled: false
|
|
47
|
+
api_key: ${OPENAI_API_KEY}
|
|
48
|
+
base_url: "https://api.openai.com/v1"
|
|
49
|
+
model: "gpt-4o"
|
|
50
|
+
max_tokens: 16384
|
|
51
|
+
temperature: 0.7
|
|
52
|
+
|
|
53
|
+
# Anthropic Claude Sonnet 4
|
|
54
|
+
claude:
|
|
55
|
+
enabled: false
|
|
56
|
+
api_key: ${CLAUDE_API_KEY}
|
|
57
|
+
base_url: "https://api.anthropic.com"
|
|
58
|
+
model: "claude-sonnet-4-20250514"
|
|
59
|
+
max_tokens: 2000
|
|
60
|
+
temperature: 0.7
|
|
61
|
+
|
|
62
|
+
# Google Gemini 2.0
|
|
63
|
+
gemini:
|
|
64
|
+
enabled: false
|
|
65
|
+
api_key: ${GEMINI_API_KEY}
|
|
66
|
+
base_url: "https://generativelanguage.googleapis.com"
|
|
67
|
+
model: "gemini-2.0-flash-exp"
|
|
68
|
+
max_tokens: 8000
|
|
69
|
+
temperature: 0.7
|
|
70
|
+
|
|
71
|
+
# 本地模型 (Ollama / LM Studio)
|
|
72
|
+
local:
|
|
73
|
+
enabled: false
|
|
74
|
+
api_key: ""
|
|
75
|
+
base_url: "http://localhost:11434"
|
|
76
|
+
backend: "ollama"
|
|
77
|
+
|
|
78
|
+
# 字节豆包 Doubao
|
|
79
|
+
doubao:
|
|
80
|
+
enabled: false
|
|
81
|
+
api_key: ${DOUBAO_API_KEY}
|
|
82
|
+
base_url: "https://ark.cn-beijing.volces.com/api/v3"
|
|
83
|
+
model: "doubao-pro-128k"
|
|
84
|
+
max_tokens: 8000
|
|
85
|
+
temperature: 0.7
|
|
86
|
+
|
|
87
|
+
# 腾讯混元 Hunyuan
|
|
88
|
+
hunyuan:
|
|
89
|
+
enabled: false
|
|
90
|
+
api_key: ${HUNYUAN_API_KEY}
|
|
91
|
+
base_url: "https://hunyuan.tencentcloudapi.com"
|
|
92
|
+
model: "hunyuan-pro"
|
|
93
|
+
max_tokens: 8000
|
|
94
|
+
temperature: 0.7
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# 日志配置
|
|
2
|
+
|
|
3
|
+
[loggers]
|
|
4
|
+
keys=root,scenefab,ai,services
|
|
5
|
+
|
|
6
|
+
[handlers]
|
|
7
|
+
keys=consoleHandler,fileHandler,errorHandler
|
|
8
|
+
|
|
9
|
+
[formatters]
|
|
10
|
+
keys=simpleFormatter,detailedFormatter
|
|
11
|
+
|
|
12
|
+
# Root logger
|
|
13
|
+
[logger_root]
|
|
14
|
+
level=INFO
|
|
15
|
+
handlers=consoleHandler
|
|
16
|
+
|
|
17
|
+
# Application logger
|
|
18
|
+
[logger_scenefab]
|
|
19
|
+
level=INFO
|
|
20
|
+
handlers=consoleHandler,fileHandler
|
|
21
|
+
qualname=scenefab
|
|
22
|
+
propagate=0
|
|
23
|
+
|
|
24
|
+
# AI services logger
|
|
25
|
+
[logger_ai]
|
|
26
|
+
level=DEBUG
|
|
27
|
+
handlers=consoleHandler,fileHandler
|
|
28
|
+
qualname=scenefab.services.ai
|
|
29
|
+
propagate=0
|
|
30
|
+
|
|
31
|
+
# Services logger
|
|
32
|
+
[logger_services]
|
|
33
|
+
level=INFO
|
|
34
|
+
handlers=fileHandler
|
|
35
|
+
qualname=scenefab.services
|
|
36
|
+
propagate=0
|
|
37
|
+
|
|
38
|
+
# Console handler
|
|
39
|
+
[handler_consoleHandler]
|
|
40
|
+
class=StreamHandler
|
|
41
|
+
level=INFO
|
|
42
|
+
formatter=simpleFormatter
|
|
43
|
+
args=(sys.stdout,)
|
|
44
|
+
|
|
45
|
+
# File handler
|
|
46
|
+
[handler_fileHandler]
|
|
47
|
+
class=handlers.RotatingFileHandler
|
|
48
|
+
level=DEBUG
|
|
49
|
+
formatter=detailedFormatter
|
|
50
|
+
args=('logs/scenefab.log', 'a', 10485760, 5, 'utf-8')
|
|
51
|
+
|
|
52
|
+
# Error handler
|
|
53
|
+
[handler_errorHandler]
|
|
54
|
+
class=handlers.RotatingFileHandler
|
|
55
|
+
level=ERROR
|
|
56
|
+
formatter=detailedFormatter
|
|
57
|
+
args=('logs/error.log', 'a', 10485760, 3, 'utf-8')
|
|
58
|
+
|
|
59
|
+
# Simple formatter
|
|
60
|
+
[formatter_simpleFormatter]
|
|
61
|
+
format=%(asctime)s - %(levelname)s - %(message)s
|
|
62
|
+
datefmt=%Y-%m-%d %H:%M:%S
|
|
63
|
+
|
|
64
|
+
# Detailed formatter
|
|
65
|
+
[formatter_detailedFormatter]
|
|
66
|
+
format=%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s
|
|
67
|
+
datefmt=%Y-%m-%d %H:%M:%S
|