Migrate Whisper to AudioProcessor + add the audio-processor test harness
First model migration, establishing the pattern the remaining 29 follow:
- `WhisperAudioProcessorNumpy` (`NumpyAudioBackend`) and `WhisperAudioProcessor`
(`TorchAudioBackend`) declare the frontend as a `SpectrogramConfig` instead of
reimplementing STFT/mel/log framing.
- `WhisperFeatureExtractor` becomes a deprecated alias of `WhisperAudioProcessor`,
so existing code and `feature_extractor_type` checkpoints keep working.
- The `whisper` auto entry — and the six model types that reuse the Whisper
frontend (audioflamingo3, glmasr, qwen2_5_omni, qwen2_audio, qwen3_omni_moe,
voxtral) — now resolve to the new torch/numpy pair.
`tests/test_audio_processing_common.py` adds `AudioProcessingTestMixin`, the
shared contract every migrated model is tested against, replacing the
per-model `test_feature_extraction_*.py` copies.
`tests/test_audio_processing_backends.py` pins the numpy and torch backends to
each other and to librosa/torchaudio/kaldi/scipy; it lives here rather than with
the backends themselves because it needs a concrete model config to exercise.
The torch processor imports torch behind `is_torch_available()`, matching the
hygiene recently applied to the legacy feature extractors.
Note: `test_feature_extraction_whisper.py` is removed, which drops
`test_torch_extract_fbank_features_contiguous_magnitudes` added on main. That
test guarded a slow strided matmul caused by slicing the trailing STFT frame
*before* the mel projection; the new pipeline applies `skip_last_frame` after
the projection, so the strided path no longer occurs.