YAML Metadata Warning:empty or missing yaml metadata in repo card
Check out the documentation for more information.
Quick or Slow: Forced-Choice Self-Consistency Inversion in Audio-LLMs
This repository accompanies the ICASSP submission: "Anti-Predictive Self-Consistency in Audio-LLMs: A Forced-Choice Diagnostic and Silent-Audio Probe Recalibrator"
One-sentence claim
On an audio-LLM binary paralinguistic task, forcing a full commit rate does not fix chance-level accuracy β but it does let us prove that the model's confidence is worse than useless (anti-predictive), and a one-extra-forward-pass silent-audio probe can partially repair it.
Repository layout
pivot_c/
βββ paper/ # ICASSP manuscript (IEEEtran)
β βββ main_merged.tex # single-file merged manuscript (compile this)
β βββ main.tex # split version (uses \input{})
β βββ sec_*.tex # per-section sources
β βββ references.bib # bibliography
β βββ figures/ # publication-ready PNG + PDF (figures4papers style)
β βββ forced_choice_intro.{png,pdf}
β βββ selective_risk_curve.{png,pdf}
β
βββ code/ # analysis + inference scripts
β βββ infer_sc.py # k-sample SC generation
β βββ infer_probe_pitchbright.py # first-token logit probe extraction
β βββ grid.py # multi-cell GPU grid runner
β βββ grid_perturb_q2o.py # perturbation (noise/pink/trunc) grid
β βββ analyze_rho_sign_predictor.py # N=54 predictor
β βββ analyze_forced_choice.py # forced-choice rescore
β βββ analyze_fc_paired_bootstrap.py # paired bootstrap CI
β βββ analyze_fc_decompose.py # K-flip redundancy + decomposition
β βββ analyze_locked_wrong_xfam.py # cross-family locked-wrong
β βββ analyze_flipped_calibrator_xfam.py
β βββ analyze_tau_sweep.py # Ο-sweep
β βββ analyze_perturb.py # deployment-degradation
β βββ analyze_fusion_canonical.py # canonical fusion (SoT)
β βββ analyze_fusion_generic.py
β βββ analyze_fusion_xfam.py # lp_margin cross-family pooled
β βββ verify_selective_risk.py # selective-risk verification
β βββ make_selective_risk_fig_fp.py # figure: selective-risk
β βββ make_intro_fig_fp.py # figure: forced-choice intro
β
βββ results/ # raw per-item JSONLs (351 files)
β βββ sc_{model}__{corpus}__{task}.jsonl # free-gen SC
β βββ sc_pert_{cond}_{model}__{corpus}__{task}.jsonl # perturbed SC
β βββ probe_{task}_{model}__{corpus}__{cond}.jsonl # logit probes
β
βββ analysis/ # canonical analysis outputs + verdicts
βββ rho_sign_cells.json
βββ rho_sign_cells_k20.json
βββ snr_sweep_curve.json
βββ ...
Reproducibility
All numbers in the paper recompute from the raw per-item JSONLs:
# Forced-choice rescore (Table tab:fc + Figure fig:fc)
python3 code/analyze_forced_choice.py
# Paired bootstrap CI (abstract + Finding Layer-2)
python3 code/analyze_fc_paired_bootstrap.py
python3 code/analyze_fc_decompose.py
# Selective-risk curve (Figure fig:selective)
python3 code/verify_selective_risk.py
python3 code/make_selective_risk_fig_fp.py
# Forced-choice intro figure (Figure fig:fc)
python3 code/make_intro_fig_fp.py
# N=54 flip-rate rho-sign predictor (Finding #9)
python3 code/analyze_rho_sign_predictor.py
Models used (weights loaded from HuggingFace / local checkpoints):
Qwen/Qwen2-Audio-7B-InstructQwen/Qwen2.5-Omni-7BSALMONN-7B(local checkpoint)Audio Flamingo-Next(local checkpoint at/ossfs/workspace/af-next, requiresafnext_env)
Grid: 4 audio-LLM families Γ 3 corpora (LibriSpeech test-clean/test-other, VoxPopuli) Γ 4 binary paralinguistic tasks (pace/loud/pitch/bright) Γ k=5 at Ο=0.7 + perturbations (noise at SNR {10,5,0,-5} dB, pink noise, trunc 1s).
Key numbers (all reproducible)
| metric | value | script |
|---|---|---|
| forced-choice pace accuracy | 0.489 β chance | analyze_forced_choice.py |
| Ο(forced SC, forced correct) pace | β0.059 | analyze_forced_choice.py |
| Stouffer combined p | 0.003 | analyze_forced_choice.py |
| SC-alone AUROC (forced) | 0.466 < 0.5 | analyze_forced_choice.py |
| Fused [SC,probe] AUROC (forced) | 0.537 | verify_selective_risk.py |
| Lift | +0.072, CI [+0.004, +0.141] | analyze_fc_paired_bootstrap.py |
| Selective-risk | 0.496β0.508β0.521 (monotoneβ) | verify_selective_risk.py |
| Bright forced Ο | +0.02 (inversion gone) | analyze_forced_choice.py |
License
Anonymous for double-blind review. Code + data released for reproducibility.