这是一个基于 Qwen3-ASR-1.7B 的独立鲁棒 ASR 项目。
项目目标是完成一个类似 Mega-ASR 能力形态的产品雏形:具备鲁棒 ASR LoRA、音频质量 router、统一推理入口、数据增强管线、评测体系和发布文档。但本项目不以 Mega-ASR 代码作为实现底座,所有新功能都应基于 Qwen3-ASR 的真实 API 和我们自己的工程结构开发。
当前已完成第一版 baseline smoke 闭环、150 条本地合成 MVP 评测集生成与评测入口,并完成 LoRA 训练前探测:
clean/noise 音频
-> JSONL manifest
-> Qwen3-ASR-1.7B baseline 推理
-> prediction JSONL
-> WER/CER 评测
-> overall 与 scenario-level 指标
Qwen3-ASR-1.7B 已在 Colab GPU runtime 中完成 MVP 150 hard profile baseline 评测。训练前探测已确认官方 qwen-asr wrapper 暴露 Qwen3ASRForConditionalGeneration 根节点,第一版 LoRA smoke target 收敛为 audio tower attention + speech projection。Unsloth 兼容性检查已失败,当前训练框架回退为 Transformers + PEFT;20 step smoke training 已跑通。v1-v5 训练和 held-out 评测已完成,当前最优小闭环仍是 v3。v6 开始转向 hard-profile 数据对齐:先用 Notebook 10 生成 v6A hard-profile train/val,再做 base WER 分桶和 v6A 训练。
Colab 侧推荐先运行 notebooks/00_clone_github_colab.ipynb,确认 Google Drive 中的工程代码已经更新到 GitHub 最新提交,再继续执行 baseline 或训练 notebook。
scripts/create_smoke_audio.py:本地生成 clean/noise smoke 音频和本地 manifest。scripts/create_mvp_eval_audio.py:本地生成 150 条 MVP 评测音频,覆盖 clean、noise、reverb、far_field、dropout。scripts/create_lora_mvp_dataset.py:生成正式 LoRA MVP 启动用 bootstrap train/val manifest,默认覆盖 clean、noise、reverb。scripts/create_v6a_hard_profile_dataset.py:从已有lora_mvpclean 音频派生 v6A hard-profile train/val manifest,默认覆盖 7 类场景。data/mvp_eval/audio/:已提交 150 条 MVP smoke 音频,供 Colab 直接拉取后训练前检查和 smoke training 使用。inference/qwen3_asr_base_infer.py:读取 JSONL manifest,调用 Qwen3-ASR baseline 生成 ASR prediction JSONL。inference/qwen3_asr_lora_infer.py:加载 Qwen3-ASR base 与 PEFT adapter,生成 LoRA always-on ASR prediction JSONL。evaluation/eval_wer.py:计算 WER/CER、overall 指标和 scenario-level 指标。evaluation/analyze_errors.py:分析 scored prediction JSONL,输出 worst cases、场景聚合和错误标签。train/inspect_qwen3_asr_modules.py:训练前探测 Qwen3-ASR 模块结构,并生成 LoRA target 候选。train/check_unsloth_qwen3_asr.py:检查 Unsloth 是否能加载 Qwen3-ASR 并精确匹配 audio tower target。train/train_qwen3_asr_lora.py:使用 Transformers + PEFT 对 Qwen3-ASR 跑 LoRA smoke training。notebooks/00_clone_github_colab.ipynb:Colab/Google Drive clone 或更新 GitHub 工程,并校验当前 commit 和关键修复。notebooks/00_github_commit_push_colab.ipynb:Colab/Google Drive 中单独提交并推送受控实验输出,使用 Colab SecretGITHUB_TOKEN授权。notebooks/01_baseline_colab.ipynb:Colab/Google Drive baseline smoke notebook。notebooks/02_mvp_150_eval_colab.ipynb:Colab/Google Drive MVP 150 baseline 评测 notebook。notebooks/03_train_lora_colab.ipynb:Colab/Google Drive LoRA 探测和 PEFT smoke training 入口。notebooks/04_train_lora_mvp_colab.ipynb:Colab/Google Drive 正式 LoRA MVP bootstrap 训练入口,默认 600 step。notebooks/05_eval_lora_mvp_colab.ipynb:Colab/Google Drive LoRA MVP held-out 评测入口,对比 base 与 LoRA。notebooks/06_train_lora_mvp_v2_colab.ipynb:Colab/Google Drive LoRA MVP v2 快速 ablation 入口,默认 attention-only、noise/reverb-only、长短句均衡采样。notebooks/10_make_hard_profile_dataset_colab.ipynb:Colab/Google Drive v6A hard-profile 数据构建入口。configs/baseline/qwen3_asr_baseline.yaml:baseline smoke 配置。
打开并按顺序执行:
notebooks/00_clone_github_colab.ipynb
默认 Google Drive 项目路径:
/content/drive/MyDrive/qwen3-asr
执行完成后应看到当前 commit、最新 commit message,以及关键修复标记检查通过。
该脚本依赖 macOS say,用于没有真实音频时快速生成 clean/noise 两条测试音频。
python3 scripts/create_smoke_audio.py --force默认输出:
data/local_smoke/audio/clean_0001.wavdata/local_smoke/audio/noise_0001.wavdata/jsonl/baseline_smoke.local.jsonl
这些生成物只用于本地 smoke test,已被 .gitignore 排除。
打开并按顺序执行:
notebooks/01_baseline_colab.ipynb
默认 Google Drive 项目路径:
/content/drive/MyDrive/qwen3-asr
如遇 Hugging Face 下载权限或限流问题,在 notebook 中登录后重试。
本地生成:
python3 scripts/create_mvp_eval_audio.py --profile hard --force默认输出:
data/mvp_eval/audio/data/jsonl/baseline_mvp_150.local.jsonldata/jsonl/baseline_mvp_150_stats.local.json
当前仓库已经提交一份 MVP 150 音频,Colab 中 git pull 后应能直接得到 data/mvp_eval/audio/。如需重新生成本地版本,再把新文件同步到 Google Drive 项目目录后执行:
notebooks/02_mvp_150_eval_colab.ipynb
推理:
python3 inference/qwen3_asr_base_infer.py \
--manifest data/jsonl/baseline_smoke.local.jsonl \
--output-jsonl outputs/baseline/predictions.qwen3_asr_base.smoke.jsonl \
--model-id Qwen/Qwen3-ASR-1.7B \
--dtype float16 \
--device-map cuda:0 \
--max-inference-batch-size 1 \
--max-new-tokens 128 \
--language English \
--limit 2评测:
python3 evaluation/eval_wer.py \
--predictions-jsonl outputs/baseline/predictions.qwen3_asr_base.smoke.jsonl \
--scored-jsonl outputs/baseline/predictions.qwen3_asr_base.smoke.scored.jsonl \
--metrics-json outputs/baseline/metrics.qwen3_asr_base.smoke.json \
--metrics-by-scenario-csv outputs/baseline/metrics_by_scenario.qwen3_asr_base.smoke.csv打开并按顺序执行:
notebooks/03_train_lora_colab.ipynb
默认 Google Drive 项目路径:
/content/drive/MyDrive/qwen3-asr
探测主要输出:
outputs/lora_probe/qwen3_asr_1_7b/module_snapshot.jsonoutputs/lora_probe/qwen3_asr_1_7b/module_summary.csvoutputs/lora_probe/qwen3_asr_1_7b/lora_target_candidates.jsonoutputs/lora_probe/qwen3_asr_1_7b/lora_target_candidates.md
训练主要输出:
checkpoints/qwen3-asr-1.7b-lora/target_modules.jsoncheckpoints/qwen3-asr-1.7b-lora/training_config.jsoncheckpoints/qwen3-asr-1.7b-lora/loss_log.jsonlcheckpoints/qwen3-asr-1.7b-lora/summary.jsoncheckpoints/qwen3-asr-1.7b-lora/adapter/
正式 LoRA MVP 不直接使用 MVP 150 held-out test 训练。先生成独立 train/val:
python3 scripts/create_lora_mvp_dataset.py \
--profile medium \
--train-items-per-scenario 120 \
--val-items-per-scenario 30 \
--scenarios clean,noise,reverb \
--force默认输出:
data/lora_mvp/audio/data/jsonl/lora_mvp_train.local.jsonldata/jsonl/lora_mvp_val.local.jsonldata/jsonl/lora_mvp_stats.local.json
第一版训练配置为:
configs/train/qwen3_asr_lora_mvp_train.yaml
Colab 中正式训练入口为:
notebooks/04_train_lora_mvp_colab.ipynb
正式训练完成后,先在固定 MVP 150 held-out test 上跑 LoRA always-on:
python3 inference/qwen3_asr_lora_infer.py \
--manifest data/jsonl/baseline_mvp_150.local.jsonl \
--output-jsonl outputs/lora_mvp_eval/predictions.qwen3_asr_lora_mvp.mvp_150.jsonl \
--adapter-dir checkpoints/qwen3-asr-1.7b-lora-mvp/adapter \
--audio-root . \
--model-id Qwen/Qwen3-ASR-1.7B \
--dtype float16 \
--device-map cuda:0 \
--quantization 4bit \
--max-inference-batch-size 1 \
--max-new-tokens 128 \
--language EnglishColab 中推荐直接执行:
notebooks/05_eval_lora_mvp_colab.ipynb
v5 后不继续盲目扩大 target,先生成 hard-profile 多场景数据:
notebooks/10_make_hard_profile_dataset_colab.ipynb
脚本入口:
python3 scripts/create_v6a_hard_profile_dataset.py \
--config configs/data/v6a_hard_profile.yaml \
--force默认输出:
data/v6a_hard_profile/audio/data/jsonl/v6a_hard_profile_train.local.jsonldata/jsonl/v6a_hard_profile_val.local.jsonldata/jsonl/v6a_hard_profile_stats.local.json
这些输出是可再生的本地/Drive 数据,默认不提交到 git。生成完成后,运行 Notebook 11 做 base difficulty scoring,再进入 Notebook 12 v6A 训练。
configs/ 配置文件
data/ JSONL 示例与数据说明
docs/ 中文架构、开发、测试、进度和路线图文档
evaluation/ WER/CER 与错误分析工具
inference/ Qwen3-ASR baseline/LoRA/router 推理入口
notebooks/ Colab 优先 notebook
router/ 后续音频质量 router
scripts/ 数据准备和 smoke 工具脚本
train/ 后续 LoRA/QLoRA 训练入口
原 Mega-ASR 上游工程应放在本地忽略目录:
references/mega-asr-upstream/
该目录只用于查阅和对照,不作为新工程运行时依赖,不在其中继续开发 Qwen3-ASR 功能。references/ 已被 .gitignore 排除,不进入 git。
按路线图继续执行:
- 执行
notebooks/10_make_hard_profile_dataset_colab.ipynb,生成 v6A hard-profile train/val。 - 执行
notebooks/11_score_base_difficulty_colab.ipynb,对 v6A manifest 跑 4bit base inference 并生成 difficulty bucket。 - 新增 Notebook 12,回到 v3 的 99 target 训练 v6A。
- 只有 noise 或 reverb 达到 10% 相对 WER 改善、clean 无退化,并且错误分析没有新增明显重复/幻觉风险时,才进入 router。