LynnMisty/Audio-Text-alignment-model

0

stars

1

commits

Python

primary language

Apr 30, 2026

updated

README

EmotionTalk 中文驾驶情感语音 — 音频-文本对齐项目

任务

让模型听一段中文驾驶场景语音,能在文本空间检索到对应情感描述。

  • 数据集:EmotionTalk,19,250 条中文音频,15 个说话人,7 类情感(neutral/anger/sad/happy/surprise/fear/disgust),每条 5 个 caption
  • 方法路线:双塔对比学习(音频塔 + 文本塔 → 共享语义空间 → cosine 相似度)
  • 下游目标:情感级检索、零样本情感分类、路怒检测

方案演进历程

阶段 1:从零训练(失败)

版本时间音频塔文本塔损失结果
v003/31HuBERT-base (95M)mE5-base (278M)SigmoidLoss 卡 1.24,R@1 ≈ 0.4%
v204/01Dasheng-base (85M)Jina-v3 (572M)SigmoidLoss 卡 1.24,R@1 ≈ 0.05%

踩的坑

  • 温度/偏置忘加优化器,Loss 不动
  • Jina-v3 的 .encode() 内部带 @torch.no_grad(),梯度全断
  • batch_size=8 负样本太少
  • 1.9 万条数据从零学跨模态对齐根本不够

结论:从零训练数据/计算都不够,必须用预训练模型微调。


阶段 2:LoRA 微调预训练对比模型

版本时间音频塔文本塔关键改动情感 Acc@1 (test=2161)
CLAP-LoRA04/08CLAP HTSAT + LoRAmE5 + LoRA双路 Sigmoid (L_at + λ·L_tt)(未做情感评估)
v304/09Dasheng + LoRASONAR + LoRA在 GLAP 预训练上微调,硬 ±1 标签59.79%(旧 split 误读 65.85%)

v3(GLAP-LoRA 基线):基于小米 GLAP 预训练(AISHELL-2 R@1=98.5%),保留预训练对齐,LoRA r=16。可训练参数 16.2M (1.9%)


阶段 3:软标签 / 文本塔升级(本周工作)

版本时间文本塔L_tt 软标签来源情感 Acc@1
v4a04/15SONAR + LoRAQwen3-Embedding-0.6B 教师对 caption cosine57.75%
v4b04/16Qwen3-Embedding-0.6B + LoRA硬 ±1(无软标签)59.23%
v5a04/16Qwen3-Embedding-0.6B + LoRAmetadata 规则:emotion_soft_label cosine + VAD RBF + gender55.02%
v3-resplit04/17SONAR + LoRA硬 ±159.79%

v4a 结论:Qwen3 教师对模板化 caption 给出的相似度 std≈0.02、跨情绪 gap 仅 0.04,软信号几乎无梯度,L_tt 从 epoch 8 后停滞。

v4b 结论:Qwen3 文本塔替换 SONAR + 硬标签,对照 v3 看是否换文本塔就有提升。结果与 v3-resplit 几乎打平(差 0.6pp,噪声范围内)。

v5a 创新点:放弃用 LM 做教师,直接从 JSON metadata 算软标签:

  • s_emo = cos(emotion_soft_label_7d) × 0.5
  • s_vad = exp(-‖VAD‖₂ / 0.3) × 0.4
  • s_gen = gender_match × 0.1

软标签区分度 gap=0.47(Qwen3 教师的 12 倍),但总体 Acc@1 仍未超过硬标签基线。

v3-resplit:用与 v4 系列同口径的新 split 重训练 v3,作为公平对照——证明之前 v3 的 65.85% 主要是旧 split 的测试集差异造成。


完整结果对比(test=2161,新 split)

总体指标

版本文本塔L_tt 目标情感 Acc@1Acc@5Acc@10路怒 F1
GLAP 原模型SONAR11.43%52.20%75.94%0.199
v3-resplitSONAR+LoRA硬 ±159.79%81.17%86.26%0.676
v4aSONAR+LoRAQwen3 教师软标签57.75%76.08%81.95%0.709
v4bQwen3+LoRA硬 ±159.23%81.03%86.02%0.680
v5aQwen3+LoRAmetadata 规则软标签55.02%75.34%81.26%0.697

Per-class 情感 Acc@1

情感NGLAPv3-resplitv4av4bv5a
neutral10278.3%71.3%65.0%68.7%52.8%
anger41916.5%67.5%68.3%73.0%74.2%
happy25511.4%47.8%54.9%51.4%69.4%
sad12129.8%60.3%64.5%50.4%64.5%
surprise16612.7%31.9%20.5%33.1%33.1%
fear858.2%22.4%36.5%11.8%17.6%
disgust880.0%11.4%12.5%13.6%12.5%

训练收敛(best epoch / epoch 20 val R@1)

版本best epochval R@1 峰值收敛特点
v3-resplit~150.014较慢,10 epoch 后噪声波动
v4a200.011末期仍在抖动
v4b50.010极快收敛,后 15 epoch 过拟合
v5a30.009极快收敛,后 17 epoch 过拟合

关键结论

  1. LoRA 微调路线大幅有效:相对 GLAP 原模型,情感 Acc@1 从 11.4% → 59.8%(+48pp),证明 LoRA 微调可以充分利用 GLAP 预训练对齐。

  2. 同口径下 v3 / v4a / v4b 差距很小(55-60% 区间),文本塔和软标签都没带来一致性收益。之前 v3 比 v4 高 6pp 主要是旧 split 把更多 easy case 放到 test。

  3. 不同情绪需要不同信号

    • v3-resplit / v4b 在 neutral 上最强(71%/69%)
    • v5a 在 anger / happy 上最强(74%/69%)
    • v4a 在 sad / fear 上最强(65%/37%)
  4. v4b/v5a 收敛极快(best epoch=5/3),暗示 LR=2e-4 偏高、warmup=300 偏短;后 15 epoch 是过拟合,更适合早停。

  5. disgust / fear 是全体方案的瓶颈(<37%,N<100),样本量小且语义模糊。

  6. instance R@1 不是好的 best checkpoint 选择标准——captions 模板化导致 R@1 早期就饱和,但情感 Acc 可能还在改进。


下一步方向

  1. 改 best checkpoint 选择标准:从 instance R@1 改成情感 Acc@1 或 Acc@5
  2. 混合 hard + soft 标签策略:v5a 在 anger/happy 强、neutral 弱,可考虑只对高区分度类用软标签
  3. 超参调优:LR 降到 1e-4,warmup 拉长到 500-1000 step
  4. 少样本类增强:disgust/fear 类别加权或数据增强
  5. 下游评估:从检索切到零样本情感分类 / linear probe,与下游路怒检测任务直接对齐

项目结构

AudioText/
├── CLAP/                                  # 主代码仓库
│   ├── src/laion_clap/training/           # 训练脚本与配置
│   ├── scripts/                           # 软标签预计算等离线脚本
│   ├── outputs/                           # 各版本 checkpoints 与 train.log
│   ├── 方案总结.md / v3.md / v4.md / v5.md # 各阶段方案文档
│   └── 周报_*.md
├── EmotionTalk/                           # 数据集
│   └── Audio/
│       ├── wav/                           # 19,250 条音频
│       ├── enriched_json/                 # 每条 clip 的 metadata JSON
│       └── emotiontalk_meta_soft_labels_v5a.pt  # v5a 软标签矩阵 (741 MB)
└── README.md                              # 本文档

复现命令

# v3-resplit
python CLAP/src/laion_clap/training/train_glap_lora.py \
  --config CLAP/src/laion_clap/training/configs/emotiontalk_glap_lora_v3_resplit.yaml

# v4b (Qwen3 文本塔)
python CLAP/src/laion_clap/training/train_glap_lora.py \
  --config CLAP/src/laion_clap/training/configs/emotiontalk_glap_lora_v4b.yaml

# v5a (Qwen3 + metadata 软标签)
python CLAP/scripts/precompute_metadata_soft_labels.py    # 一次性生成 .pt
python CLAP/src/laion_clap/training/train_glap_lora.py \
  --config CLAP/src/laion_clap/training/configs/emotiontalk_glap_lora_v5a.yaml

# 评估(任何 checkpoint)
python CLAP/src/laion_clap/training/eval_emotion_retrieval.py \
  --config <yaml> --checkpoint <ckpt.pt> --split test

Contributors

LynnMisty

1 commits

LynnMisty/Audio-Text-alignment-model

0

stars

1

commits

Python

primary language

Apr 30, 2026

updated

README

EmotionTalk 中文驾驶情感语音 — 音频-文本对齐项目

任务

让模型听一段中文驾驶场景语音,能在文本空间检索到对应情感描述。

  • 数据集:EmotionTalk,19,250 条中文音频,15 个说话人,7 类情感(neutral/anger/sad/happy/surprise/fear/disgust),每条 5 个 caption
  • 方法路线:双塔对比学习(音频塔 + 文本塔 → 共享语义空间 → cosine 相似度)
  • 下游目标:情感级检索、零样本情感分类、路怒检测

方案演进历程

阶段 1:从零训练(失败)

版本时间音频塔文本塔损失结果
v003/31HuBERT-base (95M)mE5-base (278M)SigmoidLoss 卡 1.24,R@1 ≈ 0.4%
v204/01Dasheng-base (85M)Jina-v3 (572M)SigmoidLoss 卡 1.24,R@1 ≈ 0.05%

踩的坑

  • 温度/偏置忘加优化器,Loss 不动
  • Jina-v3 的 .encode() 内部带 @torch.no_grad(),梯度全断
  • batch_size=8 负样本太少
  • 1.9 万条数据从零学跨模态对齐根本不够

结论:从零训练数据/计算都不够,必须用预训练模型微调。


阶段 2:LoRA 微调预训练对比模型

版本时间音频塔文本塔关键改动情感 Acc@1 (test=2161)
CLAP-LoRA04/08CLAP HTSAT + LoRAmE5 + LoRA双路 Sigmoid (L_at + λ·L_tt)(未做情感评估)
v304/09Dasheng + LoRASONAR + LoRA在 GLAP 预训练上微调,硬 ±1 标签59.79%(旧 split 误读 65.85%)

v3(GLAP-LoRA 基线):基于小米 GLAP 预训练(AISHELL-2 R@1=98.5%),保留预训练对齐,LoRA r=16。可训练参数 16.2M (1.9%)


阶段 3:软标签 / 文本塔升级(本周工作)

版本时间文本塔L_tt 软标签来源情感 Acc@1
v4a04/15SONAR + LoRAQwen3-Embedding-0.6B 教师对 caption cosine57.75%
v4b04/16Qwen3-Embedding-0.6B + LoRA硬 ±1(无软标签)59.23%
v5a04/16Qwen3-Embedding-0.6B + LoRAmetadata 规则:emotion_soft_label cosine + VAD RBF + gender55.02%
v3-resplit04/17SONAR + LoRA硬 ±159.79%

v4a 结论:Qwen3 教师对模板化 caption 给出的相似度 std≈0.02、跨情绪 gap 仅 0.04,软信号几乎无梯度,L_tt 从 epoch 8 后停滞。

v4b 结论:Qwen3 文本塔替换 SONAR + 硬标签,对照 v3 看是否换文本塔就有提升。结果与 v3-resplit 几乎打平(差 0.6pp,噪声范围内)。

v5a 创新点:放弃用 LM 做教师,直接从 JSON metadata 算软标签:

  • s_emo = cos(emotion_soft_label_7d) × 0.5
  • s_vad = exp(-‖VAD‖₂ / 0.3) × 0.4
  • s_gen = gender_match × 0.1

软标签区分度 gap=0.47(Qwen3 教师的 12 倍),但总体 Acc@1 仍未超过硬标签基线。

v3-resplit:用与 v4 系列同口径的新 split 重训练 v3,作为公平对照——证明之前 v3 的 65.85% 主要是旧 split 的测试集差异造成。


完整结果对比(test=2161,新 split)

总体指标

版本文本塔L_tt 目标情感 Acc@1Acc@5Acc@10路怒 F1
GLAP 原模型SONAR11.43%52.20%75.94%0.199
v3-resplitSONAR+LoRA硬 ±159.79%81.17%86.26%0.676
v4aSONAR+LoRAQwen3 教师软标签57.75%76.08%81.95%0.709
v4bQwen3+LoRA硬 ±159.23%81.03%86.02%0.680
v5aQwen3+LoRAmetadata 规则软标签55.02%75.34%81.26%0.697

Per-class 情感 Acc@1

情感NGLAPv3-resplitv4av4bv5a
neutral10278.3%71.3%65.0%68.7%52.8%
anger41916.5%67.5%68.3%73.0%74.2%
happy25511.4%47.8%54.9%51.4%69.4%
sad12129.8%60.3%64.5%50.4%64.5%
surprise16612.7%31.9%20.5%33.1%33.1%
fear858.2%22.4%36.5%11.8%17.6%
disgust880.0%11.4%12.5%13.6%12.5%

训练收敛(best epoch / epoch 20 val R@1)

版本best epochval R@1 峰值收敛特点
v3-resplit~150.014较慢,10 epoch 后噪声波动
v4a200.011末期仍在抖动
v4b50.010极快收敛,后 15 epoch 过拟合
v5a30.009极快收敛,后 17 epoch 过拟合

关键结论

  1. LoRA 微调路线大幅有效:相对 GLAP 原模型,情感 Acc@1 从 11.4% → 59.8%(+48pp),证明 LoRA 微调可以充分利用 GLAP 预训练对齐。

  2. 同口径下 v3 / v4a / v4b 差距很小(55-60% 区间),文本塔和软标签都没带来一致性收益。之前 v3 比 v4 高 6pp 主要是旧 split 把更多 easy case 放到 test。

  3. 不同情绪需要不同信号

    • v3-resplit / v4b 在 neutral 上最强(71%/69%)
    • v5a 在 anger / happy 上最强(74%/69%)
    • v4a 在 sad / fear 上最强(65%/37%)
  4. v4b/v5a 收敛极快(best epoch=5/3),暗示 LR=2e-4 偏高、warmup=300 偏短;后 15 epoch 是过拟合,更适合早停。

  5. disgust / fear 是全体方案的瓶颈(<37%,N<100),样本量小且语义模糊。

  6. instance R@1 不是好的 best checkpoint 选择标准——captions 模板化导致 R@1 早期就饱和,但情感 Acc 可能还在改进。


下一步方向

  1. 改 best checkpoint 选择标准:从 instance R@1 改成情感 Acc@1 或 Acc@5
  2. 混合 hard + soft 标签策略:v5a 在 anger/happy 强、neutral 弱,可考虑只对高区分度类用软标签
  3. 超参调优:LR 降到 1e-4,warmup 拉长到 500-1000 step
  4. 少样本类增强:disgust/fear 类别加权或数据增强
  5. 下游评估:从检索切到零样本情感分类 / linear probe,与下游路怒检测任务直接对齐

项目结构

AudioText/
├── CLAP/                                  # 主代码仓库
│   ├── src/laion_clap/training/           # 训练脚本与配置
│   ├── scripts/                           # 软标签预计算等离线脚本
│   ├── outputs/                           # 各版本 checkpoints 与 train.log
│   ├── 方案总结.md / v3.md / v4.md / v5.md # 各阶段方案文档
│   └── 周报_*.md
├── EmotionTalk/                           # 数据集
│   └── Audio/
│       ├── wav/                           # 19,250 条音频
│       ├── enriched_json/                 # 每条 clip 的 metadata JSON
│       └── emotiontalk_meta_soft_labels_v5a.pt  # v5a 软标签矩阵 (741 MB)
└── README.md                              # 本文档

复现命令

# v3-resplit
python CLAP/src/laion_clap/training/train_glap_lora.py \
  --config CLAP/src/laion_clap/training/configs/emotiontalk_glap_lora_v3_resplit.yaml

# v4b (Qwen3 文本塔)
python CLAP/src/laion_clap/training/train_glap_lora.py \
  --config CLAP/src/laion_clap/training/configs/emotiontalk_glap_lora_v4b.yaml

# v5a (Qwen3 + metadata 软标签)
python CLAP/scripts/precompute_metadata_soft_labels.py    # 一次性生成 .pt
python CLAP/src/laion_clap/training/train_glap_lora.py \
  --config CLAP/src/laion_clap/training/configs/emotiontalk_glap_lora_v5a.yaml

# 评估(任何 checkpoint)
python CLAP/src/laion_clap/training/eval_emotion_retrieval.py \
  --config <yaml> --checkpoint <ckpt.pt> --split test

Contributors

LynnMisty

1 commits

Languages

Python

98.0%

Shell

2.0%