Mel features [frames, 128] f32 (row-major, all frames valid) → language-space soft tokens [1, nSoft, textHidden] f32, PRE-DIVIDED by embedScale (forwardEmbeddings re-multiplies — vision-tower convention; the T1 golden is the UN-divided embed_audio output, so the parity test re-multiplies). nSoft = ceil(ceil(frames/2)/2)… i.e. two stride-2 convs.
preDivide=false returns the RAW f32 embed_audio output (the T1 golden
reference point). The T2 merge path needs it because the oracle divides
AFTER the bf16 cast — features.astype(bf16) / embed_scale, where mlx's
weak python scalar takes the array dtype, i.e. a bf16(embedScale)
divisor (verified against the oracle venv). Dividing here in f32 and
casting after is up to a bf16 ulp different, which the exact greedy
gate does not tolerate — the builder casts first, then divides via
scalarLike (same weak-scalar semantics).
StaticloadLoad the audio_tower.* + embed_audio.* tensors from the bf16
sidecar. embedScale = the language model's embed_scale
(= sqrt(textHidden)); features come out pre-divided by it.
Immutable encoder weights and computation settings, hashed once on use.