README.md 9.19 KB

music_analyze_v2

当前项目是一个基于 Excel 批量跑音频标签分析的独立流水线。

实际主流程:

  1. 读取输入 xlsx
  2. 从指定 URL 列取音频地址
  3. 透传部分元数据给音乐分析器
  4. 调用 app.middleware.music_analyze.analyze_music(...)
  5. 将结果整理成固定交付列并持续写回输出 xlsx
  6. 通过已有输出文件和 checkpoint 支持断点续跑

当前批处理入口是 pipeline/batch_analyze_xlsx.py

当前状态

说明:

  • 命令行参数里虽然还保留了 --provider doubao 选项,但当前 factory.py 只实例化 qwen,传 doubao 会在运行时失败。
  • README 以下内容按“当前代码实际行为”描述,而不是按历史规划描述。

安装

python3.10 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env

环境变量

最小必需配置通常是:

QWEN_API_KEY=your_api_key
QWEN_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
QWEN_MODEL=qwen3-omni-flash
QWEN_TIMEOUT=15
QWEN_LYRICS_TIMEOUT=90
QWEN_MAX_RETRIES=3

项目还支持以下可选增强能力:

  • QWEN_DASHSCOPE_API_KEY:部分 DashScope/ASR 路径会用到
  • SONGFORMER_URL:启用额外音频结构特征
  • MUSIC_LYRICS_ASR_BACKENDDASHSCOPE_*:歌词提取相关配置
  • OSS_*:音频过大时走 OSS 降级上传

配置定义见 app/core/config.py

输入要求

输入文件必须是 xlsx

至少需要一列音频地址。脚本按下面顺序解析 URL 列:

  • 显式传入的 --url-column
  • URL
  • url
  • cos访问地址
  • cos_url
  • audio_url

若整行 URL 为空:

  • 不会发起分析
  • 该行会被直接跳过
  • 在断点续跑里会被视为已处理

元数据不是必填,但建议提供。脚本会优先识别这些字段:

  • 歌曲ID / song_id / id
  • tmeid / tmeID / TMEID
  • 歌曲名 / 歌曲名称 / title
  • 表演者 / 歌手 / artist
  • 歌曲时长 / duration

默认会额外透传这些列给模型作为 metadata:

  • tmeID,歌曲名称,歌曲名,歌手,表演者,版本,词作者,曲作者

可通过 --metadata-columns 覆盖。

快速开始

常规跑批:

python pipeline/batch_analyze_xlsx.py \
  --input 待分析.xlsx \
  --output outputs/标签交付结果.xlsx \
  --url-column URL \
  --provider qwen \
  --workers 3

提取歌词:

python pipeline/batch_analyze_xlsx.py \
  --input 待分析.xlsx \
  --output outputs/标签交付结果.xlsx \
  --url-column URL \
  --provider qwen \
  --workers 3 \
  --extract-lyrics

从头重跑,不复用历史输出或 checkpoint:

python pipeline/batch_analyze_xlsx.py \
  --input 待分析.xlsx \
  --output outputs/标签交付结果.xlsx \
  --provider qwen \
  --no-resume

命令行参数

参数 说明 当前实际行为
--input 输入 Excel 路径 必填
--output 输出 Excel 路径 必填
--checkpoint checkpoint 文件路径 默认是 <output>.checkpoint.json
--url-column URL 列名 默认 URL,不存在时会自动 fallback
--provider 分析 provider 参数允许 qwen/doubao,当前实际只应使用 qwen
--extract-lyrics 是否提取歌词 开启后会走带歌词分析路径
--label-level 标签级别 01
--metadata-columns 额外透传给模型的列 逗号分隔
--workers 并发线程数 默认 3
--checkpoint-every 每处理多少行保存一次 默认 10
--no-resume 禁用断点续跑 默认关闭

输出结构

脚本输出的是固定交付表,不是“原始输入列 + 分析列”的全量回写。

当前输出列定义在 batch_analyze_xlsx.pyDEFAULT_OUTPUT_COLUMNS

  • tmeid
  • 歌曲ID
  • 歌曲名
  • 表演者
  • 歌曲时长
  • 表演者类型
  • 语种
  • BPM速度
  • 情绪
  • 网络/抖音歌曲
  • 音乐风格
  • 配器
  • 场景

结果字段映射规则:

  • 表演者类型 <- performer_typevocal_texture
  • 语种 <- language
  • BPM速度 <- bpm
  • 情绪 <- emotion
  • 网络/抖音歌曲 <- douyin_tags
  • 音乐风格 <- music_style_tags,否则回退到 genre/sub_genre
  • 配器 <- instrument_tags
  • 场景 <- scene

列表型字段会被拼成 分隔字符串。

断点续跑

当前断点续跑逻辑比 README 旧版描述更具体,实际行为如下:

  • 如果输出文件已存在,且行数与本次输入一致: 直接按行号复用历史输出
  • 如果输出文件已存在,但行数不一致: 尝试按 歌曲IDtmeid 复用旧结果
  • 如果 checkpoint 存在: 会在“输出按索引对齐”的前提下合并 checkpoint 完成状态
  • 空 URL 行会直接加入 completed 集合
  • 处理中按 --checkpoint-every 周期性落盘
  • Ctrl+C 时会先保存当前进度,再强制退出避免卡住线程

默认 checkpoint 文件名:

<output>.checkpoint.json

提示词与分析链路

批处理脚本本身不直接读取 prompt 文件,而是走统一分析入口:

pipeline/batch_analyze_xlsx.py -> app/middleware/music_analyze/__init__.py -> app/middleware/music_analyze/music_analyzer.py -> app/middleware/music_analyze/factory.py -> app/middleware/music_analyze/qwen_analyzer.py -> app/middleware/music_analyze/prompts.py

当前 prompt 目录固定为:

项目结构

music_analyze_v2/
├── app/
│   ├── core/
│   │   └── config.py
│   ├── middleware/
│   │   └── music_analyze/
│   │       ├── __init__.py
│   │       ├── base.py
│   │       ├── factory.py
│   │       ├── music_analyzer.py
│   │       ├── prompts.py
│   │       ├── qwen_analyzer.py
│   │       ├── doubao_analyzer.py
│   │       ├── audio_features.py
│   │       └── bpm_analyzer_tools.py
│   ├── prompts/
│   │   └── step2_music_decode/
│   └── utils/
├── pipeline/
│   └── batch_analyze_xlsx.py
├── outputs/
├── requirements.txt
├── .env
├── .env.example
└── README.md

依赖

基础依赖见 requirements.txt

当前显式包含:

  • openai
  • requests
  • httpx
  • python-dotenv
  • pydantic-settings
  • numpy
  • scipy
  • librosa
  • soundfile
  • pandas
  • openpyxl

dashscoperequirements.txt 中仍是注释状态;如果你要跑依赖该 SDK 的歌词路径,需要自行安装并校验对应代码分支。

常见问题

为什么传了 --provider doubao 还是失败?

因为当前 CLI 还保留了 doubao 选项,但分析器工厂只支持 qwen。这是代码现状,不是使用方式问题。

输出为什么没有保留原 Excel 的全部列?

因为当前脚本在保存时只写 DEFAULT_OUTPUT_COLUMNS,这是代码的固定行为。

修改提示词应该改哪里?

app/prompts/step2_music_decode 下的模板文件即可。

行数变了还能续跑吗?

可以部分复用。脚本会尝试按 歌曲IDtmeid 匹配历史输出。

如何完全重跑?

--no-resume,并删除旧输出和旧 checkpoint,最干净。