1
stars
3
commits
1
repos using this model
2
linked in READMEs
Apr 11, 2026
updated
A Whisper-Small-sized audio-captioning model that writes rich, natural-language descriptions of general-purpose sound effects, ambiences, vocal bursts, and music snippets. Given ≤ 30 s of audio it produces a paragraph-length caption describing the content, timbre, and likely source of the sound.
This is the final stage of a multi-step training lineage that stacks emotional speech captioning, generative-audio pre-training, and sound-effect fine-tuning on top of OpenAI's Whisper-Small.
WhisperForConditionalGeneration · Whisper-Small · 241.7 M paramstorchrun · ~9 h wall-clock end-to-end
across three fine-tuning stagesThis checkpoint is the end of a multi-step lineage; every stage starts from the previous one.
checkpoint-35000) – a continued pre-training run on a broad mix of
non-speech audio with Gemini-generated captions:
mitermix/audioset-with-grounded-captions)laion/freesound-commercially-permissive-subset-with-captions)5e-6 linear,
Stage 2 = 3 epochs @ 1e-5 cosine (warmup 2 %), Stage 3 = 5 more epochs @
5e-6 cosine (warmup 5 %). Each stage starts from the best checkpoint of
the previous one, and the validation split is held fixed across all three
so val-loss numbers are directly comparable.All datasets were downloaded, normalised to {mp3, caption} pairs, and pooled
into a single flat directory. Per-dataset counts after filtering:
| Prefix | HuggingFace dataset | Kind | # pairs |
|---|---|---|---|
ad | mitermix/audioset-with-grounded-captions | Re-captioned AudioSet (grounded captions) | ~575 k |
fs | laion/freesound-commercially-permissive-subset-with-captions | Re-captioned Freesound (commercially permissive) | ~265 k |
gn | laion/generated-sound-events | TangoFlux-generated sound events, Gemini-captioned | ~39 k |
iw | laion/in-the-wild-sound-events | In-the-wild sound events | ~28 k |
vb | laion/synthetic_vocal_bursts + other vocal-burst subsets | Synthetic / recorded vocal bursts | ~9 k |
| Total | ~916 k |
From each prefix, 100 random samples were held out as a stable validation split (~500 total), leaving ~915.6 k for training.
| Knob | Stage 1 | Stage 2 | Stage 3 |
|---|---|---|---|
| Init from | captioning-whisper-proof_of_concept checkpoint-35000 | stage-1 final-best | stage-2 final-best |
| Epochs | 1 | 3 | 5 |
| Peak LR | 5e-6 | 1e-5 | 5e-6 |
| LR schedule | linear | cosine | cosine |
| Warmup ratio | 3 % | 2 % | 5 % |
| Per-device batch | 10 | 10 | 10 |
| GPUs | 8 | 8 | 8 |
| Effective batch | 80 | 80 | 80 |
| Precision | fp16 | fp16 | fp16 |
| Eval / save cadence | ~250 k samples | ~500 k samples | ~500 k samples |
| Total training samples | ~915 k | ~2.75 M | ~4.58 M |
| Best val loss | 1.6894 @ step 9 375 | 1.4939 @ step 31 250 | 1.4314 @ step 56 250 |
| Wall clock | ~35 min | ~3 h | ~4 h 47 min |
The stage-3 loss descended monotonically at every eval step — it still had not plateaued at the end of epoch 5, so a further continuation run could likely shave off more.
Stage-3 eval curve (lower is better):
| step | samples seen | val loss |
|---|---|---|
| 6 250 | 500 000 | 1.4898 |
| 12 500 | 1 000 000 | 1.4742 |
| 18 750 | 1 500 000 | 1.4620 |
| 25 000 | 2 000 000 | 1.4512 |
| 31 250 | 2 500 000 | 1.4423 |
| 37 500 | 3 000 000 | 1.4374 |
| 43 750 | 3 500 000 | 1.4336 |
| 50 000 | 4 000 000 | 1.4317 |
| 56 250 | 4 500 000 | 1.4314 |
For reference, the earlier stage-2 run's eval curve on the same held-out set:
| step | samples seen | val loss |
|---|---|---|
| 6 250 | 500 000 | 1.5959 |
| 12 500 | 1 000 000 | 1.5464 |
| 18 750 | 1 500 000 | 1.5144 |
| 25 000 | 2 000 000 | 1.4993 |
| 31 250 | 2 500 000 | 1.4940 |
The final checkpoint uploaded here (model.safetensors) is the stage-3 best
weights from step 56 250, restored via load_best_model_at_end=True at the end
of stage-3 training.
import torch, torchaudio
from transformers import WhisperProcessor, WhisperForConditionalGeneration
REPO = "laion/sound-effect-captioning-whisper"
processor = WhisperProcessor.from_pretrained("openai/whisper-small")
model = WhisperForConditionalGeneration.from_pretrained(REPO).eval().to("cuda")
model.generation_config.forced_decoder_ids = None
# Load any audio ≤ 30 s
wav, sr = torchaudio.load("your_sound.mp3")
if wav.shape[0] > 1: # → mono
wav = wav.mean(dim=0, keepdim=True)
if sr != 16_000: # → 16 kHz
wav = torchaudio.functional.resample(wav, sr, 16_000)
arr = wav.squeeze(0).numpy()[: 16_000 * 30]
feats = processor.feature_extractor(arr, sampling_rate=16_000,
return_tensors="pt").input_features.to("cuda")
with torch.no_grad():
ids = model.generate(feats, max_new_tokens=400, num_beams=1, do_sample=False)
print(processor.batch_decode(ids, skip_special_tokens=True)[0].strip())
Notes:
openai/whisper-small processor (this repo only ships
tokenizer.json + preprocessor_config.json, which are the Whisper-Small
defaults – the processor class needs the bundled chat_template.json /
special-tokens files that live on the base repo).forced_decoder_ids=None is required, otherwise Whisper's transcription
language prompt clamps the decoder into ASR mode and suppresses captioning.All four clips below are drawn from the fixed held-out validation split
(these exact files were never seen during training). They were captioned with
this released checkpoint (stage-3 final-best, step 56 250, val loss 1.4314).
Reference: This file features a low, rumbling vocalization, possibly a groan. There's a sense of strain in the sound, and it's drawn out, not abrupt. The recording appears to be of moderate quality, and no other sound events are discernible. The vocalization does not seem to be musical or speech-related.
Prediction: The audio features a low, guttural vocalization, possibly a groan or a moan. The sound is drawn out and has a somewhat strained quality, suggesting discomfort or effort. The recording is clear, with no noticeable background noise. The vocalization is the primary focus of the audio. The speaker sounds like an adult male.
Reference: Repetitive, high-pitched electronic beeps with a reverberant quality, resembling sonar or a digital alert. This sound could indicate a warning, a scanning process (like sonar), or a futuristic interface sound in a sci-fi context.
Prediction: The audio features a distinct, high-pitched, and sustained electronic tone that rapidly sweeps upwards in frequency, creating a sweeping effect. This is followed by a series of shorter, distinct electronic beeps or pulses, which then transition into a continuous, high-pitched, and somewhat distorted electronic tone. This sounds like a synthesized sound effect, possibly used in electronic music, video games, or as a sound design element to create a sense of tension, transition, or an otherworldly atmosphere.
Reference: The audio features a high-energy, upbeat piece of music. The melody is carried by a synthesizer, with a driving beat provided by electronic drums. A heavy bassline is prominent. There are sections with and without a strong beat. This recording is a song likely meant for dancing, especially as there is a synth melody.
Prediction: The audio features a fast-paced, energetic electronic dance track. A prominent, repetitive synth melody is layered over a driving beat. The overall sound is bright and upbeat. This is a clip from an electronic dance music track, likely intended for dancing or club environments. The hint confirms the presence of music.
Reference: The audio features a continuous, high-pitched whirring sound, which is then joined by a distinct, rhythmic clanking or grinding noise. This clanking/grinding sound is accompanied by a squealing sound that rises in pitch and then quickly descends. The sounds are consistent and repetitive. This sound is indicative of heavy machinery in operation, possibly a large engine or industrial equipment, given the combination of continuous whirring and repetitive clanking/grinding sounds, along with the squealing of moving parts.
Prediction: The audio features a continuous, high-pitched mechanical whine, characteristic of a jet engine. This sound is accompanied by a distinct, rhythmic clanking or grinding noise, suggesting the movement of mechanical parts. The overall sound is loud and sustained. This soundscape is consistent with the operation of a large industrial fan or a powerful engine, possibly from a jet engine or a large vehicle. The combination of whine, grinding, and clanking suggests the movement of heavy machinery or a large mechanical system.
Released under Apache-2.0, following the upstream Whisper license.
The audio clips in examples/ are samples from the five training datasets and
retain their respective upstream licences (see the dataset pages linked
above).
3 commits
1
stars
3
commits
1
repos using this model
2
linked in READMEs
Apr 11, 2026
updated
A Whisper-Small-sized audio-captioning model that writes rich, natural-language descriptions of general-purpose sound effects, ambiences, vocal bursts, and music snippets. Given ≤ 30 s of audio it produces a paragraph-length caption describing the content, timbre, and likely source of the sound.
This is the final stage of a multi-step training lineage that stacks emotional speech captioning, generative-audio pre-training, and sound-effect fine-tuning on top of OpenAI's Whisper-Small.
WhisperForConditionalGeneration · Whisper-Small · 241.7 M paramstorchrun · ~9 h wall-clock end-to-end
across three fine-tuning stagesThis checkpoint is the end of a multi-step lineage; every stage starts from the previous one.
checkpoint-35000) – a continued pre-training run on a broad mix of
non-speech audio with Gemini-generated captions:
mitermix/audioset-with-grounded-captions)laion/freesound-commercially-permissive-subset-with-captions)5e-6 linear,
Stage 2 = 3 epochs @ 1e-5 cosine (warmup 2 %), Stage 3 = 5 more epochs @
5e-6 cosine (warmup 5 %). Each stage starts from the best checkpoint of
the previous one, and the validation split is held fixed across all three
so val-loss numbers are directly comparable.All datasets were downloaded, normalised to {mp3, caption} pairs, and pooled
into a single flat directory. Per-dataset counts after filtering:
| Prefix | HuggingFace dataset | Kind | # pairs |
|---|---|---|---|
ad | mitermix/audioset-with-grounded-captions | Re-captioned AudioSet (grounded captions) | ~575 k |
fs | laion/freesound-commercially-permissive-subset-with-captions | Re-captioned Freesound (commercially permissive) | ~265 k |
gn | laion/generated-sound-events | TangoFlux-generated sound events, Gemini-captioned | ~39 k |
iw | laion/in-the-wild-sound-events | In-the-wild sound events | ~28 k |
vb | laion/synthetic_vocal_bursts + other vocal-burst subsets | Synthetic / recorded vocal bursts | ~9 k |
| Total | ~916 k |
From each prefix, 100 random samples were held out as a stable validation split (~500 total), leaving ~915.6 k for training.
| Knob | Stage 1 | Stage 2 | Stage 3 |
|---|---|---|---|
| Init from | captioning-whisper-proof_of_concept checkpoint-35000 | stage-1 final-best | stage-2 final-best |
| Epochs | 1 | 3 | 5 |
| Peak LR | 5e-6 | 1e-5 | 5e-6 |
| LR schedule | linear | cosine | cosine |
| Warmup ratio | 3 % | 2 % | 5 % |
| Per-device batch | 10 | 10 | 10 |
| GPUs | 8 | 8 | 8 |
| Effective batch | 80 | 80 | 80 |
| Precision | fp16 | fp16 | fp16 |
| Eval / save cadence | ~250 k samples | ~500 k samples | ~500 k samples |
| Total training samples | ~915 k | ~2.75 M | ~4.58 M |
| Best val loss | 1.6894 @ step 9 375 | 1.4939 @ step 31 250 | 1.4314 @ step 56 250 |
| Wall clock | ~35 min | ~3 h | ~4 h 47 min |
The stage-3 loss descended monotonically at every eval step — it still had not plateaued at the end of epoch 5, so a further continuation run could likely shave off more.
Stage-3 eval curve (lower is better):
| step | samples seen | val loss |
|---|---|---|
| 6 250 | 500 000 | 1.4898 |
| 12 500 | 1 000 000 | 1.4742 |
| 18 750 | 1 500 000 | 1.4620 |
| 25 000 | 2 000 000 | 1.4512 |
| 31 250 | 2 500 000 | 1.4423 |
| 37 500 | 3 000 000 | 1.4374 |
| 43 750 | 3 500 000 | 1.4336 |
| 50 000 | 4 000 000 | 1.4317 |
| 56 250 | 4 500 000 | 1.4314 |
For reference, the earlier stage-2 run's eval curve on the same held-out set:
| step | samples seen | val loss |
|---|---|---|
| 6 250 | 500 000 | 1.5959 |
| 12 500 | 1 000 000 | 1.5464 |
| 18 750 | 1 500 000 | 1.5144 |
| 25 000 | 2 000 000 | 1.4993 |
| 31 250 | 2 500 000 | 1.4940 |
The final checkpoint uploaded here (model.safetensors) is the stage-3 best
weights from step 56 250, restored via load_best_model_at_end=True at the end
of stage-3 training.
import torch, torchaudio
from transformers import WhisperProcessor, WhisperForConditionalGeneration
REPO = "laion/sound-effect-captioning-whisper"
processor = WhisperProcessor.from_pretrained("openai/whisper-small")
model = WhisperForConditionalGeneration.from_pretrained(REPO).eval().to("cuda")
model.generation_config.forced_decoder_ids = None
# Load any audio ≤ 30 s
wav, sr = torchaudio.load("your_sound.mp3")
if wav.shape[0] > 1: # → mono
wav = wav.mean(dim=0, keepdim=True)
if sr != 16_000: # → 16 kHz
wav = torchaudio.functional.resample(wav, sr, 16_000)
arr = wav.squeeze(0).numpy()[: 16_000 * 30]
feats = processor.feature_extractor(arr, sampling_rate=16_000,
return_tensors="pt").input_features.to("cuda")
with torch.no_grad():
ids = model.generate(feats, max_new_tokens=400, num_beams=1, do_sample=False)
print(processor.batch_decode(ids, skip_special_tokens=True)[0].strip())
Notes:
openai/whisper-small processor (this repo only ships
tokenizer.json + preprocessor_config.json, which are the Whisper-Small
defaults – the processor class needs the bundled chat_template.json /
special-tokens files that live on the base repo).forced_decoder_ids=None is required, otherwise Whisper's transcription
language prompt clamps the decoder into ASR mode and suppresses captioning.All four clips below are drawn from the fixed held-out validation split
(these exact files were never seen during training). They were captioned with
this released checkpoint (stage-3 final-best, step 56 250, val loss 1.4314).
Reference: This file features a low, rumbling vocalization, possibly a groan. There's a sense of strain in the sound, and it's drawn out, not abrupt. The recording appears to be of moderate quality, and no other sound events are discernible. The vocalization does not seem to be musical or speech-related.
Prediction: The audio features a low, guttural vocalization, possibly a groan or a moan. The sound is drawn out and has a somewhat strained quality, suggesting discomfort or effort. The recording is clear, with no noticeable background noise. The vocalization is the primary focus of the audio. The speaker sounds like an adult male.
Reference: Repetitive, high-pitched electronic beeps with a reverberant quality, resembling sonar or a digital alert. This sound could indicate a warning, a scanning process (like sonar), or a futuristic interface sound in a sci-fi context.
Prediction: The audio features a distinct, high-pitched, and sustained electronic tone that rapidly sweeps upwards in frequency, creating a sweeping effect. This is followed by a series of shorter, distinct electronic beeps or pulses, which then transition into a continuous, high-pitched, and somewhat distorted electronic tone. This sounds like a synthesized sound effect, possibly used in electronic music, video games, or as a sound design element to create a sense of tension, transition, or an otherworldly atmosphere.
Reference: The audio features a high-energy, upbeat piece of music. The melody is carried by a synthesizer, with a driving beat provided by electronic drums. A heavy bassline is prominent. There are sections with and without a strong beat. This recording is a song likely meant for dancing, especially as there is a synth melody.
Prediction: The audio features a fast-paced, energetic electronic dance track. A prominent, repetitive synth melody is layered over a driving beat. The overall sound is bright and upbeat. This is a clip from an electronic dance music track, likely intended for dancing or club environments. The hint confirms the presence of music.
Reference: The audio features a continuous, high-pitched whirring sound, which is then joined by a distinct, rhythmic clanking or grinding noise. This clanking/grinding sound is accompanied by a squealing sound that rises in pitch and then quickly descends. The sounds are consistent and repetitive. This sound is indicative of heavy machinery in operation, possibly a large engine or industrial equipment, given the combination of continuous whirring and repetitive clanking/grinding sounds, along with the squealing of moving parts.
Prediction: The audio features a continuous, high-pitched mechanical whine, characteristic of a jet engine. This sound is accompanied by a distinct, rhythmic clanking or grinding noise, suggesting the movement of mechanical parts. The overall sound is loud and sustained. This soundscape is consistent with the operation of a large industrial fan or a powerful engine, possibly from a jet engine or a large vehicle. The combination of whine, grinding, and clanking suggests the movement of heavy machinery or a large mechanical system.
Released under Apache-2.0, following the upstream Whisper license.
The audio clips in examples/ are samples from the five training datasets and
retain their respective upstream licences (see the dataset pages linked
above).
3 commits