Sound and music - the Audio API (AudioPlayer, AudioEmitter, AudioListener, AudioDeviceOutput, Wire, effects, faders), classic Sound/SoundGroup, 2D vs 3D audio, music and SFX volume, client vs server playback, asset permissions, streaming caveats, voice routing, text-to-speech. Use when adding music, sound effects, spatial audio, mixing, or fixing sounds that don't play.
Installs into .claude/skills of the current project.
Are you the author of Roblox Audio?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/el4cteo-roblox-audio)
---
name: roblox-audio
description: Sound and music - the Audio API (AudioPlayer, AudioEmitter, AudioListener, AudioDeviceOutput, Wire, effects, faders), classic Sound/SoundGroup, 2D vs 3D audio, music and SFX volume, client vs server playback, asset permissions, streaming caveats, voice routing, text-to-speech. Use when adding music, sound effects, spatial audio, mixing, or fixing sounds that don't play.
---
# Roblox audio
Two systems coexist:
- **Audio API** (modular, current): `AudioPlayer` → `Wire` → (`AudioEmitter` … `AudioListener`) → `Wire`
→ `AudioDeviceOutput`, with effect objects inserted in the chain. Required for voice-chat processing,
mixing graphs, analyzers, text-to-speech/speech-to-text.
- **`Sound`** (classic, still supported): one object, parented to a part for 3D or to `SoundService`/UI for 2D;
routed through `SoundGroup`s with `SoundEffect` children. Fine for simple games and existing code.
Don't mix both for the same feature; follow what the project uses.
## 2D audio (music, UI) with the Audio API
```luau
--!strict
-- Client: build a music player once.
local SoundService = game:GetService("SoundService")
local player = Instance.new("AudioPlayer")
player.Name = "Music"
player.Asset = "rbxassetid://1843463175" -- AudioPlayer.AssetId is deprecated; use Asset
player.Looping = true
player.Volume = 0.5
player.Parent = SoundService
local fader = Instance.new("AudioFader") -- one place to control music volume (settings menu)
fader.Name = "MusicVolume"
fader.Parent = SoundService
local output = Instance.new("AudioDeviceOutput")
output.Parent = SoundService
local function wire(source: Instance, target: Instance)
local w = Instance.new("Wire")
w.SourceInstance = source
w.TargetInstance = target
w.Parent = target
end
wire(player, fader)
wire(fader, output)
player:Play()
```
## 3D audio with the Audio API
- Put an `AudioEmitter` on the sound's part/attachment; wire `AudioPlayer → AudioEmitter`.
- Listening: `SoundService.ListenerLocation` controls the default `AudioListener` (camera or character);
wire `AudioListener → AudioDeviceOutput` (done automatically in default setups).
- Distance falloff and directionality are set on the emitter/listener (`AudioEmitter:SetDistanceAttenuation`,
the `AudioInteractionGroup` string property on emitters and listeners scopes who hears what).
## Classic Sound quick reference
```luau
--!strict
local SoundService = game:GetService("SoundService")
local sfxGroup = Instance.new("SoundGroup")
sfxGroup.Name = "SFX"
sfxGroup.Volume = 0.8
sfxGroup.Parent = SoundService
local function playAt(part: BasePart, soundId: string)
local sound = Instance.new("Sound")
sound.SoundId = soundId
sound.SoundGroup = sfxGroup
sound.RollOffMaxDistance = 80
sound.Parent = part -- 3D: plays from the part; parent to SoundService/UI for 2D
sound:Play()
sound.Ended:Once(function()
sound:Destroy()
end)
end
return playAt
```
- `SoundService:PlayLocalSound(sound)` for client-only UI clicks.
- Preload critical sounds: `ContentProvider:PreloadAsync({ sound })` (not everything — slows joins).
- Pool frequently played sounds instead of creating one per shot.
## Where to play
- Sounds started **on the client** are heard only by that client (UI, local feedback, music tracks
the player chose). Sounds started **on the server** replicate to everyone (use sparingly; prefer a
remote telling clients to play locally, which also lets each client apply its own volume settings).
- With `SoundService.RespectFilteringEnabled = true` (default), client-played sounds don't replicate.
- Streaming: a sound or emitter in a part that streams out stops. Keep ambient audio in persistent
models or `SoundService`.
## Assets and permissions
- Use audio you own, uploaded to the same owner (user/group) as the experience, or Creator Store
audio marked free-to-use. Private audio from other creators won't play unless shared with your
experience (asset permissions). Check the Output for "failed to load" / permission errors.
- Uploads are auto-classified as sound effects or songs; eligible songs can show on the game page.
## Extras
- Effects: `AudioEqualizer`, `AudioCompressor`, `AudioReverb`, `AudioEcho`, `AudioChorus`, `AudioDistortion`,
`AudioFlanger`, `AudioPitchShifter`, `AudioTremolo`, `AudioFilter`, `AudioLimiter`, `AudioAnalyzer` (read
loudness/spectrum for visualizers).
- `AudioTextToSpeech` (artificial voices) and `AudioSpeechToText` (transcription).
- Voice chat: each player's `AudioDeviceInput` can be wired through effects (radios, walkie-talkies,
proximity) — see the voice chat docs; respect players' voice settings.
- Give players separate Music/SFX volume sliders (faders or SoundGroups) and a mute option.
## Related skills
`roblox-ui` (settings menus), `roblox-architecture` (client vs server), `roblox-performance` (audio memory).