Original source
---
id: audio-generation-alms
title: Music Generation and Audio-Language Models
code: MG
subtitle: Codec tokens, MusicGen, audio encoders and projectors, Thinker and Talker, TTFAB budgets and audio pitfalls.
hue: 285
sources: phases/06-speech-and-audio/09-music-generation, phases/06-speech-and-audio/10-audio-language-models, phases/08-generative-ai/11-audio-generation, phases/12-multimodal-ai/19-audio-language-whisper-to-af3, phases/12-multimodal-ai/20-omni-models-thinker-talker
source_hash: 453110680f89bafa
---
## Audio becomes codec tokens
type: architecture
from: phases/08-generative-ai/11-audio-generation/docs/en.md
```arch
node | wave | 1,1 | Waveform | 16-48 kHz | client
node | enc | 2,1 | Encoder conv | per-timestep vector | process
node | rvq | 3,1 | RVQ | 8 codebooks at 75 Hz | store
node | gen | 3,2 | Generator | token-AR or diffusion | model
node | dec | 2,2 | Codec decoder | tokens to audio | process
node | out | 1,2 | Audio out | |
edge | wave | enc |
edge | enc | rvq | vectors
edge | rvq | gen | indices
edge | gen | dec | new tokens
edge | dec | out |
```
## Numbers that matter
type: concepts
from: phases/08-generative-ai/11-audio-generation/docs/en.md, phases/06-speech-and-audio/09-music-generation/docs/en.md, phases/12-multimodal-ai/19-audio-language-whisper-to-af3/docs/en.md, phases/12-multimodal-ai/20-omni-models-thinker-talker/docs/en.md
- **Codec rate**: 8 RVQ codebooks at 75 Hz give 600 tokens/sec.
- **Stream floor**: at 75 tokens/second, generate ≥75 tokens/sec per user.
- **Talker floor**: 50 Hz speech tokens need ≥50 tok/s from the Talker.
- **Codebook**: 1024 or 2048 entries is typical.
- **MusicGen codec**: EnCodec at 32 kHz with 4 codebooks.
- **Log-Mel shape**: 30 s at 100 Hz frame rate gives (3000, 80).
- **Round trip**: below 500ms, the user stops noticing the lag.
## Two generator families
type: concepts
from: phases/08-generative-ai/11-audio-generation/docs/en.md, phases/06-speech-and-audio/09-music-generation/docs/en.md
- **Token-autoregressive**: a decoder-only transformer over flattened RVQ tokens.
- **Delayed parallel**: MusicGen emits K codebook streams with per-stream offsets.
- **VALL-E**: speech tokens from a text prompt and a 3-second voice sample.
- **Latent diffusion**: Stable Audio Open works on compressed audio. Good for loops.
- **Flow matching**: Stable Audio 2.5 uses it on continuous audio latents.
- **Trend**: flow matching wins for music. Token-AR dominates speech.
## MusicGen, melody and FAD
type: annotated-code
lang: python
from: phases/06-speech-and-audio/09-music-generation/docs/en.md
```python
from audiocraft.models import MusicGen
model = MusicGen.get_pretrained("facebook/musicgen-small") # 300M, fast
model.set_generation_params(duration=10) # seconds of audio
wav = model.generate(["upbeat synthwave with driving drums, 128 BPM"])
torchaudio.save("out.wav", wav[0].cpu(), 32000) # 32 kHz output
melody, sr = torchaudio.load("humming.wav")
wav = model.generate_with_chroma( # keeps the tune, swaps timbre
["jazz piano cover"], melody.squeeze(), sr)
from frechet_audio_distance import FrechetAudioDistance
fad = FrechetAudioDistance() # VGGish embedding distance
fad.get_fad_score("generated_folder/", "reference_folder/") # lower is better
```
## Audio-language model template
type: flow
from: phases/06-speech-and-audio/10-audio-language-models/docs/en.md
1. **Audio encoder**: Whisper encoder, BEATs, CLAP or WavLM makes features.
2. **Projector**: a linear layer or MLP maps features into the LLM embedding space.
3. **LLM**: a decoder reads interleaved text and audio tokens and writes text.
4. **Stage 1**: freeze encoder and LLM. Train the projector on ASR or captioning data.
5. **Stage 2**: full or LoRA fine-tune on instruction audio tasks.
6. **Stage 3**: optional. Add a speech decoder for voice-in and voice-out.
## Projector and audio Q-former
type: annotated-code
lang: python
from: phases/06-speech-and-audio/10-audio-language-models/docs/en.md, phases/12-multimodal-ai/19-audio-language-whisper-to-af3/code/main.py
```python
class AudioProjector(nn.Module):
def __init__(self, audio_dim=1280, llm_dim=4096):
super().__init__()
self.down = nn.Linear(audio_dim, llm_dim) # audio to LLM width
self.act = nn.GELU()
self.up = nn.Linear(llm_dim, llm_dim)
def forward(self, audio_features):
return self.up(self.act(self.down(audio_features)))
qf = QFormer(n_queries=8, hidden=20) # N=8 queries
tokens = qf.forward(frames) # 99 frames in, 8 tokens out
```
## Log-Mel and encoder settings
type: defaults
from: phases/12-multimodal-ai/19-audio-language-whisper-to-af3/docs/en.md, phases/12-multimodal-ai/19-audio-language-whisper-to-af3/code/main.py
| Setting | Default | Note |
|---|---|---|
| Sample rate | 16 kHz | Resample first |
| Window | 25ms | `win_ms: int = 25` |
| Hop | 10ms | `hop_ms: int = 10` |
| Mel filters | 80 | 0-8000 Hz |
| Log compress | `math.log(1 + x)` | Dynamic range |
| Q-former queries | 32 or 64 | AF3 uses 64 |
| Whisper encoder | 12-layer | Frozen in the ALM pattern |
## Thinker and Talker
type: architecture
from: phases/12-multimodal-ai/20-omni-models-thinker-talker/docs/en.md
```arch
node | mic | 1,1 | Mic and VAD | speech tokens | client
node | think | 2,1 | Thinker | 7B-80B, TMRoPE | model
node | talk | 3,1 | Talker | 200M-1B | model
node | dec | 3,2 | Speech decoder | SNAC, MoVQGAN | process
node | spk | 2,2 | Speakers | audio samples | client
edge | mic | think | audio tokens
edge | think | talk | text tokens
edge | talk | dec | RVQ indices
edge | dec | spk | stream
```
## TTFAB budget at 7B
type: defaults
from: phases/12-multimodal-ai/20-omni-models-thinker-talker/docs/en.md, phases/12-multimodal-ai/20-omni-models-thinker-talker/code/main.py
| Setting | Default | Note |
|---|---|---|
| Mic to audio tokens | 40-80ms | Streams |
| Prefill | 100-200ms | Much more at 70B |
| First Thinker text token | 40ms | Grows with Thinker size |
| Talker on first text token | 20ms | At least 15ms in the lesson model |
| First speech tokens commit | 40ms | Before residual-VQ decode |
| Residual-VQ decode | 30ms | `rvq_decode = 30` |
| Speech waveform decode | 50-80ms | `wave_decode = 70` |
| Total TTFAB | 320-490ms | 600-900ms at 70B |
## Troubleshooting
type: troubleshooting
from: phases/06-speech-and-audio/09-music-generation/docs/en.md, phases/06-speech-and-audio/10-audio-language-models/docs/en.md, phases/08-generative-ai/11-audio-generation/docs/en.md
| Symptom | Cause | Fix |
|---|---|---|
| Music loops past 30 s | AR models loop | Crossfade, or use ACE-Step |
| Tempo leaves the BPM | Models wander | BPM tags, librosa `beat_track` |
| Mushy sung words | Open models are weak on lyrics | Commercial API or fine-tune |
| Hallucinations on silence | Whisper encoder issue | VAD-gate |
| Speakers mixed past 10 minutes | Long-audio degradation | Diarize first, then summarize |
| Multi-audio near 25% | Random-chance level | Do not trust "which clip" tasks |
| Errors from RVQ layer 1 spread | RVQ error accumulation | Temperature 0 on higher layers |
| Artifacts at clip joins | Crossfade boundaries | Careful overlap-add |
## Tasks in code
type: task-table
span: 2
from: phases/06-speech-and-audio/10-audio-language-models/docs/en.md, phases/06-speech-and-audio/10-audio-language-models/code/main.py, phases/12-multimodal-ai/19-audio-language-whisper-to-af3/code/main.py, phases/12-multimodal-ai/20-omni-models-thinker-talker/code/main.py, phases/08-generative-ai/11-audio-generation/code/main.py, phases/08-generative-ai/11-audio-generation/docs/en.md
| Task | Code |
|---|---|
| Load the ALM processor | `AutoProcessor.from_pretrained("Qwen/Qwen2.5-Omni-7B")` |
| Generate an answer | `model.generate(**inputs, max_new_tokens=200)` |
| Load MMAU-Pro | `load_dataset("gamma-lab-umd/MMAU-Pro", split="test")` |
| Score MMAU-Pro officially | `evaluate_mmau_pro_comprehensive.py` |
| Cut audio into frames | `window_frames(wave, 16000, 25, 10)` |
| List TTFAB parts | `ttfab(cfg)` |
| Sample codec tokens | `generate(counts, style, start, length, rng, temperature=1.0)` |
## Q&A
type: qa
from: phases/12-multimodal-ai/19-audio-language-whisper-to-af3/docs/en.md, phases/12-multimodal-ai/20-omni-models-thinker-talker/docs/en.md
- **When is a cascade enough?** Transcription is the goal, with no music and no emotion.
- **When do I need end-to-end?** Music, emotion, multi-speaker or complex audio reasoning.
- **What does a cascade lose?** Mood, speaker identity, timing and deepfake cues.
- **Why a small Talker?** A 7B Talker falls behind the 50 tok/s floor.
- **Why TMRoPE?** It gives each token an absolute timestamp. Vision, audio and text align.
- **Half or full duplex?** Qwen2.5-Omni is half-duplex by default. Moshi supports full-duplex.
## Tips
type: tips
from: phases/06-speech-and-audio/09-music-generation/docs/en.md, phases/06-speech-and-audio/10-audio-language-models/docs/en.md, phases/08-generative-ai/11-audio-generation/docs/en.md
- To ship safely, generate instrumental only.
- Tag each generation with watermarks and metadata.
- Report each MMAU-Pro `category` separately.
- Check the codec first. It caps output quality. DAC is the current open best.
- For voice cloning, add abuse detection and opt-out lists.