DuplexJev-B · gender
DuplexJev reads typed, closed-set decisions from speech (is the turn over? which filler fits? who is speaking?) as a single-token distribution of a frozen LLM, with zero decode steps and many questions per forward pass. This repository holds one connector that joins a frozen ASR encoder to a frozen LLM, in Ultravox format.
| ASR encoder (frozen) | adventists-ai/Qwen3-ASR-0.6B-Encoder (from Qwen/Qwen3-ASR-0.6B) |
| LLM (frozen) | Qwen/Qwen3-32B |
| Connector | B (last layer): the final encoder layer (h18) goes straight into the projector (frame stacking ×2 + SwiGLU MLP). 17.8 M trainable parameters. |
| Audio tokens | 6.25 per second (stack factor 2) |
| This variant | R2 connector + 6k steps of answer-token supervision on a gender pack (real speech only). |
Quick start
pip install "duplexjev[speech]>=0.2.1"
from duplexjev import Decider, Question
d = Decider.from_pretrained("adventists-ai/DuplexJev-B-Gender-Qwen3-ASR-0.6B-Qwen3-32B", device="auto") # Qwen3-32B bf16: ~65 GB of GPU memory
# English clip
d.decide("utterance_en.wav", [
Question("gender", "What is the perceived gender of the speaker?", ["female", "male"], lang="en"),
], lang="en")
# Chinese clip: ask in Chinese, with Chinese options
d.decide("utterance_zh.wav", [
Question("gender", "说话人的性别是?", ["男性", "女性"], lang="zh"),
], lang="zh")
# -> {question_id: {"answer": ..., "confidence": ..., "probs": {option: p, ...}}}
Ask in the language of the clip, with options worded as in the examples: the connector was trained with
language-matched prompts. Use duplexjev>=0.2.1; 0.2.0 padded audio at the start, which costs several points.
Already have local copies of the encoder and LLM? Pass text_model="/path/Qwen3-32B" and
audio_model="/path/Qwen3-ASR-0.6B-Encoder"; this works offline.
decide_batch answers question groups over many clips in one pass. See the GitHub repository for the
batched pipeline, prefix sharing, the serving loop and evaluation scripts.
Results (paper, Tables 2–3)
| Evaluation | Score (%) |
|---|---|
| Gender, 800 real utterances | 87.9 |
| ZJU gender benchmark (native / lettered prompt) | 60 / 57 |
| qa100 | 87 (−3 vs. R2) |
| ZJU-ML | 81 (+2 vs. R2) |
qa100: 100 bilingual spoken multiple-choice questions (adventists-ai/qa100).
ZJU-ML: main-language part of the ZJU audio benchmark v2.0.0 (50 real-speech factual + 50 TTS math/logic items).
Numbers are single-token readouts with the paper's evaluation prompts.
Reproduced with duplexjev 0.2.1 and its default prompts (one option order, lang matched to the clip):
| Evaluation | Score (%) |
|---|---|
| Gender, 800 real utterances | 87.0 |
| Emotion, 4-way, 800 utterances | 27.1 |
| qa100 | 88 |
Training
- Frozen: Qwen3-ASR-0.6B encoder and Qwen3-32B. Trained: the connector only.
- Content rounds (R1–R2): transcript distillation (token-level KL to the LLM's transcript-conditioned output, T = 2).
- Decision training: answer-token supervision, cross-entropy on the single option letter at the readout position. Transcript distillation alone cannot teach speaker cues, because its teacher never hears the voice.
- Data: R2 data + gender pack: 32k real utterances from AISHELL-1 and LibriSpeech with corpus-provided speaker gender.
Limitations
- Evaluated on read or acted speech and small test sets (100–800 items); not on streaming input.
- Paralinguistic training lowers accuracy on real spontaneous-style factual questions (see ZJU-ML above).
- Emotion labels come from acted corpora; do not use the outputs to make decisions about individuals.
- The connector only works with the encoder and LLM listed above.
License
Apache-2.0 for the connector weights and code in this repository. The frozen base models keep their own licences (Qwen3-32B and Qwen3-ASR-0.6B: Apache-2.0). The training corpora have their own terms, and some of them (e.g. WenetSpeech, CoVoST 2) are licensed for non-commercial use only; check them before commercial use.
Citation
@inproceedings{jin2027duplexjev,
title = {Batched Speech Decisions Without Decoding: Single-Token Supervision Lets a Frozen {LLM} Hear Beyond the Transcript},
author = {Jin, Jie and Ma, Ziyin and Yin, Min and Chen, Jinyu and Song, Haigang and Pang, Zhikun and Zhang, Xiaowen},
booktitle = {Submitted to IEEE ICASSP},
year = {2027}
}
Built by Adventists.ai. Claude (Anthropic) assisted with code.