Skip to content

dieWehmut/music-converter

Repository files navigation

Music Converter

简体中文 | 繁體中文 | English | 日本語


目录

展开/收起

项目简介

Music Converter 是一套端到端的音乐情绪/风格转换实验项目。用户上传受支持的音频(WAV、MP3 等),系统先解析其风格与情绪特征,再依据目标风格与情绪生成新的编曲。前端由 Vue 3 + Vite 驱动,后端使用 FastAPI,对接深度学习推理管线。

项目背景

随着数字音乐产业的蓬勃发展,用户对音乐个性化改编的需求日益增长。传统音乐风格往往依赖专业音乐人手动创作,成本高、周期长,难以满足普通用户快速变化的多样化需求。尤其在风格迁移与情绪转换场景中,需要同时兼顾原曲旋律特征与目标风格的融合,传统人工制作方式难以高效实现批量处理。

本项目旨在通过深度学习技术,构建一套自动化的音乐情绪与风格转换系统,核心解决三大痛点:

  • 1.技术门槛高:借助 YAMNet 模型的音频特征提取能力(通过 backend/features/yamnet_extract.py 封装实现)和 MusicGen 的音乐生成能力,让非专业用户无需掌握音乐理论即可完成风格转换。

  • 2.处理效率低:通过 backend/inference/full_pipeline.py 中的 FullMusicPipeline 类实现分析 - 生成全流程自动化,将传统需要数小时的编曲工作缩短至分钟级。

  • 3.效果不稳定:引入 backend/inference/evaluate_generated.py 中的评估体系,从风格增益、情绪增益、原始风格脱离度等多维度量化转换效果,确保输出质量。

系统融合前端交互(核心界面 、后端 API 服务与深度学习推理 pipeline,既实现了对音频处理与生成技术的工程化落地,也为音乐创意表达提供了新的技术范式。

功能亮点

  • 多格式支持:上传 WAV/MP3(或任何 librosa 支持的格式)并直接在浏览器中试听。
  • 智能分析:运行风格与情绪识别模型(YAMNet + 自定义分类器),返回概率分布,方便可视化与后续决策。
  • 生成式转换:选择目标风格/情绪后,触发异步音乐生成任务(基于 MusicGen),完成后可下载或播放结果。
  • 智能队列系统:后端内置优先级队列,短任务(<20s)自动插队优先处理,长任务后台排队。
  • 长音频支持:通过自动化切片与拼接技术,突破 MusicGen 的 30s 生成限制,支持任意长度音频。
  • 持久化体验:前端使用 IndexedDB 缓存上传与任务状态,刷新页面也不会丢失。

技术实现

主要内容

  • 前端frontend/):核心界面 src/views/Home.vue,负责上传音频、渲染任务进度、展示结果,并提供目标风格与情绪的选择控件。
  • 后端backend/):server.py 提供 API、管理后台任务,并加载 backend/inference/full_pipeline.pyFullMusicPipeline,支持风格与情绪的分析与生成。
  • 模型栈:PyTorch (MusicGen)、TensorFlow (YAMNet)、Transformers、librosa 等依赖列于 backend/requirements.txt

核心功能

本项目不仅调用了先进的开源模型,更在工程化落地层面进行了大量的定制开发。以下是关键模块的深度解读:

业务管线与长音频突破

文件: backend/inference/full_pipeline.py 核心价值: 解决生成式模型(如 MusicGen)无法处理长音频的硬伤。通过独创的 "Slice-Gen-Stitch"(切片-生成-缝合) 机制,实现任意长度音频的风格迁移。

# 核心逻辑:突破 30s 限制的动态分片生成
for i in range(total_segments):
    # 1. 智能切片:基于采样率切分当前 30s 窗口
    y_seg = y_full[start_sample:end_sample]
    
    # 2. 局部特征提取:提取该片段的旋律线 (Melody Extraction)
    seg_melody_path = self.melody_extractor.extract_melody_to_wav(..., y_seg)

    # 3. 引导生成:将 Prompt 与局部旋律结合,驱动 MusicGen 生成
    self.music_gen.generate_with_melody(
        prompt=prompt,
        melody_path=str(seg_trans_path),
        target_seconds=seg_duration  # 动态适配片段时长
    )
    
    # 4. 结果收集与拼接
    full_generated_audio.append(y_gen_seg)

# 5. 无缝缝合:合并所有片段
final_y = np.concatenate(full_generated_audio)

生成引擎与信号修复

文件: backend/inference/generate_music.py 核心价值: 封装 MusicGen 推理过程,并内置后处理算法,自动检测并修复生成音频中常见的“能量塌陷”(Mid-collapse)问题。

# 核心逻辑:基于 RMS 能量检测的信号修复算法
@staticmethod
def _mid_collapse_fix(audio, sr):
    N = len(audio)
    # 对比中段与后段的能量均方根 (RMS)
    rms_a = np.sqrt(np.mean(audio[N//3 : N//2]**2))
    rms_b = np.sqrt(np.mean(audio[N//2 : 2*N//3]**2))

    # 异常检测:如果后半段能量骤降 (<33%),判定为崩坏
    if rms_a > 1e-5 and rms_b < rms_a * 0.33:
        print("[MusicGen] Mid collapse detected -> fixing...")
        # 修复策略:利用前半段音频进行加权 Crossfade 补全
        fixed = 0.7 * audio[N//3 : N//2][:len(b)] + 0.3 * audio[N//2 : 2*N//3]
        audio[N//2 : N//2+len(fixed)] = fixed
    
    return audio

提示词工程 (Prompt Engineering)

文件: backend/inference/prompt_builder.py 核心价值: 这是一个“翻译官”模块。它将冷冰冰的数字信号特征(如 Hook 强度、音域跨度)翻译为大语言模型能理解的自然语言描述,实现“数据驱动的 Prompt 构建”。

# 核心逻辑:将量化评分映射为语义描述
def describe_hook(self, hook_score):
    if hook_score > 0.45:
        return "a memorable melodic hook"      # 强记忆点
    elif hook_score > 0.25:
        return "a mildly recognizable hook"    # 中等记忆点
    else:
        return "a simple motif"                # 弱记忆点

def build_prompt(self, melody_info, style, ...):
    # 动态组装:结合旋律特征与目标风格
    return f"""
    ### Melody Characteristics
    - {self.describe_pitch_range(melody_info["pitch_range"])}
    - {self.describe_hook(melody_info["hook_score"])}
    
    ### Target Style
    Rewrite the music into **{style}** style.
    """

自研评估模型训练流水线 (The "Judge" Training)

为了实现对生成结果的客观评价,我们没有直接使用通用的预训练模型分类结果,而是构建并训练了专属的轻量级分类器(.pkl 模型)。这些模型构成了系统的“质检闭环”。

数据集构建与增强 (Data Augmentation)

我们并没有直接使用原始音频,而是构建了一个包含大量 30秒标准片段 的增强数据集,以模拟真实生成环境下的各种变体。

  • 数据源:
    • 情绪数据: MUSGEN-EmoMusic (通过 backend/dataset/download_emomusic.py 自动拉取)
    • 风格数据: GTZAN Genre Collection
  • 数据增强脚本: training/augment_emotion.py 为了提高模型的鲁棒性,我们将每一条原始音频裂变为 5 条变体,模拟生成过程中可能出现的音质损耗或速度变化:
    # 增强策略 (1 -> 5)
    enhanced.append(data)                       # 1. 原始音频
    enhanced.append(speed_change(data, 0.9))    # 2. 慢速变体
    enhanced.append(speed_change(data, 1.1))    # 3. 快速变体
    enhanced.append(add_noise(data))            # 4. 加噪变体 (模拟生成底噪)
    enhanced.append(pitch_shift(data))          # 5. 移调变体
  • 产出: backend/dataset/emomusic_aug/ 下成千上万个增强后的 30s 音频切片。

双路特征工程 (Feature Engineering)

我们针对“情绪”和“风格”采用了两种截然不同的特征提取策略,以捕捉不同维度的音频信息。

A. 情绪特征:深度语义嵌入 (Deep Embeddings)

  • 脚本: training/extract_emotion_embedding.py
  • 核心技术: 使用 Google 的 YAMNet (CNN架构) 作为特征提取器。
  • 逻辑: 我们不使用 YAMNet 的分类结果,而是提取其倒数第二层的 1024维 Embedding 向量。这代表了音频在深度语义空间中的位置。
  • 输出: emotion_dataset.json (高维向量数据库)。

B. 风格特征:传统信号处理 (DSP Features)

  • 脚本: training/build_style_dataset.py
  • 核心技术: 使用 Librosa 库提取 68维 经典的数字信号特征。
  • 特征详解:
    • 物理特征: 节奏 (Tempo), 能量 (RMS), 亮度 (Spectral Centroid)
    • 和声特征: 12维色度 (Chroma), 6维音调网络 (Tonnetz)
    • 音色特征: 40维梅尔频谱均值 (Mel), 7维频谱对比度 (Contrast)
  • 输出: style_dataset.json (结构化特征表)。

分类器训练 (XGBoost)

最后,我们使用 XGBoost 算法在上述自定义数据集上训练分类器。这些模型体积小(KB级别)、推理速度极快,非常适合在 API 中实时运行。

  • 情绪模型训练: training/train_emotion_model.py
    • 输入:1024维 YAMNet 向量
    • 输出:emotion_model.pkl (用于判断 Happy/Sad/Angry/Scary...)
  • 风格模型训练: training/train_style_model.py
    • 输入:68维 Librosa 特征
    • 输出:style_model.pkl (用于判断 Rock/Jazz/Pop...)

💡 总结: 项目中的 .pkl 文件并非简单的第三方模型权重,而是我们基于 5倍数据增强、结合深度特征与传统信号特征、自主训练得到的专用评估模型


规则驱动生成:参数大脑 (Param Brain)

在传统的 DSP 生成路径中,我们需要一个“大脑”将抽象的情绪标签转化为具体的编曲参数。

文件: backend/dsp/style_accompaniment/brain/rock_params_ai.py 功能: 充当“AI 制作人”,基于乐理规则库进行决策。

# 示例:当输入情绪为 "Angry" 时,大脑的决策逻辑
if emotion == "angry":
    guitar = {
        "riff_density": 0.95,      # 极高密度的吉他 Riff
        "distortion": 0.9,         # 高失真度
        "palm_mute": True,         # 使用闷音技巧
    }
    drums = {
        "double_kick": True,       # 启用双踩底鼓
        "loop_energy": 1.0,        # 满能量鼓点
    }
    # 调式选择:使用 E小调 构建压抑感
    scale = "E minor" 

该模块确保了非深度学习生成的伴奏依然具有极强的音乐性和风格准确度。

目录概览

结构图

graph LR
    %% =======================
    %% 1. 样式定义 (扁平化配色)
    %% =======================
    classDef vue fill:#e3f2fd,stroke:#1565c0,stroke-width:2px,color:#000,rx:5,ry:5
    classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px,color:#000,rx:5,ry:5
    classDef core fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px,color:#000,rx:5,ry:5
    classDef data fill:#f3e5f5,stroke:#6a1b9a,stroke-width:2px,stroke-dasharray: 5 5,color:#000
    classDef file fill:#fff8e1,stroke:#f9a825,stroke-width:2px,stroke-dasharray: 5 5,color:#000

    %% =======================
    %% 2. 节点定义
    %% =======================
    
    %% 前端节点
    Client("💻 Vue Frontend<br>(User / Browser)"):::vue

    subgraph Backend [⚙️ FastAPI Backend System]
        direction LR

        %% --- 第一列:API 接口 ---
        subgraph Col_API [Interface]
            direction TB
            API_Feat["POST /features<br>(同步分析)"]:::api
            API_Conv["POST /convert<br>(异步触发)"]:::api
            API_Get["GET /tasks & /file<br>(轮询/下载)"]:::api
        end

        %% --- 第二列:核心逻辑 (已更新文案) ---
        subgraph Col_Logic [Core Logic]
            direction TB
            %% 明确 YAMNet 提取特征,XGBoost 分类
            Analyzer["Analyzer Module<br>(YAMNet: Extract)<br>(XGBoost: Classify)"]:::core
            %% 明确 MusicGen 进行生成
            MusicGen["MusicGen Engine<br>(Transformer)<br>Audio Generation"]:::core
        end

        %% --- 第三列:资源数据 ---
        subgraph Col_Data [Resources]
            direction TB
            Models[("Model Files<br>(.pkl)")]:::data
            WavFiles[("Generated Audio<br>(.wav)")]:::file
        end
    end

    %% =======================
    %% 3. 布局与连线
    %% =======================

    %% --- 内部垂直对齐 (防止框变形) ---
    API_Feat ~~~ API_Conv ~~~ API_Get
    Analyzer ~~~ MusicGen
    Models ~~~ WavFiles

    %% --- 核心交互连线 ---
    
    %% 1. 上路:分析流
    Client <==> |"1. Upload"| API_Feat
    API_Feat <--> |"Extract Features"| Analyzer
    Models -.-> |"Load Models"| Analyzer

    %% 2. 中路:生成流
    Client --> |"2. Start"| API_Conv
    API_Conv --> |"Trigger"| MusicGen
    Models -.-> |"Load Weights"| MusicGen
    MusicGen --> |"Save File"| WavFiles

    %% 3. 下路:下载流
    Client -.-> |"3. Poll / Get"| API_Get
    WavFiles -.-> |"Stream"| API_Get

    %% --- 强制对齐 (Vue 垂直居中锚点) ---
    Client ~~~ API_Conv
Loading

目录架构

music-converter/
├── backend/
│   ├── server.py — FastAPI 应用入口,定义路由、CORS、任务队列与文件输出路径
│   ├── requirements.txt — 环境依赖
│   ├── ...
│   ├── datasets/ — 数据集管理与存储目录
│   ├── dsp/ — 数字信号处理与基于采样的伴奏生成系统 (方向A的核心)
│   ├── training/ — 轻量级分类模型 (XGBoost) 的训练流水线
│   ├── features/ — 音频特征提取相关代码目录
│   │   └── yamnet_extract.py — 封装 YAMNet,提供 embedding 与类别概率提取
│   ├── inference/ — 推理与生成管线核心模块(分析 → 提示 → 生成 → 后处理)
│   │   ├── ...
│   │   ├── full_pipeline.py — 协调分析、提示构建与生成的高阶类
│   │   ├── generate_music.py — 与 MusicGen 交互,加载模型并保存生成音频
│   │   └── prompt_builder.py — 构建传给 MusicGen 的 prompt
│   ├── models/ — 模型存放(可离线放置模型权重)
│   └── utils/ — 各类辅助函数
├── frontend/
│   ├── ...
│   └── src/ — 核心前端代码
│       ├── ...
│       └──api/
│          ├── index.js — API 基础客户端,配置 `baseURL` 与统一请求封装
│          ├── emotion.js — 封装获取情绪标签的调用
│          └── upload.js — 封装文件上传、启动转换与查询任务状态的 API
├── ...
├── Colab-music-converter.ipynb — Colab 测试用
├── Dockerfile — Docker 配置
└── README.md — 项目说明文档

环境要求

  • 操作系统:Windows / macOS / Linux (推荐 Ubuntu 22.04)。
  • Node.js^20.19.0>=22.12.0
  • Python:3.10 及以上(强烈推荐使用 Conda 管理)。
  • 硬件
    • 内存:建议 16GB 以上(同时加载 TF 和 PyTorch 模型较耗内存)。
    • GPU:支持 CUDA 的 NVIDIA 显卡(8GB+ 显存),以便秒级完成生成任务。纯 CPU 亦可运行但较慢。
  • 系统工具:FFmpeg(必须安装,用于音频处理)。

本地开发指南

后端设置

请先准备好 Python 3.10+ 环境(推荐使用 Conda)。

步骤 1:创建并激活环境

cd backend
conda create -n mc-env python=3.10 -y
conda activate mc-env

预期输出:终端前缀变为 (mc-env)

步骤 2:安装系统级依赖 (FFmpeg)

MusicGen 和 Librosa 处理音频必须依赖 FFmpeg。

  • Windows: 下载 FFmpeg exe 并添加到环境变量 PATH。
  • macOS: brew install ffmpeg
  • Ubuntu/Debian:
    sudo apt update && sudo apt install -y ffmpeg git libsndfile1

步骤 3:安装 Python 依赖

pip install -r requirements.txt

预期输出:显示 Successfully installed torch... tensorflow... 等信息,无红色报错。

步骤 4:启动后端服务

根据你的操作系统选择命令。

  • Windows (CMD / PowerShell):

    # [可选] 启用 DEV 模式 (跳过模型加载,适合无 GPU 调试前端交互)
    set MC_DEV_MODE=1
    # 启动服务
    uvicorn backend.server:app --host 0.0.0.0 --port 8000 --reload
  • macOS / Linux:

    # [可选] 启用 DEV 模式
    export MC_DEV_MODE=1
    # 启动服务
    uvicorn backend.server:app --host 0.0.0.0 --port 8000 --reload

预期输出

INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
INFO:     Application startup complete.
INFO:     🚀 Priority Worker started! ...

前端设置

确保已安装 Node.js (v20+)。

步骤 1:安装依赖

cd frontend
npm install

步骤 2:启动开发服务器

npm run dev

预期输出

VITE v5.x.x  ready in 300 ms
➜  Local:   http://localhost:5173/

本地联调与故障排查

  1. 浏览器访问:打开 http://localhost:5173
  2. 健康检查:在浏览器或 Postman 访问 http://localhost:8000/health,应返回 "ok"
  3. 常见问题
    • CORS 错误:如果前端报错 Network Error,检查 backend/server.py 中的 allow_origins 列表是否包含 http://localhost:5173
    • 模型下载慢:设置环境变量 HF_ENDPOINT=https://hf-mirror.com
    • libsndfile 报错:说明系统缺少音频库,请重新检查步骤 2的系统依赖安装。

部署运维指南

Docker部署 (推荐)

本项目提供了标准的 Dockerfile,支持一键构建,环境隔离,最为推荐。

步骤 1:构建镜像

请在项目根目录(即包含 Dockerfile 的目录)下执行:

# 注意最后有一个点 "."
docker build -t music-converter:v1 -f Dockerfile .

预期输出:构建过程会安装 ffmpeg 和 python 依赖,最后显示 Successfully tagged music-converter:v1

步骤 2:运行容器

# 基础运行 (默认配置)
docker run -d -p 8000:8000 --name mc-server music-converter:v1

# 进阶运行 (启用长音频 + 挂载模型缓存 + 使用 GPU)
# 需先安装 nvidia-container-toolkit
docker run -d \
  -p 8000:8000 \
  --gpus all \
  -e MC_ENABLE_LONG_AUDIO=1 \
  -v ~/.cache/huggingface:/root/.cache/huggingface \
  --name mc-server \
  music-converter:v1

步骤 3:验证 查看日志确保服务启动成功:

docker logs -f mc-server

Colab运行

适合没有本地显卡的用户,利用 Google 免费 T4 GPU。

  1. 点击页面顶部的 Open in Colab 徽章。
  2. 在 Colab 中,你需要一个 Ngrok Authtoken
  3. 按顺序执行 Notebook 单元格
    • Step 1: 拉取代码。
    • Step 2: 安装依赖。
    • Step 3: 填入 Token 并启动。
  4. 复制输出的 Public URL (如 https://xxxx.ngrok-free.app) 到前端配置中。

传统服务器部署 (Nginx + Nohup)

步骤 1:启动后端

cd /path/to/music-converter
source backend/venv/bin/activate
# 后台运行,日志输出到 server.log
nohup python3 -m uvicorn backend.server:app --host 0.0.0.0 --port 8000 > server.log 2>&1 &

步骤 2:配置 Nginx 反向代理

编辑 /etc/nginx/conf.d/music.conf

server {
    listen 80;
    server_name api.your-domain.com;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        # 关键:允许 100MB 上传,防止大音频被 Nginx 拦截
        client_max_body_size 100M;
        # 防止生成时间过长导致 Nginx 504 超时
        proxy_read_timeout 300s;
    }
}

前端构建部署

步骤 1:构建

cd frontend
# 确保 .env 或构建环境中 VITE_API_BASE 指向你的后端地址
npm run build

步骤 2:静态托管

frontend/dist 目录下的所有文件上传至 Nginx 的 /var/www/html 或部署到 Vercel/Netlify。

部署故障排查

  • 413 Payload Too Large
    • 原因:上传的音频超过了 Nginx 默认限制(1MB)。
    • 解决:在 Nginx 配置中添加 client_max_body_size 100M;
  • SoundFileError: System error
    • 原因:Docker 或 Linux 环境下路径解析问题。
    • 解决:本项目代码已在 server.py 中强制使用 .resolve() 绝对路径,请确保 Docker 容器有写入 backend/output 的权限。
  • 任务一直处于 queued 状态
    • 原因:后台 Worker 正在处理其他耗时任务(单线程消费者)。
    • 解决:耐心等待,或在 server.py 中增加 Worker 线程数(仅限显存充足时)。

API 接口文档

核心接口

功能 方法 路径 参数 (Form Data) 返回示例
健康检查 GET /health "ok"
获取风格 GET /api/styles {"styles": ["rock", "pop", ...]}
特征分析 POST /api/features file: (Binary) {"style": "rock", "emotion": "happy", ...}
提交任务 POST /api/convert file: (Binary)
style: (String)
emotion: (String)
{"task_id": "uuid...", "status": "queued"}
查询状态 GET /api/tasks/{id} {"status": "processing", "msg": "..."}
下载结果 GET /api/tasks/{id}/download 二进制 WAV 文件流

异步任务机制

为了防止长音频生成阻塞服务器,本项目采用 异步轮询 机制:

  1. 提交:前端调用 /api/convert,后端将任务放入 PriorityQueue,立即返回 task_id
  2. 排队:后台 Worker 线程根据优先级(短任务优先)依次取出任务执行。
  3. 轮询:前端每隔 2秒 调用 /api/tasks/{id} 查询状态。
    • queued: 排队中
    • processing: 生成中
    • success: 完成,前端自动调用下载接口
    • failed: 报错,前端展示错误信息

环境变量配置

backend/server.py 或 Docker 启动时可配置:

变量名 默认值 说明
MC_DEV_MODE 0 设为 1 开启开发模式,API 返回 Mock 数据,不加载模型(极速启动)。
MC_ENABLE_LONG_AUDIO 0 设为 1 允许 >20s 音频(以降级优先级处理)。设为 0 则直接拒绝长任务并返回 400。
HF_ENDPOINT https://hf-mirror.com Hugging Face 镜像地址,国内服务器必须配置。

价值与展望

从“听觉”到“理解”:精准的提示词构建体系

不同于传统方法只依赖用户输入的简单关键词(如“生成一首摇滚”),本项目的创新在于让 AI 先“听懂”原曲。

  • 创新点:我们构建了一套音频特征翻译机制。系统会首先对原曲进行深度扫描,提取出音域跨度、旋律走向、节奏强弱等关键特征。
  • 具体实现:这些物理特征不会被直接丢弃,而是被动态“翻译”成自然语言描述(Prompt)。例如,当系统检测到原曲旋律起伏很大时,会自动生成“具有表现力的宽音域”这样的指令喂给生成模型。这意味着,AI 不是在瞎编,而是在严格遵循原曲的骨架进行再创作,从而保证了生成结果与原曲的神似。

自动化“质检员”与闭环迭代

目前市面上的生成式 AI 大多是“盲盒模式”,生成好坏全凭运气。本项目最大的贡献在于引入了一个基于数据驱动的自动化评审系统

  • 核心机制:我们利用项目前期收集整理的数百首音乐样本,构建了专属的风格与情绪识别模块(即系统内部的评分引擎)。这个模块就像一位严苛的“质检员”。
  • 工作流程
    1. 当 MusicGen 生成一段音乐后,“质检员”会立即介入,判断其风格是否偏离,情绪是否到位。
    2. 如果得分未达标,系统会自动判定为“失败”,并调整参数重新尝试,直到生成出高分结果。
    3. 这种“生成-评分-修正”的闭环机制,极大地提高了输出结果的稳定性,解决了 AI 生成质量忽高忽低的问题。

解决生成模型的“长音频崩坏”难题

开源的大模型(如 MusicGen)通常存在“短视”问题,一旦生成超过 30 秒的音乐,就容易出现静音、乱码或结构混乱。

  • 工程贡献:我们设计了一套分片重构与信号修复算法
    • 系统将长音乐切分为多个逻辑片段,分别进行风格迁移。
    • 在拼接时,引入了波形监测机制。一旦检测到某一段音频出现能量塌陷(音量突然变小或消失),算法会立即通过上下文进行信号修复。这使得本项目能够稳定处理全长歌曲,突破了原模型的长度限制。

与传统方法的对比

维度 纯传统算法 直接使用 AI 模型 本项目的混合架构
听感质量 机械、生硬,像电子合成音 逼真,但容易“跑题”,丢失原曲旋律 既逼真又还原,保留原曲灵魂,重塑风格皮囊
可控性 非常高,但上限低 低,像抽奖一样不可控 ,通过特征翻译和质检系统实现了精确控制
稳定性 稳定 不稳定,长音频容易崩坏 自适应,通过工程手段修复了模型的原生缺陷

未来展望

  • 细粒度与结构化控制: 目前的系统主要依赖宏观的“情绪”和“风格”标签。未来计划引入更深维度的控制能力:

    • 配器指定:允许用户通过 Prompt 明确指定或排除特定乐器(如“加入失真吉他独奏”或“移除打击乐”)。
    • 分轨编辑:引入源分离技术,支持生成后对鼓、贝斯、人声、旋律等声部进行独立调整或替换。
    • 动态密度调整:增加对音乐织体密度(稀疏/密集)和节奏型的参数化控制。
  • 丰富交互维度:引入更多模态的输入控制,例如支持通过文字描述与音频参考相结合的多模态 Prompt,让生成结果更精准。

  • 流式传输体验:将目前的“全量生成后下载”升级为 WebSocket 流式传输,实现边生成边播放,大幅降低用户感知的等待时间。


第三方说明

本项目核心依赖于以下开源项目:

核心模型

基础框架

写在最后

这个项目由小组的五位成员共同完成。

@dieWehmut @spacewolf28 @NanXiang-git @lsw6132 @XiaoYang-Zhou

About

Music Style&&Emotion Converter : Vue3 | FastAPI | MusicGen&&YAMNet

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 6