@thierrynakoa/fire-flow 12.2.1 → 13.0.1
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.
- package/CREDITS.md +25 -0
- package/DOMINION-FLOW-OVERVIEW.md +182 -38
- package/README.md +399 -455
- package/TROUBLESHOOTING.md +264 -264
- package/agents/fire-debugger.md +54 -0
- package/agents/fire-executor.md +1610 -1033
- package/agents/fire-fact-checker.md +1 -1
- package/agents/fire-planner.md +85 -17
- package/agents/fire-project-researcher.md +1 -1
- package/agents/fire-researcher.md +4 -22
- package/agents/{fire-phoenix-analyst.md → fire-resurrection-analyst.md} +394 -394
- package/agents/fire-reviewer.md +552 -499
- package/agents/fire-verifier.md +114 -19
- package/bin/cli.js +18 -101
- package/commands/fire-0-orient.md +2 -2
- package/commands/fire-1a-new.md +50 -15
- package/commands/fire-1c-setup.md +33 -5
- package/commands/fire-1d-discuss.md +87 -1
- package/commands/fire-2-plan.md +556 -527
- package/commands/fire-3-execute.md +2046 -1356
- package/commands/fire-4-verify.md +975 -906
- package/commands/fire-5-handoff.md +46 -5
- package/commands/fire-6-resume.md +2 -31
- package/commands/fire-add-new-skill.md +138 -19
- package/commands/fire-autonomous.md +14 -2
- package/commands/fire-complete-milestone.md +1 -1
- package/commands/fire-cost.md +179 -183
- package/commands/fire-debug.md +1 -6
- package/commands/fire-loop-resume.md +2 -2
- package/commands/fire-loop-stop.md +1 -1
- package/commands/fire-loop.md +2 -15
- package/commands/fire-map-codebase.md +1 -1
- package/commands/fire-migrate-database.md +548 -0
- package/commands/fire-new-milestone.md +1 -1
- package/commands/fire-reflect.md +1 -2
- package/commands/fire-research.md +142 -21
- package/commands/{fire-phoenix.md → fire-resurrect.md} +859 -603
- package/commands/fire-scaffold.md +297 -0
- package/commands/fire-search.md +1 -2
- package/commands/fire-security-scan.md +483 -484
- package/commands/fire-setup.md +359 -0
- package/commands/fire-skill.md +770 -0
- package/commands/fire-skills-diff.md +506 -506
- package/commands/fire-skills-history.md +388 -388
- package/commands/fire-skills-rollback.md +7 -7
- package/commands/fire-skills-sync.md +470 -470
- package/commands/fire-test.md +5 -5
- package/commands/fire-todos.md +1 -1
- package/commands/fire-update.md +5 -5
- package/commands/fire-validate-skills.md +282 -0
- package/commands/fire-vuln-scan.md +492 -493
- package/hooks/run-hook.sh +8 -8
- package/hooks/run-session-end.sh +7 -7
- package/hooks/session-end.sh +90 -90
- package/hooks/session-start.sh +1 -1
- package/package.json +4 -24
- package/plugin.json +7 -7
- package/references/autonomy-levels.md +235 -0
- package/references/behavioral-directives.md +95 -3
- package/references/blocker-tracking.md +1 -1
- package/references/circuit-breaker.md +93 -2
- package/references/context-engineering.md +227 -9
- package/references/honesty-protocols.md +70 -1
- package/references/issue-to-pr-pipeline.md +149 -150
- package/references/metrics-and-trends.md +1 -2
- package/references/research-improvements.md +4 -108
- package/references/sdlc-mapping.md +73 -0
- package/references/state-machine.md +151 -0
- package/skills-library/AVAILABLE_TOOLS_REFERENCE.md +333 -0
- package/skills-library/SKILLS-INDEX.md +57 -558
- package/skills-library/SKILLS_LIBRARY_INDEX.md +532 -0
- package/skills-library/_general/api-patterns/api-field-name-mismatch.md +107 -0
- package/skills-library/_general/api-patterns/streaming-command-timeout.md +122 -0
- package/skills-library/_general/api-patterns/streaming-proxy-cors-bypass.md +102 -0
- package/skills-library/_general/automation/settings-gui-generator.md +172 -0
- package/skills-library/_general/database-solutions/data-type-mapping-reference.md +181 -0
- package/skills-library/_general/database-solutions/mysql-limit-offset-string-coercion.md +102 -0
- package/skills-library/_general/database-solutions/mysql-to-pg-migration.md +195 -0
- package/skills-library/_general/database-solutions/orm-schema-portability.md +193 -0
- package/skills-library/_general/database-solutions/persistent-analysis-storage.md +207 -0
- package/skills-library/_general/database-solutions/pg-to-mysql-schema-migration-methodology.md +190 -0
- package/skills-library/_general/database-solutions/sql-dialect-compatibility-matrix.md +306 -0
- package/skills-library/_general/database-solutions/sqlite-to-pg-migration.md +219 -0
- package/skills-library/_general/frontend/canvas-bubble-animation-grouping.md +270 -0
- package/skills-library/_general/frontend/color-token-migration.md +112 -0
- package/skills-library/_general/frontend/framer-motion-layoutid-grouping.md +150 -0
- package/skills-library/_general/frontend/pyqt6-settings-dialog.md +191 -0
- package/skills-library/_general/frontend/react-flow-animated-layout-switching.md +101 -0
- package/skills-library/_general/frontend/react-hooks-order-debugging.md +141 -0
- package/skills-library/_general/frontend/redux-localstorage-auth-desync.md +126 -0
- package/skills-library/_general/frontend/safari-csp-theme-color-debugging.md +124 -0
- package/skills-library/_general/frontend/safari-sw-cache-poisoning.md +138 -0
- package/skills-library/_general/frontend/svg-sparkline-no-charting-library.md +131 -0
- package/skills-library/_general/growth-marketing/oss-daily-growth-intelligence.md +224 -0
- package/skills-library/_general/integrations/claude-code-local-mcp-integration.md +250 -0
- package/skills-library/_general/integrations/mcp-composite-tool-orchestration.md +200 -0
- package/skills-library/_general/methodology/AGENT_SDK_STANDALONE_TOOLING.md +181 -0
- package/skills-library/_general/methodology/AGENT_TEAMS_GUIDE.md +169 -0
- package/skills-library/_general/methodology/ALAS_STATEFUL_EXECUTION.md +207 -0
- package/skills-library/_general/methodology/AUTO_REVIEWER_SUBAGENT.md +211 -0
- package/skills-library/_general/methodology/CONSISTENCY_CHECK_AMBIGUITY_GATE.md +96 -0
- package/skills-library/_general/methodology/DEAD_ENDS_SHELF.md +4 -4
- package/skills-library/_general/methodology/DISTILL_NOT_DUMP.md +108 -0
- package/skills-library/_general/methodology/EXECUTION_PROGRESS_MONITOR.md +157 -0
- package/skills-library/_general/methodology/HIERARCHICAL_REVIEW_MARS.md +122 -0
- package/skills-library/_general/methodology/MCP_INTER_AGENT_BRIDGE.md +207 -0
- package/skills-library/_general/methodology/MERMAID_WIZARD_DIAGRAMS.md +77 -0
- package/skills-library/_general/methodology/MISSING_DIMENSION_DETECTOR.md +89 -0
- package/skills-library/_general/methodology/MULTI_AGENT_COORDINATION.md +397 -0
- package/skills-library/_general/methodology/OBSERVATION_MASKING.md +100 -0
- package/skills-library/_general/methodology/PHOENIX_REBUILD_METHODOLOGY.md +82 -11
- package/skills-library/_general/methodology/REVIEW_BACKTRACK_PANEL.md +140 -0
- package/skills-library/_general/methodology/REVIEW_FIX_LOOP.md +117 -0
- package/skills-library/_general/methodology/VOTING_VERDICT_ARBITRATION.md +155 -0
- package/skills-library/_general/methodology/ZERO_FRICTION_CLI_SETUP.md +2 -2
- package/skills-library/_general/methodology/dead-code-activation.md +123 -0
- package/skills-library/_general/methodology/debug-swarm-researcher-escape-hatch.md +240 -240
- package/skills-library/_general/methodology/shell-autonomous-loop-fixplan.md +1 -1
- package/skills-library/_general/patterns-standards/GOF_DESIGN_PATTERNS_FOR_AI_AGENTS.md +5 -5
- package/skills-library/_general/patterns-standards/cascading-failure-diagnosis.md +119 -0
- package/skills-library/_general/patterns-standards/domain-specific-layout-algorithms.md +209 -0
- package/skills-library/_general/patterns-standards/python-desktop-app-architecture.md +399 -0
- package/skills-library/_general/patterns-standards/realtime-monitoring-dashboard.md +457 -0
- package/skills-library/_general/patterns-standards/togglable-processing-pipeline.md +169 -0
- package/skills-library/_general/performance/liveclock-extraction.md +112 -0
- package/skills-library/_general/performance/ref-based-canvas-animation.md +117 -0
- package/skills-library/_general/performance/use-visible-interval.md +131 -0
- package/skills-library/_general/testing/playwright-firefox-withcredentials-auth-issue.md +104 -0
- package/skills-library/_quarantine/README.md +30 -0
- package/skills-library/api-patterns/BROADCAST_SCHEDULER_SHARED_EXECUTE_FUNCTION.md +150 -0
- package/skills-library/api-patterns/ERROR_RESPONSE_STANDARDS.md +145 -0
- package/skills-library/api-patterns/EXPRESS_ROUTE_ORDERING_MIDDLEWARE_INTERCEPTION.md +326 -0
- package/skills-library/api-patterns/PAGINATION_PATTERNS.md +137 -0
- package/skills-library/api-patterns/PODCAST_PROGRESS_TRACKING_THREE_ROOT_CAUSES.md +277 -0
- package/skills-library/api-patterns/RATE_LIMITING_TOGGLE.md +155 -0
- package/skills-library/api-patterns/graphql-content-queries.md +708 -0
- package/skills-library/appointment-scheduler-design.md +423 -0
- package/skills-library/automation/AUTO_POPULATE_COMPLETE_GUIDE.md +631 -0
- package/skills-library/automation/CC_WORKFLOW_STUDIO.md +83 -0
- package/skills-library/automation/CLAUDE_CODE_SWARM_MODE.md +95 -0
- package/skills-library/automation/DAEMON_TRIGGER_FILE_IPC.md +195 -0
- package/skills-library/automation/scheduled-content-publishing.md +608 -0
- package/skills-library/awesome-workflows/Blogging-Platform-Instructions/view_commands.md +25 -0
- package/skills-library/awesome-workflows/CREDENTIAL-SECURITY-WORKFLOW.md +109 -0
- package/skills-library/awesome-workflows/DEBUGGING-WORKFLOW.md +124 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/README.md +31 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-principles-example.md +129 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-agent.md +107 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-claude-md-snippet.md +24 -0
- package/skills-library/awesome-workflows/Design-Review-Workflow/design-review-slash-command.md +38 -0
- package/skills-library/awesome-workflows/PARALLEL-RESEARCH-WORKFLOW.md +89 -0
- package/skills-library/awesome-workflows/PHASE-EXECUTION-WORKFLOW.md +97 -0
- package/skills-library/awesome-workflows/SESSION-HANDOFF-WORKFLOW.md +116 -0
- package/skills-library/cms-patterns/content-branch-preview.md +515 -0
- package/skills-library/cms-patterns/inline-visual-editing.md +666 -0
- package/skills-library/cms-patterns/mdx-component-content.md +649 -0
- package/skills-library/cms-patterns/media-manager-abstraction.md +827 -0
- package/skills-library/cms-patterns/schema-driven-form-generator.md +838 -0
- package/skills-library/complexity-metrics/complexity-divider.md +707 -0
- package/skills-library/complexity-metrics/work-with-complexity.md +193 -0
- package/skills-library/creative-multimedia/animation-stack-guide.md +577 -0
- package/skills-library/creative-multimedia/audio-enhancement-pipeline.md +625 -0
- package/skills-library/creative-multimedia/content-repurposing-pipeline.md +1146 -0
- package/skills-library/creative-multimedia/data-visualization-generator.md +862 -0
- package/skills-library/creative-multimedia/doc-to-podcast-pipeline.md +2184 -0
- package/skills-library/creative-multimedia/ffmpeg-command-generator.md +405 -0
- package/skills-library/creative-multimedia/image-optimization-pipeline.md +605 -0
- package/skills-library/creative-multimedia/multi-format-content-generator.md +1759 -0
- package/skills-library/creative-multimedia/og-image-generator.md +635 -0
- package/skills-library/creative-multimedia/podcast-audio-composition.md +1355 -0
- package/skills-library/creative-multimedia/podcast-quality-evaluation.md +1452 -0
- package/skills-library/creative-multimedia/podcast-script-generation.md +1841 -0
- package/skills-library/creative-multimedia/svg-generation.md +750 -0
- package/skills-library/creative-multimedia/text-to-speech-provider-selector.md +1414 -0
- package/skills-library/creative-multimedia/transcription-pipeline-selector.md +677 -0
- package/skills-library/creative-multimedia/video-streaming-setup.md +559 -0
- package/skills-library/database-solutions/AI_RESPONSE_DATABASE_CACHING.md +520 -0
- package/skills-library/database-solutions/CONDITIONAL_SQL_MIGRATION_PATTERN.md +119 -0
- package/skills-library/database-solutions/DATABASE_COLUMN_NAME_MISMATCH.md +393 -0
- package/skills-library/database-solutions/DATABASE_SCHEMA.md +394 -0
- package/skills-library/database-solutions/DATABASE_SCHEMA_VERIFICATION_GUIDE.md +348 -0
- package/skills-library/database-solutions/DATABASE_STRATEGY.md +71 -0
- package/skills-library/database-solutions/ES_MODULE_SEED_SCRIPT_PATTERN.md +52 -0
- package/skills-library/database-solutions/MIGRATION_GUIDE.md +3 -0
- package/skills-library/database-solutions/PLPGSQL_VARIABLE_CONFLICT_FIX.md +208 -0
- package/skills-library/database-solutions/POSTGRESQL_JSONB_DOUBLE_STRINGIFY_FIX.md +245 -0
- package/skills-library/database-solutions/POSTGRESQL_LICENSE_TABLE_DESIGN.md +393 -0
- package/skills-library/database-solutions/POSTGRESQL_UUID_DOCUMENT_RAG_DUAL_SCOPE.md +732 -0
- package/skills-library/database-solutions/POSTGRES_SQL_TEMPLATE_BINDING_ERROR.md +240 -0
- package/skills-library/database-solutions/PRISMA_DB_PUSH_DATA_LOSS_PREVENTION.md +141 -0
- package/skills-library/database-solutions/PRODUCTION_QUERY_OPTIMIZATION_RESTART_FIX.md +389 -0
- package/skills-library/database-solutions/RLS_SECURITY_GUIDE.md +107 -0
- package/skills-library/database-solutions/SCHEMA_ENHANCEMENTS_GUIDE.md +373 -0
- package/skills-library/database-solutions/SCHEMA_MIGRATION_GUIDE.md +368 -0
- package/skills-library/database-solutions/SCHEMA_VERIFICATION_QUICK_REFERENCE.md +104 -0
- package/skills-library/database-solutions/ai-erd-generator.md +1213 -0
- package/skills-library/database-solutions/content-publishing-states.md +631 -0
- package/skills-library/database-solutions/database-schema-designer.md +522 -0
- package/skills-library/database-solutions/er-diagram-components.md +569 -0
- package/skills-library/database-solutions/er-to-ddl-mapping.md +1405 -0
- package/skills-library/database-solutions/erd-creator-textbook-research.md +433 -0
- package/skills-library/database-solutions/erd-react-flow-architecture.md +1965 -0
- package/skills-library/database-solutions/mariadb-aggregate-function-replacement.md +145 -0
- package/skills-library/database-solutions/normalization-validator.md +778 -0
- package/skills-library/database-solutions/postgres-full-text-search-content.md +494 -0
- package/skills-library/database-solutions/postgresql-to-mysql-runtime-translation.md +286 -0
- package/skills-library/database-solutions/regex-alternation-ordering-sql-types.md +92 -0
- package/skills-library/database-solutions/reserved-word-context-aware-quoting.md +142 -0
- package/skills-library/database-solutions/sql-ddl-generator.md +756 -0
- package/skills-library/database-solutions/supabase-connection-pooler-fix.md +102 -0
- package/skills-library/deployment-security/CPANEL_NODE_DEPLOYMENT.md +166 -0
- package/skills-library/deployment-security/DEPLOYMENT.md +275 -0
- package/skills-library/deployment-security/DEPLOYMENT_CHECKLIST.md +363 -0
- package/skills-library/deployment-security/DEPLOYMENT_PLAN.md +669 -0
- package/skills-library/deployment-security/KNEX_DATABASE_ABSTRACTION.md +444 -0
- package/skills-library/deployment-security/LICENSE_KEY_SYSTEM.md +206 -0
- package/skills-library/deployment-security/NODE18_DEPENDENCY_COMPATIBILITY.md +284 -0
- package/skills-library/deployment-security/PHP_INSTALLER_WIZARD_GUIDE.md +315 -0
- package/skills-library/deployment-security/PM2_ENVIRONMENT_VARIABLE_CACHING.md +256 -0
- package/skills-library/deployment-security/PM2_MEMORY_EXHAUSTION_FIX.md +370 -0
- package/skills-library/deployment-security/PRODUCTION_DEPLOYMENT_GUIDE.md +592 -0
- package/skills-library/deployment-security/PRODUCTION_HARDENING_DOCUMENTATION.md +307 -0
- package/skills-library/deployment-security/PRODUCTION_RECOVERY_CHERRY_PICK_PATTERN.md +202 -0
- package/skills-library/deployment-security/PYINSTALLER_CUDA_WHISPER_BUNDLING.md +236 -0
- package/skills-library/deployment-security/SECURITY.md +41 -0
- package/skills-library/deployment-security/SMTP_SSL_HOSTNAME_MISMATCH_SHARED_HOSTING.md +220 -0
- package/skills-library/deployment-security/SPA_SEO_OPTIMIZATION_CPANEL.md +200 -0
- package/skills-library/deployment-security/SUPABASE_EDGE_FUNCTIONS.md +338 -0
- package/skills-library/deployment-security/VERCEL_GITHUB_DEPLOYMENT_GUIDE.md +858 -0
- package/skills-library/deployment-security/VPS_DEPLOYMENT_READINESS.md +356 -0
- package/skills-library/deployment-security/deployment-changes-not-applying.md +241 -0
- package/skills-library/deployment-security/env-file-management-production-local.md +203 -0
- package/skills-library/deployment-security/express-secure-file-downloads.md +413 -0
- package/skills-library/deployment-security/react-production-deployment-desktop-guide.md +2011 -0
- package/skills-library/deployment-security/self-hosted-supabase-coolify-guide.md +1684 -0
- package/skills-library/deployment-security/unique-features-ai-strategy-plaid-security.md +1613 -0
- package/skills-library/deployment-security/vps-deployment.md +135 -0
- package/skills-library/document-processing/WORD_EXPORT_MARKDOWN_FORMATTING.md +482 -0
- package/skills-library/document-processing/document-ai-landingai-integration.md +677 -0
- package/skills-library/document-processing/express-secure-file-downloads-mern.md +413 -0
- package/skills-library/document-processing/express-secure-file-downloads.md +413 -0
- package/skills-library/document-processing/md-to-word-converter.md +318 -0
- package/skills-library/document-processing/pdf-forms-integration/README.md +101 -0
- package/skills-library/document-processing/pdf-forms-integration/SKILL.md +662 -0
- package/skills-library/ecommerce/ADMIN_PRODUCTS_GUIDE.md +428 -0
- package/skills-library/ecommerce/ECOMMERCE_API_REFERENCE.md +776 -0
- package/skills-library/ecommerce/ECOMMERCE_COMPLETION_SUMMARY.md +673 -0
- package/skills-library/ecommerce/ECOMMERCE_IMPLEMENTATION_GUIDE.md +729 -0
- package/skills-library/ecommerce/ECOMMERCE_QUICK_REFERENCE.md +521 -0
- package/skills-library/ecommerce/ECOMMERCE_TESTING_CHECKLIST.md +565 -0
- package/skills-library/ecommerce/ECOMMERCE_WORKFLOW_GUIDE.md +1059 -0
- package/skills-library/ecommerce/PRODUCT_CREATION_EXPANDED.md +522 -0
- package/skills-library/ecommerce/agentic-commerce-protocol.md +203 -0
- package/skills-library/ecommerce/cart-abandonment-recovery.md +236 -0
- package/skills-library/ecommerce/cart-architecture-patterns.md +300 -0
- package/skills-library/ecommerce/cart-item-count-indicator.md +264 -0
- package/skills-library/ecommerce/checkout-ux-conversion.md +227 -0
- package/skills-library/ecommerce/composable-commerce-selection.md +166 -0
- package/skills-library/ecommerce/ecommerce-analytics-patterns.md +167 -0
- package/skills-library/ecommerce/fraud-detection-patterns.md +179 -0
- package/skills-library/ecommerce/inventory-stock-management.md +270 -0
- package/skills-library/ecommerce/order-saga-state-machine.md +336 -0
- package/skills-library/ecommerce/payment-provider-abstraction.md +245 -0
- package/skills-library/ecommerce/pci-compliance-checklist.md +192 -0
- package/skills-library/ecommerce/refund-chargeback-handling.md +177 -0
- package/skills-library/ecommerce/shipping-carrier-integration.md +218 -0
- package/skills-library/ecommerce/webhook-idempotency-patterns.md +253 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/ci.yml +558 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/prompt-gallery.yml +448 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/release.yml +42 -0
- package/skills-library/excalidraw-diagrams/.github/workflows/test-reusable-ci.yml +25 -0
- package/skills-library/excalidraw-diagrams/CLAUDE.md +57 -0
- package/skills-library/excalidraw-diagrams/LICENSE +21 -0
- package/skills-library/excalidraw-diagrams/README.md +178 -0
- package/skills-library/excalidraw-diagrams/SKILL.md +715 -0
- package/skills-library/form-solutions/BUTTON_TYPE_FORM_SUBMISSION.md +336 -0
- package/skills-library/form-solutions/FILLABLE_PDF_IMPLEMENTATION.md +226 -0
- package/skills-library/form-solutions/SURVEYJS_QUESTIONNAIRE_SYSTEM.md +367 -0
- package/skills-library/form-solutions/tiptap-minimal-setup.md +690 -0
- package/skills-library/frontend/scholarly-classification-bubble-map.md +149 -0
- package/skills-library/infrastructure/ci-cd-pipeline-builder.md +517 -0
- package/skills-library/infrastructure/observability-designer.md +264 -0
- package/skills-library/infrastructure/performance-profiler.md +621 -0
- package/skills-library/installer-wizard-patterns.md +249 -0
- package/skills-library/integrations/CLAUDE_CODE_TOKEN_ANALYTICS.md +160 -0
- package/skills-library/integrations/CONFIGURABLE_AI_PROVIDER_SELECTION.md +728 -0
- package/skills-library/integrations/SOCKET_IO_BROADCAST_ALL_VS_ROOM.md +141 -0
- package/skills-library/integrations/VIRTUAL_MEETINGS_IMPLEMENTATION.md +374 -0
- package/skills-library/integrations/WORDPRESS_LEARNDASH_DATA_RECOVERY.md +53 -0
- package/skills-library/integrations/YOUTUBE_API_SETUP.md +141 -0
- package/skills-library/integrations/YOUTUBE_BOOKMARKING_EXPLANATION.md +252 -0
- package/skills-library/integrations/YOUTUBE_BOOKMARKING_SOLUTION.md +268 -0
- package/skills-library/integrations/YOUTUBE_OAUTH_SETUP_GUIDE.md +200 -0
- package/skills-library/integrations/YOUTUBE_VIDEO_FIX_COMPLETE.md +192 -0
- package/skills-library/integrations/ai-ml/GEMINI_AI_RAG_PIPELINE_COMPLETE_GUIDE.md +195 -0
- package/skills-library/integrations/ai-ml/GEMINI_IMAGE_GENERATION_SETUP.md +64 -0
- package/skills-library/integrations/cloudflare/cloudflare-turnstile-debugging.md +202 -0
- package/skills-library/integrations/cloudflare/cloudflare-turnstile-implementation.md +476 -0
- package/skills-library/integrations/cloudflare-turnstile-debugging.md +202 -0
- package/skills-library/integrations/cloudflare-turnstile-implementation.md +476 -0
- package/skills-library/integrations/ghost-creator-monetization-pattern.md +454 -0
- package/skills-library/integrations/headless-cms-architecture.md +484 -0
- package/skills-library/integrations/headless-cms-stack-selection.md +183 -0
- package/skills-library/integrations/payload-cms-patterns.md +674 -0
- package/skills-library/integrations/realtimestt-openwakeword-cuda-windows.md +229 -0
- package/skills-library/integrations/rss-podcast-integration.md +300 -0
- package/skills-library/integrations/wordpress/WORDPRESS_LEARNDASH_DATA_RECOVERY.md +53 -0
- package/skills-library/integrations/youtube/YOUTUBE_API_SETUP.md +141 -0
- package/skills-library/integrations/youtube/YOUTUBE_BOOKMARKING_EXPLANATION.md +252 -0
- package/skills-library/integrations/youtube/YOUTUBE_BOOKMARKING_SOLUTION.md +268 -0
- package/skills-library/integrations/youtube/YOUTUBE_OAUTH_SETUP_GUIDE.md +200 -0
- package/skills-library/integrations/youtube/YOUTUBE_VIDEO_FIX_COMPLETE.md +192 -0
- package/skills-library/marketing/campaign-analytics.md +97 -0
- package/skills-library/marketing/content-creator.md +105 -0
- package/skills-library/marketing/marketing-strategy-pmm.md +94 -0
- package/skills-library/marketing/social-media-analyzer.md +81 -0
- package/skills-library/methodology/ADVANCED_ORCHESTRATION_PATTERNS.md +401 -0
- package/skills-library/methodology/AGENT_SELF_IMPROVEMENT_LOOP.md +179 -0
- package/skills-library/methodology/BREATH_BASED_PARALLEL_EXECUTION.md +1 -1
- package/skills-library/methodology/CLEANSING_CYCLE.md +358 -0
- package/skills-library/methodology/CONFIDENCE_ANNOTATION_PATTERN.md +143 -0
- package/skills-library/methodology/CRITICAL_PATTERNS_DOCUMENTATION_COMPLETE.md +204 -0
- package/skills-library/methodology/DELIVERABLES_SUMMARY.md +341 -0
- package/skills-library/methodology/DIFFICULTY_AWARE_AGENT_ROUTING.md +252 -0
- package/skills-library/methodology/EVOLUTIONARY_SKILL_SYNTHESIS.md +219 -0
- package/skills-library/methodology/GLOMERULUS_DECISION_GATE.md +223 -0
- package/skills-library/methodology/HIBERNATION_SYSTEM.md +231 -0
- package/skills-library/methodology/INSTRUMENTATION_OVER_RESTRICTION.md +192 -0
- package/skills-library/methodology/MASTER_COMPLETION_SUMMARY.md +444 -0
- package/skills-library/methodology/MASTER_SESSION_COMPLETION.md +743 -0
- package/skills-library/methodology/MERN_QUICK_REFERENCE.md +358 -0
- package/skills-library/methodology/ORGAN_AGENT_MAPPING.md +177 -0
- package/skills-library/methodology/PARALLEL_WAVE_BASED_REFACTORING.md +440 -0
- package/skills-library/methodology/QUICK_REFERENCE.md +358 -0
- package/skills-library/methodology/SDFT_ONPOLICY_SELF_DISTILLATION.md +186 -0
- package/skills-library/methodology/SELF_QUESTIONING_TASK_GENERATION.md +270 -0
- package/skills-library/methodology/SESSION_COMPLETION_SUMMARY.md +304 -0
- package/skills-library/methodology/SESSION_SUMMARY.md +432 -0
- package/skills-library/methodology/WARRIOR_WORKFLOW_DEBUGGING_PROTOCOL.md +252 -0
- package/skills-library/methodology/tech-debt-tracker.md +570 -0
- package/skills-library/parallel-debug/SKILL.md +60 -0
- package/skills-library/patterns-standards/API_PATTERN_FIX_SUMMARY.md +236 -0
- package/skills-library/patterns-standards/BATCH_OPERATIONS_WITH_PROGRESS_MODAL.md +362 -0
- package/skills-library/patterns-standards/CRITICAL_CODING_PATTERNS.md +639 -0
- package/skills-library/patterns-standards/DARK_MODE_MODAL_VISIBILITY.md +258 -0
- package/skills-library/patterns-standards/ERROR_RESILIENCE_IMPLEMENTATION.md +375 -0
- package/skills-library/patterns-standards/ES_MODULE_IMPORT_HOISTING_DOTENV.md +298 -0
- package/skills-library/patterns-standards/NESTED_BACKDROP_FILTER_CSS_ARTIFACT_FIX.md +76 -0
- package/skills-library/patterns-standards/ORDERED_DETECTOR_PIPELINE_GRACEFUL_FALLBACK.md +333 -0
- package/skills-library/patterns-standards/PHASE_IMPORT_ERROR_DEBUGGING.md +271 -0
- package/skills-library/patterns-standards/PYNPUT_GLOBAL_HOTKEY_VK_MATCHING.md +252 -0
- package/skills-library/patterns-standards/REACT_USEEFFECT_CASCADE_RESET_FIX.md +132 -0
- package/skills-library/patterns-standards/SUBMENU_HOVER_DROPDOWN_PATTERN.md +225 -0
- package/skills-library/patterns-standards/TAILWIND_TEXT_VISIBILITY_OVERRIDE.md +322 -0
- package/skills-library/patterns-standards/THEME_AWARE_CSS_VARIABLES_PATTERN.md +209 -0
- package/skills-library/patterns-standards/THEME_USER_OBJECT_PROPERTY_NAMING.md +194 -0
- package/skills-library/patterns-standards/TOOLTIP_BLOCKING_CLICKS_FIX.md +267 -0
- package/skills-library/patterns-standards/claude-code-plugin-structure.md +235 -0
- package/skills-library/patterns-standards/react-i18next-setup.md +429 -0
- package/skills-library/patterns-standards/thesys-c1-generative-ui-integration.md +967 -0
- package/skills-library/plugin-development/CLAUDE_CODE_COMMAND_REGISTRATION_SILENT_FAILURE.md +315 -0
- package/skills-library/plugin-development/plugin-command-namespace-vs-global.md +390 -0
- package/skills-library/plugin-development/plugin-doc-auto-generation.md +172 -0
- package/skills-library/security/GITHUB_REPO_SECURITY_AUDIT.md +115 -0
- package/skills-library/security/admin-deletion-safety.md +396 -0
- package/skills-library/security/application-vuln-patterns.md +477 -0
- package/skills-library/security/env-secrets-manager.md +686 -0
- package/skills-library/security/secure-ai-application-templates.md +347 -0
- package/skills-library/security/sql-injection-prevention-postgresjs.md +151 -0
- package/skills-library/supabase-connection-pooler-fix.md +102 -0
- package/skills-library/system-context/POWERSHELL_BASH_INTEROP.md +82 -0
- package/skills-library/system-context/SERVICE_LIFECYCLE_MANAGEMENT.md +119 -0
- package/skills-library/system-context/SKILL.md +40 -0
- package/skills-library/system-context/WINDOWS_DEV_ENVIRONMENT.md +73 -0
- package/skills-library/testing/E2E_PLAYWRIGHT_PATTERNS.md +99 -0
- package/skills-library/testing/INTEGRATION_TEST_STRATEGY.md +82 -0
- package/skills-library/testing/RED_GREEN_BUGFIX_GATE.md +203 -0
- package/skills-library/testing/TEST_DATA_MANAGEMENT.md +69 -0
- package/skills-library/testing/VITEST_UNIT_TEST_PATTERNS.md +75 -0
- package/skills-library/testing/playwright-api-security-tests.md +202 -0
- package/skills-library/toolbox/SKILL.md +84 -0
- package/skills-library/toolbox/code-graph-and-web-scraping-mcps.md +237 -0
- package/skills-library/ui-ux-pro-max/ACCESSIBILITY_ESSENTIALS.md +115 -0
- package/skills-library/ui-ux-pro-max/DESIGN_SYSTEM_SCAFFOLDING.md +133 -0
- package/skills-library/ui-ux-pro-max/RESPONSIVE_LAYOUT_PATTERNS.md +119 -0
- package/skills-library/ui-ux-pro-max/SKILL.md +386 -0
- package/skills-library/ui-ux-pro-max/data/charts.csv +26 -0
- package/skills-library/ui-ux-pro-max/data/colors.csv +97 -0
- package/skills-library/ui-ux-pro-max/data/icons.csv +101 -0
- package/skills-library/ui-ux-pro-max/data/landing.csv +31 -0
- package/skills-library/ui-ux-pro-max/data/products.csv +97 -0
- package/skills-library/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/skills-library/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/skills-library/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/skills-library/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/skills-library/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/skills-library/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/skills-library/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/skills-library/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/skills-library/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills-library/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/skills-library/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/skills-library/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/skills-library/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/skills-library/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/skills-library/ui-ux-pro-max/data/styles.csv +68 -0
- package/skills-library/ui-ux-pro-max/data/typography.csv +58 -0
- package/skills-library/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/skills-library/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/skills-library/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/skills-library/wordpress-style-theme-components.md +1526 -0
- package/templates/ASSUMPTIONS.md +1 -1
- package/templates/DECISION_LOG.md +0 -1
- package/templates/phase-prompt.md +1 -1
- package/templates/phoenix-comparison.md +6 -6
- package/templates/skill-api-integration.md +106 -0
- package/templates/skill-architecture-pattern.md +92 -0
- package/templates/skill-debug-pattern.md +98 -0
- package/templates/skill-devops-recipe.md +107 -0
- package/templates/skill-general.md +65 -0
- package/templates/skill-ui-component.md +113 -0
- package/tools/uat-runner.py +179 -0
- package/version.json +7 -3
- package/workflows/handoff-session.md +2 -2
- package/workflows/new-project.md +2 -2
- package/workflows/plan-phase.md +1 -1
- package/.claude-plugin/plugin.json +0 -64
- package/skills-library/_general/methodology/LIVE_BREADCRUMB_PROTOCOL.md +0 -242
- package/skills-library/_general/methodology/llm-judge-memory-crud.md +0 -241
- package/skills-library/methodology/REFLEXION_MEMORY_PATTERN.md +0 -183
- package/skills-library/methodology/RESEARCH_BACKED_WORKFLOW_UPGRADE.md +0 -263
- package/skills-library/methodology/SABBATH_REST_PATTERN.md +0 -267
- package/skills-library/methodology/STONE_AND_SCAFFOLD.md +0 -220
- package/skills-library/specialists/api-architecture/api-designer.md +0 -49
- package/skills-library/specialists/api-architecture/graphql-architect.md +0 -49
- package/skills-library/specialists/api-architecture/mcp-developer.md +0 -51
- package/skills-library/specialists/api-architecture/microservices-architect.md +0 -50
- package/skills-library/specialists/api-architecture/websocket-engineer.md +0 -48
- package/skills-library/specialists/backend/django-expert.md +0 -52
- package/skills-library/specialists/backend/fastapi-expert.md +0 -52
- package/skills-library/specialists/backend/laravel-specialist.md +0 -52
- package/skills-library/specialists/backend/nestjs-expert.md +0 -51
- package/skills-library/specialists/backend/rails-expert.md +0 -53
- package/skills-library/specialists/backend/spring-boot-engineer.md +0 -56
- package/skills-library/specialists/data-ml/fine-tuning-expert.md +0 -48
- package/skills-library/specialists/data-ml/ml-pipeline.md +0 -47
- package/skills-library/specialists/data-ml/pandas-pro.md +0 -47
- package/skills-library/specialists/data-ml/rag-architect.md +0 -51
- package/skills-library/specialists/data-ml/spark-engineer.md +0 -47
- package/skills-library/specialists/frontend/angular-architect.md +0 -52
- package/skills-library/specialists/frontend/flutter-expert.md +0 -51
- package/skills-library/specialists/frontend/nextjs-developer.md +0 -54
- package/skills-library/specialists/frontend/react-native-expert.md +0 -50
- package/skills-library/specialists/frontend/vue-expert.md +0 -51
- package/skills-library/specialists/infrastructure/chaos-engineer.md +0 -74
- package/skills-library/specialists/infrastructure/cloud-architect.md +0 -70
- package/skills-library/specialists/infrastructure/database-optimizer.md +0 -64
- package/skills-library/specialists/infrastructure/devops-engineer.md +0 -70
- package/skills-library/specialists/infrastructure/kubernetes-specialist.md +0 -52
- package/skills-library/specialists/infrastructure/monitoring-expert.md +0 -70
- package/skills-library/specialists/infrastructure/sre-engineer.md +0 -70
- package/skills-library/specialists/infrastructure/terraform-engineer.md +0 -51
- package/skills-library/specialists/languages/cpp-pro.md +0 -74
- package/skills-library/specialists/languages/csharp-developer.md +0 -69
- package/skills-library/specialists/languages/dotnet-core-expert.md +0 -54
- package/skills-library/specialists/languages/golang-pro.md +0 -51
- package/skills-library/specialists/languages/java-architect.md +0 -49
- package/skills-library/specialists/languages/javascript-pro.md +0 -68
- package/skills-library/specialists/languages/kotlin-specialist.md +0 -68
- package/skills-library/specialists/languages/php-pro.md +0 -49
- package/skills-library/specialists/languages/python-pro.md +0 -52
- package/skills-library/specialists/languages/react-expert.md +0 -51
- package/skills-library/specialists/languages/rust-engineer.md +0 -50
- package/skills-library/specialists/languages/sql-pro.md +0 -56
- package/skills-library/specialists/languages/swift-expert.md +0 -69
- package/skills-library/specialists/languages/typescript-pro.md +0 -51
- package/skills-library/specialists/platform/atlassian-mcp.md +0 -52
- package/skills-library/specialists/platform/embedded-systems.md +0 -53
- package/skills-library/specialists/platform/game-developer.md +0 -53
- package/skills-library/specialists/platform/salesforce-developer.md +0 -53
- package/skills-library/specialists/platform/shopify-expert.md +0 -49
- package/skills-library/specialists/platform/wordpress-pro.md +0 -49
- package/skills-library/specialists/quality/code-documenter.md +0 -51
- package/skills-library/specialists/quality/code-reviewer.md +0 -67
- package/skills-library/specialists/quality/debugging-wizard.md +0 -51
- package/skills-library/specialists/quality/fullstack-guardian.md +0 -51
- package/skills-library/specialists/quality/legacy-modernizer.md +0 -50
- package/skills-library/specialists/quality/playwright-expert.md +0 -65
- package/skills-library/specialists/quality/spec-miner.md +0 -56
- package/skills-library/specialists/quality/test-master.md +0 -65
- package/skills-library/specialists/security/secure-code-guardian.md +0 -55
- package/skills-library/specialists/security/security-reviewer.md +0 -53
- package/skills-library/specialists/workflow/architecture-designer.md +0 -53
- package/skills-library/specialists/workflow/cli-developer.md +0 -70
- package/skills-library/specialists/workflow/feature-forge.md +0 -65
- package/skills-library/specialists/workflow/prompt-engineer.md +0 -54
- package/skills-library/specialists/workflow/the-fool.md +0 -62
- /package/skills-library/{performance → _general/performance}/cache-augmented-generation.md +0 -0
- /package/skills-library/{debugging → parallel-debug}/FAILURE_TAXONOMY_CLASSIFICATION.md +0 -0
- /package/skills-library/{debugging → parallel-debug}/THREE_AGENT_HYPOTHESIS_DEBUGGING.md +0 -0
|
@@ -0,0 +1,625 @@
|
|
|
1
|
+
# Audio Enhancement Pipeline
|
|
2
|
+
## Description
|
|
3
|
+
|
|
4
|
+
Automate audio post-production using FFmpeg filter chains. This skill provides a structured pipeline for cleaning up, normalizing, and mastering audio — covering podcasts, sermons, music, and voice recordings.
|
|
5
|
+
|
|
6
|
+
## When to Use
|
|
7
|
+
|
|
8
|
+
- Cleaning up recorded audio (noise, silence, inconsistent volume)
|
|
9
|
+
- Preparing podcast/sermon audio for publishing
|
|
10
|
+
- Batch processing multiple audio files with consistent quality
|
|
11
|
+
- Building an automated audio pipeline in Node.js
|
|
12
|
+
- Mastering music tracks for distribution
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## The Pipeline (Ordered Steps)
|
|
17
|
+
|
|
18
|
+
Audio enhancement works best when filters are applied in a specific order. Each step builds on the previous one.
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
Raw Audio
|
|
22
|
+
|
|
|
23
|
+
v
|
|
24
|
+
[1] Noise Reduction -- remove background hiss, hum, ambient noise
|
|
25
|
+
|
|
|
26
|
+
v
|
|
27
|
+
[2] Loudness Normalization -- bring to target LUFS (EBU R128)
|
|
28
|
+
|
|
|
29
|
+
v
|
|
30
|
+
[3] Silence Trimming -- remove dead air from start, end, and middle
|
|
31
|
+
|
|
|
32
|
+
v
|
|
33
|
+
[4] Compression/Limiting -- tame peaks, even out dynamic range
|
|
34
|
+
|
|
|
35
|
+
v
|
|
36
|
+
[5] Format Conversion -- export to target format(s)
|
|
37
|
+
|
|
|
38
|
+
v
|
|
39
|
+
Clean Audio
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Step 1: Noise Reduction
|
|
45
|
+
|
|
46
|
+
### FFT-based Denoising (`afftdn`)
|
|
47
|
+
|
|
48
|
+
Best for stationary noise (constant hiss, fan hum, room tone).
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# Adaptive noise floor — good default for most recordings
|
|
52
|
+
ffmpeg -i input.wav -af "afftdn=nf=-25:nt=w:om=o" denoised.wav
|
|
53
|
+
|
|
54
|
+
# Stronger denoising (may affect voice quality)
|
|
55
|
+
ffmpeg -i input.wav -af "afftdn=nf=-20:nt=w:om=o" denoised.wav
|
|
56
|
+
|
|
57
|
+
# Gentle denoising (preserves natural sound)
|
|
58
|
+
ffmpeg -i input.wav -af "afftdn=nf=-35:nt=w:om=o" denoised.wav
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**Parameters:**
|
|
62
|
+
- `nf` — noise floor in dB (lower = less aggressive, `-25` is a good start)
|
|
63
|
+
- `nt=w` — noise type: white noise model
|
|
64
|
+
- `om=o` — output mode: output cleaned signal
|
|
65
|
+
|
|
66
|
+
### Non-local Means Denoising (`anlmdn`)
|
|
67
|
+
|
|
68
|
+
Better for non-stationary noise (variable background sounds).
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
# Default non-local means denoising
|
|
72
|
+
ffmpeg -i input.wav -af "anlmdn=s=7:p=0.002:r=0.002" denoised.wav
|
|
73
|
+
|
|
74
|
+
# Stronger denoising
|
|
75
|
+
ffmpeg -i input.wav -af "anlmdn=s=10:p=0.005:r=0.005" denoised.wav
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**Parameters:**
|
|
79
|
+
- `s` — denoising strength (higher = more aggressive)
|
|
80
|
+
- `p` — patch size factor
|
|
81
|
+
- `r` — research size factor
|
|
82
|
+
|
|
83
|
+
### Hum Removal (50/60Hz electrical hum)
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
# Remove 60Hz hum (US power) + harmonics
|
|
87
|
+
ffmpeg -i input.wav -af "highpass=f=80,bandreject=f=60:w=2,bandreject=f=120:w=2,bandreject=f=180:w=2" dehum.wav
|
|
88
|
+
|
|
89
|
+
# Remove 50Hz hum (EU power) + harmonics
|
|
90
|
+
ffmpeg -i input.wav -af "highpass=f=65,bandreject=f=50:w=2,bandreject=f=100:w=2,bandreject=f=150:w=2" dehum.wav
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Step 2: Loudness Normalization (EBU R128)
|
|
96
|
+
|
|
97
|
+
### Target Levels
|
|
98
|
+
|
|
99
|
+
| Content Type | Integrated LUFS | True Peak (dBTP) | LRA (LU) |
|
|
100
|
+
|-------------|-----------------|-------------------|-----------|
|
|
101
|
+
| **Podcast** | -16 LUFS | -1.0 dBTP | 5-10 LU |
|
|
102
|
+
| **YouTube** | -14 LUFS | -1.0 dBTP | 7-12 LU |
|
|
103
|
+
| **Music streaming** | -14 LUFS | -1.0 dBTP | 7-15 LU |
|
|
104
|
+
| **Broadcast TV** | -24 LUFS | -2.0 dBTP | 6-12 LU |
|
|
105
|
+
| **Audiobook** | -18 to -20 LUFS | -3.0 dBTP | 3-6 LU |
|
|
106
|
+
|
|
107
|
+
### Two-Pass Normalization (Most Accurate)
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
# Pass 1: Measure current loudness
|
|
111
|
+
ffmpeg -i input.wav -af loudnorm=I=-16:TP=-1.0:LRA=11:print_format=json -f null NUL 2>&1
|
|
112
|
+
|
|
113
|
+
# Read the JSON output — you need: measured_I, measured_TP, measured_LRA, measured_thresh
|
|
114
|
+
|
|
115
|
+
# Pass 2: Apply with measured values (example values — use YOUR measured values)
|
|
116
|
+
ffmpeg -i input.wav -af loudnorm=I=-16:TP=-1.0:LRA=11:measured_I=-23.2:measured_TP=-4.1:measured_LRA=14.5:measured_thresh=-34.2:linear=true normalized.wav
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Single-Pass Normalization (Simpler)
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
# Podcast target (-16 LUFS)
|
|
123
|
+
ffmpeg -i input.wav -af loudnorm=I=-16:TP=-1.0:LRA=11 normalized.wav
|
|
124
|
+
|
|
125
|
+
# Music target (-14 LUFS)
|
|
126
|
+
ffmpeg -i input.wav -af loudnorm=I=-14:TP=-1.0:LRA=11 normalized.wav
|
|
127
|
+
|
|
128
|
+
# Broadcast target (-24 LUFS)
|
|
129
|
+
ffmpeg -i input.wav -af loudnorm=I=-24:TP=-2.0:LRA=11 normalized.wav
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Step 3: Silence Trimming
|
|
135
|
+
|
|
136
|
+
### Remove Leading and Trailing Silence
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
# Remove silence from start and end (threshold: -40dB, min silence: 0.5s)
|
|
140
|
+
ffmpeg -i input.wav -af "silenceremove=start_periods=1:start_threshold=-40dB:start_duration=0.5:stop_periods=1:stop_threshold=-40dB:stop_duration=0.5" trimmed.wav
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### Remove All Internal Silence (Pauses)
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
# Remove ALL silence segments longer than 1 second
|
|
147
|
+
ffmpeg -i input.wav -af "silenceremove=stop_periods=-1:stop_threshold=-40dB:stop_duration=1" trimmed.wav
|
|
148
|
+
|
|
149
|
+
# Shorten long pauses to 0.5s (keep some natural rhythm)
|
|
150
|
+
ffmpeg -i input.wav -af "silenceremove=stop_periods=-1:stop_threshold=-45dB:stop_duration=2:stop_silence=0.5" trimmed.wav
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### Detect Silence (Without Removing)
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
# List all silent segments (useful for chapter detection)
|
|
157
|
+
ffmpeg -i input.wav -af silencedetect=noise=-40dB:d=1.0 -f null NUL 2>&1
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## Step 4: Compression / Limiting
|
|
163
|
+
|
|
164
|
+
### Dynamic Range Compression
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
# Gentle compression — evens out volume without squashing dynamics
|
|
168
|
+
ffmpeg -i input.wav -af "acompressor=threshold=-20dB:ratio=3:attack=5:release=50:makeup=2" compressed.wav
|
|
169
|
+
|
|
170
|
+
# Podcast compression — tighter control for consistent voice levels
|
|
171
|
+
ffmpeg -i input.wav -af "acompressor=threshold=-18dB:ratio=4:attack=5:release=100:knee=5:makeup=3" compressed.wav
|
|
172
|
+
|
|
173
|
+
# Aggressive compression — broadcast-style (talk radio feel)
|
|
174
|
+
ffmpeg -i input.wav -af "acompressor=threshold=-15dB:ratio=6:attack=2:release=50:knee=3:makeup=5" compressed.wav
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
**Parameters explained:**
|
|
178
|
+
- `threshold` — level above which compression kicks in
|
|
179
|
+
- `ratio` — how much to reduce (4:1 means 4dB over threshold becomes 1dB)
|
|
180
|
+
- `attack` — how fast compression engages (ms)
|
|
181
|
+
- `release` — how fast compression releases (ms)
|
|
182
|
+
- `knee` — softens the threshold transition (dB)
|
|
183
|
+
- `makeup` — gain added after compression to restore volume (dB)
|
|
184
|
+
|
|
185
|
+
### Hard Limiting (Prevent Clipping)
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
# Brick-wall limiter at -1dBTP
|
|
189
|
+
ffmpeg -i input.wav -af "alimiter=limit=0.891:attack=5:release=50:level=false" limited.wav
|
|
190
|
+
# 0.891 = linear value of -1 dBFS (10^(-1/20))
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## Step 5: Format Conversion
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
# High-quality MP3 for podcast distribution
|
|
199
|
+
ffmpeg -i enhanced.wav -c:a libmp3lame -b:a 192k -ar 44100 podcast.mp3
|
|
200
|
+
|
|
201
|
+
# AAC for Apple Podcasts
|
|
202
|
+
ffmpeg -i enhanced.wav -c:a aac -b:a 192k -ar 44100 podcast.m4a
|
|
203
|
+
|
|
204
|
+
# Opus for web (best quality-to-size ratio)
|
|
205
|
+
ffmpeg -i enhanced.wav -c:a libopus -b:a 128k podcast.opus
|
|
206
|
+
|
|
207
|
+
# FLAC for archival
|
|
208
|
+
ffmpeg -i enhanced.wav -c:a flac -compression_level 8 archive.flac
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Complete FFmpeg Command Chains
|
|
214
|
+
|
|
215
|
+
### Sermon / Podcast Cleanup
|
|
216
|
+
|
|
217
|
+
Full pipeline: noise reduction, normalize to -16 LUFS, trim silence, gentle compression.
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
ffmpeg -i raw_sermon.wav \
|
|
221
|
+
-af "afftdn=nf=-25:nt=w:om=o, \
|
|
222
|
+
highpass=f=80, \
|
|
223
|
+
acompressor=threshold=-20dB:ratio=3:attack=5:release=100:makeup=2, \
|
|
224
|
+
silenceremove=start_periods=1:start_threshold=-40dB:stop_periods=1:stop_threshold=-40dB:stop_duration=0.5, \
|
|
225
|
+
loudnorm=I=-16:TP=-1.0:LRA=11" \
|
|
226
|
+
-c:a libmp3lame -b:a 192k -ar 44100 \
|
|
227
|
+
clean_sermon.mp3
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### Music Mastering
|
|
231
|
+
|
|
232
|
+
Normalize, compress for consistent dynamics, limit peaks.
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
ffmpeg -i raw_mix.wav \
|
|
236
|
+
-af "acompressor=threshold=-18dB:ratio=2.5:attack=10:release=200:knee=6:makeup=1, \
|
|
237
|
+
alimiter=limit=0.891:attack=5:release=50:level=false, \
|
|
238
|
+
loudnorm=I=-14:TP=-1.0:LRA=11" \
|
|
239
|
+
-c:a flac -compression_level 8 \
|
|
240
|
+
mastered.flac
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
### Voice Recording Enhancement
|
|
244
|
+
|
|
245
|
+
Noise removal, presence boost (2-5kHz), normalize for clarity.
|
|
246
|
+
|
|
247
|
+
```bash
|
|
248
|
+
ffmpeg -i raw_voice.wav \
|
|
249
|
+
-af "afftdn=nf=-25:nt=w:om=o, \
|
|
250
|
+
highpass=f=80, \
|
|
251
|
+
lowpass=f=12000, \
|
|
252
|
+
equalizer=f=3500:t=q:w=1.5:g=3, \
|
|
253
|
+
acompressor=threshold=-20dB:ratio=3:attack=5:release=100:makeup=2, \
|
|
254
|
+
loudnorm=I=-16:TP=-1.0:LRA=11" \
|
|
255
|
+
-c:a libmp3lame -b:a 192k -ar 44100 \
|
|
256
|
+
enhanced_voice.mp3
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
**EQ breakdown:**
|
|
260
|
+
- `highpass=f=80` — removes rumble below 80Hz
|
|
261
|
+
- `lowpass=f=12000` — removes harsh sibilance above 12kHz
|
|
262
|
+
- `equalizer=f=3500:t=q:w=1.5:g=3` — boosts presence range by 3dB (makes voice cut through)
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## Node.js Implementation
|
|
267
|
+
|
|
268
|
+
### Full Pipeline with fluent-ffmpeg
|
|
269
|
+
|
|
270
|
+
```javascript
|
|
271
|
+
import ffmpeg from 'fluent-ffmpeg';
|
|
272
|
+
import { existsSync } from 'fs';
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Audio enhancement pipeline
|
|
276
|
+
* @param {string} inputPath - Path to raw audio file
|
|
277
|
+
* @param {string} outputPath - Path for enhanced output
|
|
278
|
+
* @param {object} options - Pipeline configuration
|
|
279
|
+
*/
|
|
280
|
+
function enhanceAudio(inputPath, outputPath, options = {}) {
|
|
281
|
+
const {
|
|
282
|
+
type = 'podcast', // 'podcast' | 'music' | 'voice'
|
|
283
|
+
targetLUFS = -16, // Target loudness
|
|
284
|
+
noiseFloor = -25, // Noise reduction strength (dB)
|
|
285
|
+
trimSilence = true, // Remove leading/trailing silence
|
|
286
|
+
outputFormat = 'mp3', // 'mp3' | 'aac' | 'flac' | 'opus'
|
|
287
|
+
bitrate = '192k',
|
|
288
|
+
onProgress = null,
|
|
289
|
+
} = options;
|
|
290
|
+
|
|
291
|
+
if (!existsSync(inputPath)) {
|
|
292
|
+
return Promise.reject(new Error(`Input file not found: ${inputPath}`));
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
// Build filter chain based on content type
|
|
296
|
+
const filters = [];
|
|
297
|
+
|
|
298
|
+
// Step 1: Noise reduction
|
|
299
|
+
filters.push(`afftdn=nf=${noiseFloor}:nt=w:om=o`);
|
|
300
|
+
filters.push('highpass=f=80');
|
|
301
|
+
|
|
302
|
+
// Step 2: Type-specific processing
|
|
303
|
+
if (type === 'voice') {
|
|
304
|
+
filters.push('lowpass=f=12000');
|
|
305
|
+
filters.push('equalizer=f=3500:t=q:w=1.5:g=3');
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// Step 3: Compression
|
|
309
|
+
const compSettings = {
|
|
310
|
+
podcast: 'threshold=-20dB:ratio=3:attack=5:release=100:makeup=2',
|
|
311
|
+
music: 'threshold=-18dB:ratio=2.5:attack=10:release=200:knee=6:makeup=1',
|
|
312
|
+
voice: 'threshold=-20dB:ratio=3:attack=5:release=100:makeup=2',
|
|
313
|
+
};
|
|
314
|
+
filters.push(`acompressor=${compSettings[type] || compSettings.podcast}`);
|
|
315
|
+
|
|
316
|
+
// Step 4: Silence trimming
|
|
317
|
+
if (trimSilence) {
|
|
318
|
+
filters.push(
|
|
319
|
+
'silenceremove=start_periods=1:start_threshold=-40dB:stop_periods=1:stop_threshold=-40dB:stop_duration=0.5'
|
|
320
|
+
);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// Step 5: Loudness normalization (always last before output)
|
|
324
|
+
filters.push(`loudnorm=I=${targetLUFS}:TP=-1.0:LRA=11`);
|
|
325
|
+
|
|
326
|
+
const filterChain = filters.join(',');
|
|
327
|
+
|
|
328
|
+
// Codec mapping
|
|
329
|
+
const codecMap = {
|
|
330
|
+
mp3: { codec: 'libmp3lame', ext: '.mp3' },
|
|
331
|
+
aac: { codec: 'aac', ext: '.m4a' },
|
|
332
|
+
flac: { codec: 'flac', ext: '.flac' },
|
|
333
|
+
opus: { codec: 'libopus', ext: '.opus' },
|
|
334
|
+
};
|
|
335
|
+
const { codec } = codecMap[outputFormat] || codecMap.mp3;
|
|
336
|
+
|
|
337
|
+
return new Promise((resolve, reject) => {
|
|
338
|
+
const cmd = ffmpeg(inputPath)
|
|
339
|
+
.audioFilters(filterChain)
|
|
340
|
+
.audioCodec(codec)
|
|
341
|
+
.audioBitrate(bitrate)
|
|
342
|
+
.audioFrequency(44100)
|
|
343
|
+
.output(outputPath)
|
|
344
|
+
.on('start', (cmdLine) => {
|
|
345
|
+
console.log('[audio-pipeline] Running:', cmdLine);
|
|
346
|
+
})
|
|
347
|
+
.on('progress', (progress) => {
|
|
348
|
+
if (onProgress) onProgress(progress);
|
|
349
|
+
})
|
|
350
|
+
.on('end', () => {
|
|
351
|
+
console.log('[audio-pipeline] Done:', outputPath);
|
|
352
|
+
resolve(outputPath);
|
|
353
|
+
})
|
|
354
|
+
.on('error', (err, stdout, stderr) => {
|
|
355
|
+
console.error('[audio-pipeline] Error:', err.message);
|
|
356
|
+
console.error('[audio-pipeline] stderr:', stderr);
|
|
357
|
+
reject(err);
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
cmd.run();
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
// --- Usage Examples ---
|
|
365
|
+
|
|
366
|
+
// Podcast cleanup
|
|
367
|
+
await enhanceAudio('raw_episode.wav', 'episode_001.mp3', {
|
|
368
|
+
type: 'podcast',
|
|
369
|
+
targetLUFS: -16,
|
|
370
|
+
trimSilence: true,
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
// Music mastering
|
|
374
|
+
await enhanceAudio('mix.wav', 'mastered.flac', {
|
|
375
|
+
type: 'music',
|
|
376
|
+
targetLUFS: -14,
|
|
377
|
+
outputFormat: 'flac',
|
|
378
|
+
trimSilence: false,
|
|
379
|
+
});
|
|
380
|
+
|
|
381
|
+
// Voice memo cleanup
|
|
382
|
+
await enhanceAudio('recording.m4a', 'clean_voice.mp3', {
|
|
383
|
+
type: 'voice',
|
|
384
|
+
targetLUFS: -16,
|
|
385
|
+
noiseFloor: -20, // more aggressive for noisy recordings
|
|
386
|
+
});
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
### Batch Processing
|
|
390
|
+
|
|
391
|
+
```javascript
|
|
392
|
+
import { readdir } from 'fs/promises';
|
|
393
|
+
import { join, parse } from 'path';
|
|
394
|
+
|
|
395
|
+
async function batchEnhance(inputDir, outputDir, options = {}) {
|
|
396
|
+
const files = await readdir(inputDir);
|
|
397
|
+
const audioFiles = files.filter(f =>
|
|
398
|
+
/\.(wav|mp3|m4a|flac|ogg|aac|wma)$/i.test(f)
|
|
399
|
+
);
|
|
400
|
+
|
|
401
|
+
console.log(`Found ${audioFiles.length} audio files to process`);
|
|
402
|
+
|
|
403
|
+
const results = [];
|
|
404
|
+
for (const file of audioFiles) {
|
|
405
|
+
const inputPath = join(inputDir, file);
|
|
406
|
+
const { name } = parse(file);
|
|
407
|
+
const outputPath = join(outputDir, `${name}_enhanced.mp3`);
|
|
408
|
+
|
|
409
|
+
try {
|
|
410
|
+
await enhanceAudio(inputPath, outputPath, options);
|
|
411
|
+
results.push({ file, status: 'success', output: outputPath });
|
|
412
|
+
} catch (err) {
|
|
413
|
+
results.push({ file, status: 'error', error: err.message });
|
|
414
|
+
console.error(`Failed: ${file} — ${err.message}`);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
const succeeded = results.filter(r => r.status === 'success').length;
|
|
419
|
+
console.log(`Batch complete: ${succeeded}/${audioFiles.length} succeeded`);
|
|
420
|
+
return results;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
await batchEnhance('./raw_sermons/', './enhanced_sermons/', {
|
|
424
|
+
type: 'podcast',
|
|
425
|
+
targetLUFS: -16,
|
|
426
|
+
});
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
---
|
|
430
|
+
|
|
431
|
+
## API Alternatives
|
|
432
|
+
|
|
433
|
+
When local FFmpeg processing is not enough (heavy noise, AI-powered enhancement needed):
|
|
434
|
+
|
|
435
|
+
### Auphonic API
|
|
436
|
+
|
|
437
|
+
Best for: Podcast production, automatic leveling, noise reduction.
|
|
438
|
+
|
|
439
|
+
```javascript
|
|
440
|
+
// Auphonic — automated audio post-production
|
|
441
|
+
// Docs: https://auphonic.com/api/
|
|
442
|
+
|
|
443
|
+
const AUPHONIC_TOKEN = process.env.AUPHONIC_TOKEN;
|
|
444
|
+
|
|
445
|
+
// Create a production
|
|
446
|
+
const response = await fetch('https://auphonic.com/api/simple/productions.json', {
|
|
447
|
+
method: 'POST',
|
|
448
|
+
headers: {
|
|
449
|
+
'Authorization': `Bearer ${AUPHONIC_TOKEN}`,
|
|
450
|
+
'Content-Type': 'application/json',
|
|
451
|
+
},
|
|
452
|
+
body: JSON.stringify({
|
|
453
|
+
title: 'Episode 42',
|
|
454
|
+
input_file: 'https://example.com/raw_audio.wav',
|
|
455
|
+
output_files: [{ format: 'mp3', bitrate: '192' }],
|
|
456
|
+
algorithms: {
|
|
457
|
+
loudnesstarget: -16, // LUFS
|
|
458
|
+
denoise: true,
|
|
459
|
+
leveler: true, // Multi-track leveling
|
|
460
|
+
filtering: true, // Remove low-frequency rumble
|
|
461
|
+
},
|
|
462
|
+
}),
|
|
463
|
+
});
|
|
464
|
+
|
|
465
|
+
const { data } = await response.json();
|
|
466
|
+
// Start the production
|
|
467
|
+
await fetch(`https://auphonic.com/api/production/${data.uuid}/start.json`, {
|
|
468
|
+
method: 'POST',
|
|
469
|
+
headers: { 'Authorization': `Bearer ${AUPHONIC_TOKEN}` },
|
|
470
|
+
});
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
**Pricing:** Free tier = 2 hours/month. Paid starts at $11/month for 9 hours.
|
|
474
|
+
|
|
475
|
+
### Dolby.io Media API
|
|
476
|
+
|
|
477
|
+
Best for: Professional-grade enhancement, noise reduction, loudness correction.
|
|
478
|
+
|
|
479
|
+
```javascript
|
|
480
|
+
// Dolby.io Enhance API
|
|
481
|
+
// Docs: https://docs.dolby.io/media-apis/docs/enhance-api-guide
|
|
482
|
+
|
|
483
|
+
const DOLBY_API_KEY = process.env.DOLBY_API_KEY;
|
|
484
|
+
|
|
485
|
+
// Step 1: Get upload URL
|
|
486
|
+
const uploadResp = await fetch('https://api.dolby.io/media/input', {
|
|
487
|
+
method: 'POST',
|
|
488
|
+
headers: {
|
|
489
|
+
'Authorization': `Bearer ${DOLBY_API_KEY}`,
|
|
490
|
+
'Content-Type': 'application/json',
|
|
491
|
+
},
|
|
492
|
+
body: JSON.stringify({ url: 'dlb://input/raw_audio.wav' }),
|
|
493
|
+
});
|
|
494
|
+
const { url: uploadUrl } = await uploadResp.json();
|
|
495
|
+
|
|
496
|
+
// Step 2: Upload file
|
|
497
|
+
await fetch(uploadUrl, {
|
|
498
|
+
method: 'PUT',
|
|
499
|
+
headers: { 'Content-Type': 'audio/wav' },
|
|
500
|
+
body: audioBuffer,
|
|
501
|
+
});
|
|
502
|
+
|
|
503
|
+
// Step 3: Start enhancement
|
|
504
|
+
const enhanceResp = await fetch('https://api.dolby.io/media/enhance', {
|
|
505
|
+
method: 'POST',
|
|
506
|
+
headers: {
|
|
507
|
+
'Authorization': `Bearer ${DOLBY_API_KEY}`,
|
|
508
|
+
'Content-Type': 'application/json',
|
|
509
|
+
},
|
|
510
|
+
body: JSON.stringify({
|
|
511
|
+
input: 'dlb://input/raw_audio.wav',
|
|
512
|
+
output: 'dlb://output/enhanced.mp3',
|
|
513
|
+
content: { type: 'podcast' }, // 'podcast' | 'conference' | 'interview' | 'music'
|
|
514
|
+
audio: {
|
|
515
|
+
noise: { reduction: { enable: true, amount: 'high' } },
|
|
516
|
+
loudness: { enable: true, dialog_intelligence: true },
|
|
517
|
+
},
|
|
518
|
+
}),
|
|
519
|
+
});
|
|
520
|
+
```
|
|
521
|
+
|
|
522
|
+
**Pricing:** Pay-per-minute. Enhancement starts at $0.005/min.
|
|
523
|
+
|
|
524
|
+
### Adobe Podcast API (Enhance Speech)
|
|
525
|
+
|
|
526
|
+
Best for: Voice-only recordings, AI-powered studio-quality voice isolation.
|
|
527
|
+
|
|
528
|
+
```
|
|
529
|
+
Note: Adobe Podcast "Enhance Speech" is currently a web tool at podcast.adobe.com/enhance.
|
|
530
|
+
No public REST API as of 2025 — but Adobe is expanding API access through Firefly Services.
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
**Workaround for automation:** Use browser automation (Playwright) to upload/download through the web UI, or check Adobe's developer portal for API access updates.
|
|
534
|
+
|
|
535
|
+
---
|
|
536
|
+
|
|
537
|
+
## Quality Verification
|
|
538
|
+
|
|
539
|
+
### Measure Loudness (LUFS)
|
|
540
|
+
|
|
541
|
+
```bash
|
|
542
|
+
# Get full loudness stats
|
|
543
|
+
ffmpeg -i enhanced.mp3 -af loudnorm=I=-16:TP=-1.0:LRA=11:print_format=json -f null NUL 2>&1
|
|
544
|
+
|
|
545
|
+
# Quick measurement with ebur128
|
|
546
|
+
ffmpeg -i enhanced.mp3 -af ebur128=peak=true -f null NUL 2>&1
|
|
547
|
+
```
|
|
548
|
+
|
|
549
|
+
**What to check in the output:**
|
|
550
|
+
- `input_i` — Integrated loudness (should match your target, e.g., -16 LUFS)
|
|
551
|
+
- `input_tp` — True peak (should be below -1.0 dBTP)
|
|
552
|
+
- `input_lra` — Loudness range (5-10 for speech, 7-15 for music)
|
|
553
|
+
|
|
554
|
+
### Spectral Analysis
|
|
555
|
+
|
|
556
|
+
```bash
|
|
557
|
+
# Generate a spectrogram image
|
|
558
|
+
ffmpeg -i enhanced.mp3 -lavfi showspectrumpic=s=1920x1080:mode=combined:color=intensity:scale=log spectrogram.png
|
|
559
|
+
|
|
560
|
+
# Generate waveform image
|
|
561
|
+
ffmpeg -i enhanced.mp3 -lavfi showwavespic=s=1920x200:colors=0x1DB954 waveform.png
|
|
562
|
+
```
|
|
563
|
+
|
|
564
|
+
**What to look for in the spectrogram:**
|
|
565
|
+
- No visible horizontal lines at 50/60Hz (hum removed)
|
|
566
|
+
- No constant brightness in high frequencies (noise removed)
|
|
567
|
+
- Clean gaps between speech segments (silence trimming worked)
|
|
568
|
+
- Even brightness across the file (compression/normalization worked)
|
|
569
|
+
|
|
570
|
+
### A/B Comparison
|
|
571
|
+
|
|
572
|
+
```bash
|
|
573
|
+
# Create a side-by-side comparison file (original then enhanced)
|
|
574
|
+
ffmpeg -i original.wav -i enhanced.mp3 -filter_complex "[0:a][1:a]concat=n=2:v=0:a=1" ab_compare.wav
|
|
575
|
+
|
|
576
|
+
# Create a 5-second snippet comparison
|
|
577
|
+
ffmpeg -i original.wav -ss 30 -t 5 -c:a pcm_s16le snippet_before.wav
|
|
578
|
+
ffmpeg -i enhanced.mp3 -ss 30 -t 5 -c:a pcm_s16le snippet_after.wav
|
|
579
|
+
```
|
|
580
|
+
|
|
581
|
+
### Automated Quality Check (Node.js)
|
|
582
|
+
|
|
583
|
+
```javascript
|
|
584
|
+
import ffmpeg from 'fluent-ffmpeg';
|
|
585
|
+
|
|
586
|
+
function measureLoudness(filePath) {
|
|
587
|
+
return new Promise((resolve, reject) => {
|
|
588
|
+
let stderr = '';
|
|
589
|
+
ffmpeg(filePath)
|
|
590
|
+
.audioFilters('loudnorm=I=-16:TP=-1.0:LRA=11:print_format=json')
|
|
591
|
+
.format('null')
|
|
592
|
+
.output('/dev/null') // Use 'NUL' on Windows
|
|
593
|
+
.on('stderr', (line) => { stderr += line + '\n'; })
|
|
594
|
+
.on('end', () => {
|
|
595
|
+
// Extract JSON from FFmpeg stderr output
|
|
596
|
+
const jsonMatch = stderr.match(/\{[\s\S]*?"input_i"[\s\S]*?\}/);
|
|
597
|
+
if (jsonMatch) {
|
|
598
|
+
const stats = JSON.parse(jsonMatch[0]);
|
|
599
|
+
resolve({
|
|
600
|
+
lufs: parseFloat(stats.input_i),
|
|
601
|
+
truePeak: parseFloat(stats.input_tp),
|
|
602
|
+
lra: parseFloat(stats.input_lra),
|
|
603
|
+
threshold: parseFloat(stats.input_thresh),
|
|
604
|
+
});
|
|
605
|
+
} else {
|
|
606
|
+
reject(new Error('Could not parse loudness data'));
|
|
607
|
+
}
|
|
608
|
+
})
|
|
609
|
+
.on('error', reject)
|
|
610
|
+
.run();
|
|
611
|
+
});
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
// Usage
|
|
615
|
+
const stats = await measureLoudness('enhanced.mp3');
|
|
616
|
+
console.log(`LUFS: ${stats.lufs}, True Peak: ${stats.truePeak} dBTP, LRA: ${stats.lra} LU`);
|
|
617
|
+
|
|
618
|
+
// Validation
|
|
619
|
+
const isGood =
|
|
620
|
+
stats.lufs >= -17 && stats.lufs <= -15 && // Within 1 LUFS of target
|
|
621
|
+
stats.truePeak <= -0.5 && // Below true peak limit
|
|
622
|
+
stats.lra >= 3 && stats.lra <= 15; // Reasonable dynamic range
|
|
623
|
+
|
|
624
|
+
console.log(isGood ? 'PASS — audio meets spec' : 'WARN — check levels');
|
|
625
|
+
```
|