P21 audio graft — cumulative step 20015
This is a self-contained private candidate-only artifact. It is not promotion-authorized. It bundles the trained Qwen3-ASR audio tower and 1024→4096→5120 projector together with a complete Qwen-SEA-LION decoder and the Qwen3-ASR processor/tokenizer metadata.
Status and component ownership
- Canonical checkpoint: global step 20015 / P3 step 11663 /
step_011663_1788219301611403443. - Audio Tower: trained, 314,328,704 parameters.
- Audio projector: trained, 25,166,848 parameters.
- SEA-LION decoder: frozen during P3 and bundled as its complete canonical shard set.
candidate_only=true,promotion_authorized=false,language_hint=null.
Repository storage is preparation and provenance preservation only. It is not model promotion, production approval, public release, or authorization to begin P4 training.
Load
import sys
from pathlib import Path
from huggingface_hub import snapshot_download
root = Path(snapshot_download(
"LLJYY/p21-qwen3-asr-sealion-step-20015-full", revision="<immutable-commit>"
))
sys.path.insert(0, str(root))
from loader.modeling_p21_audio_graft import P21AudioGraftModel
model = P21AudioGraftModel.from_pretrained(root)
processor = model.load_audio_processor()
tokenizer = model.load_tokenizer()
decoder = model.load_decoder(device_map="auto", dtype="auto")
For local use, replace the repository ID with the release directory. The loader resolves either a
local directory or one huggingface_hub.snapshot_download snapshot, instantiates
Qwen3ASREncoder from the unified config.json audio_config, and strict-loads both trained
safetensor files. The projector is exactly bias-free RMSNorm(eps=1e-5), Linear(1024,4096),
squared-ReLU, Linear(4096,5120).
Prompt-embedding generation path
- Supply mono 16 kHz audio to
model.process_audio(..., 16000, language_hint=None). - Call
model.encode_audio(input_features, input_features_mask)for decoder-width audio embeds. - Build the exact task-owned SEA-LION prefix/suffix token IDs and map them through
decoder.get_input_embeddings(). - Call
model.generate_with_audio_embeddings(prefix_embeddings=..., audio_embeddings=..., suffix_embeddings=..., **generation_kwargs).
Prompt segmentation is deliberately caller-owned: the decoder does not natively accept audio and
this release does not invent language hints,
forced language prefixes, transcripts, or request text. Do not use language values other than
None on the no-hint audio path.
Local packaging verification used one real 16 kHz speech sample and the existing prompt-embedding
decoder path; this is a smoke test, not a capability evaluation. See provenance.json for exact
run/component bindings and MANIFEST.sha256 for portable staged-file hashes.