Files
xiaoxia-saas/packages/domain/preset_bgm.py
T
xiaoxia 3cd26e98db
CI/CD Pipeline / Validate Code Quality And Tests (push) Successful in 43s
CI/CD Pipeline / Unit Tests (push) Successful in 1m35s
CI/CD Pipeline / Frontend Lint (push) Successful in 1m37s
CI/CD Pipeline / Build Production Runtime Images (push) Has been skipped
CI/CD Pipeline / Deploy Production (push) Has been skipped
CI/CD Pipeline / Production Browser E2E (push) Has been skipped
CI/CD Pipeline / Integration Tests (push) Has been cancelled
CI/CD Pipeline / Build & Push Staging (Watchtower auto-deploy) (push) Has been cancelled
CI/CD Pipeline / Staging E2E Tests (push) Has been cancelled
CI/CD Pipeline / Staging API Integration Tests (push) Has been cancelled
feat: BGM音轨混音能力(音量/淡入淡出/人声闪避/预设BGM库) (#291)
2026-07-14 10:37:24 +08:00

161 lines
5.2 KiB
Python
Executable File

"""预设 BGM 库 — 免费可商用背景音乐清单.
按风格分类,存储在 OSS 或 CDN 上。
实际音频文件由运维统一上传,这里只维护元数据清单。
"""
from __future__ import annotations
from dataclasses import dataclass, field
@dataclass(frozen=True)
class PresetBGM:
"""预设 BGM 条目"""
id: str
name: str
style: str # 风格分类:upbeat/relax/tech/commerce/emotional/cinematic
duration: float # 时长(秒)
artist: str = ""
description: str = ""
tags: list[str] = field(default_factory=list)
audio_url: str = "" # CDN/OSS 地址,空字符串表示待部署
# ── 预设库清单 ────────────────────────────────────────────────────────────────
PRESET_BGM_LIBRARY: list[PresetBGM] = [
# 轻快 upbeat
PresetBGM(
id="bgm_upbeat_001",
name="阳光清晨",
style="upbeat",
duration=120.0,
artist="免费商用音乐库",
description="轻快明亮的吉他+钢琴,适合vlog、生活记录",
tags=["轻快", "阳光", "吉他", "vlog"],
),
PresetBGM(
id="bgm_upbeat_002",
name="活力节拍",
style="upbeat",
duration=95.0,
artist="免费商用音乐库",
description="电子鼓点+合成器,节奏明快,适合运动、产品展示",
tags=["轻快", "电子", "活力", "运动"],
),
PresetBGM(
id="bgm_upbeat_003",
name="夏日漫步",
style="upbeat",
duration=110.0,
artist="免费商用音乐库",
description="Ukulele+口哨,轻松愉悦,适合旅行、美食",
tags=["轻快", "夏日", "ukulele", "旅行"],
),
# 治愈 relax
PresetBGM(
id="bgm_relax_001",
name="静谧时光",
style="relax",
duration=180.0,
artist="免费商用音乐库",
description="温柔钢琴独奏,治愈系,适合读书、冥想",
tags=["治愈", "钢琴", "安静", "冥想"],
),
PresetBGM(
id="bgm_relax_002",
name="雨后森林",
style="relax",
duration=150.0,
artist="免费商用音乐库",
description="自然白噪音+轻柔吉他,放松减压",
tags=["治愈", "自然", "放松", "环境音"],
),
PresetBGM(
id="bgm_relax_003",
name="月光奏鸣曲",
style="relax",
duration=200.0,
artist="古典音乐(公版)",
description="贝多芬经典钢琴作品,公版免费",
tags=["治愈", "古典", "钢琴", "优雅"],
),
# 科技 tech
PresetBGM(
id="bgm_tech_001",
name="未来科技",
style="tech",
duration=85.0,
artist="免费商用音乐库",
description="电子合成器+科技鼓点,适合数码产品、科技解说",
tags=["科技", "电子", "未来感", "数码"],
),
PresetBGM(
id="bgm_tech_002",
name="数据脉冲",
style="tech",
duration=100.0,
artist="免费商用音乐库",
description="极简电子节奏,适合数据分析、AI类视频",
tags=["科技", "极简", "数据", "AI"],
),
# 电商 commerce
PresetBGM(
id="bgm_commerce_001",
name="心动时刻",
style="commerce",
duration=75.0,
artist="免费商用音乐库",
description="时尚动感节奏,适合商品展示、带货视频",
tags=["电商", "时尚", "动感", "带货"],
),
PresetBGM(
id="bgm_commerce_002",
name="品质生活",
style="commerce",
duration=90.0,
artist="免费商用音乐库",
description="高级感轻音乐,适合品牌宣传、高端产品",
tags=["电商", "高端", "品牌", "品质"],
),
]
# ── 风格分类字典 ──────────────────────────────────────────────────────────────
BGM_STYLES: dict[str, str] = {
"upbeat": "轻快",
"relax": "治愈",
"tech": "科技",
"commerce": "电商",
"emotional": "情感",
"cinematic": "电影",
}
# ── 工具函数 ──────────────────────────────────────────────────────────────────
def get_preset_bgm(bgm_id: str) -> PresetBGM | None:
"""按 ID 获取预设 BGM。"""
for bgm in PRESET_BGM_LIBRARY:
if bgm.id == bgm_id:
return bgm
return None
def list_preset_bgm_by_style(style: str) -> list[PresetBGM]:
"""按风格筛选预设 BGM。"""
return [bgm for bgm in PRESET_BGM_LIBRARY if bgm.style == style]
def search_preset_bgm(keyword: str) -> list[PresetBGM]:
"""按关键词搜索预设 BGM(名称+标签+描述)。"""
kw = keyword.lower()
results = []
for bgm in PRESET_BGM_LIBRARY:
if kw in bgm.name.lower() or kw in bgm.description.lower() or any(kw in tag.lower() for tag in bgm.tags):
results.append(bgm)
return results