Sources¶
Objects that produce a stream on an Output pin.
AudioPlayer¶
Plays an audio asset. This replaces Sound.
| Property | Type | Notes |
|---|---|---|
Asset |
ContentId | "rbxassetid://123". Loads at once if AutoLoad is on. (AssetId is the deprecated old name, still shown as "AssetID" in some tutorials.) |
AutoLoad |
bool | Load when Asset is set. If off, the asset loads on the first Play(). |
AutoPlay |
bool | Start when it first enters the DataModel. Only for players created or loaded locally, not ones that arrive by replication. Mostly for Studio. |
Volume |
float | 0–10 |
PlaybackSpeed |
double | 0–20. Changes pitch too. |
Looping |
bool | |
PlaybackRegion |
NumberRange | Start and stop seconds within the asset. Min = max means the whole asset. |
LoopRegion |
NumberRange | Loop points inside PlaybackRegion. Min = max means use PlaybackRegion. |
TimePosition |
double | Playhead in seconds. Read or write. |
TimeLength |
double | Read-only. Length of the loaded asset. |
IsPlaying |
bool | Read-only to scripts, but it replicates. Change it with Play() / Stop(). |
IsReady |
bool | Read-only. Loaded and buffered. It can go false under extreme memory pressure. |
| Method / event | Notes |
|---|---|
Play(atTime?) → actionId? |
Plays from the current TimePosition. Replicates from server to client. With atTime, the play is scheduled against SoundService:GetMixerTime() for sample-accurate timing. |
Stop(atTime?) → actionId? |
Stops where the playhead is. It works like a pause: set TimePosition = 0 to rewind. Can be scheduled the same way. |
Cancel(actionId) → bool |
Cancels a scheduled Play or Stop that has not happened yet. |
GetWaveformAsync(timeRange, samples) → {number} |
Volume samples over a time range without playing. Use it for waveform UIs or to pre-plan lip sync. Yields. |
Ended |
Fires when playback reaches the end. Not for loops, and not when you call Stop(). To catch every stop, watch IsPlaying with GetPropertyChangedSignal. |
Looped |
Fires on each natural loop. A manual TimePosition jump doesn't count. |
Asset permissions
An audio asset only plays in experiences allowed to use it, meaning ones owned by the asset's creator or granted access. If an asset is silent and never becomes IsReady, check its permissions before your wiring.
AudioDeviceInput¶
A physical microphone as a stream. Voice chat creates one per voice-eligible player under their Player object (see Voice chat), and you can create your own.
| Property | Type | Notes |
|---|---|---|
Player |
Player | Whose mic this is. Set it on the server so it replicates. Setting it locally only works when the value is Players.LocalPlayer. |
Muted |
bool | Scriptable mute. Local push-to-talk sets it on the client, and round-based muting sets it on the server. |
Active |
bool | Read-only to you. Roblox core scripts set it from the player's own mic toggle. Sound flows only when Active and not Muted. |
Volume |
float | 0–3 |
AccessType |
AccessModifierType |
Allow means only the listed users can hear this mic. Deny means the listed users cannot. Set it on the server. |
| Method | Notes |
|---|---|
SetUserIdAccessList({userId}) |
The list that AccessType applies to. Call it from the server, which replicates it. |
GetUserIdAccessList() |
Read it back. |
The access list controls who receives the voice stream at all, in every graph, not just proximity chat. If you put someone on a team-only allow list, they can't hear that mic over your radio either.
Echo cancellation, noise suppression and gain control exist internally but are Roblox-only and not scriptable.
AudioTextToSpeech¶
Generates speech from text. It works like an AudioPlayer whose "asset" is a sentence.
| Property | Type | Notes |
|---|---|---|
Text |
string | Up to 300 characters per request. Must follow the Community Standards. |
VoiceId |
string | See the voice table below. |
AutoLocalize |
bool | Default true. Translates Text into each player's language and routes it to the matching voice (same gender). Supports Arabic, Chinese (Mandarin), English, French, German, Hindi, Italian, Japanese, Korean, Portuguese and Spanish. |
Pitch |
float | −12 to +12 semitones |
Speed |
float | 0.5–2 (speaking rate, pitch kept) |
PlaybackSpeed |
float | 0–20 (tape speed, pitch changes) |
Volume |
float | 0–3 |
Looping, TimePosition, TimeLength |
Same as AudioPlayer |
|
IsLoaded |
bool | Read-only. Speech is generated and buffered. |
IsPlaying |
bool | Read-only, but replicates |
| Method / event | Notes |
|---|---|
LoadAsync() → AssetFetchStatus |
Generates speech now and yields until it succeeds or fails. Call it ahead of time to avoid a gap before speaking. |
Play() / Pause() |
They replicate from server to client. There is no Stop: use Pause and set TimePosition = 0. |
Unload() |
Frees the generated audio. |
GetWaveformAsync(timeRange, samples) |
Volume samples of the generated speech |
Ended, Looped |
Same rules as AudioPlayer |
Throttles: at most 1 + 6 × concurrent users requests per minute per experience, and 4 requests per second per user on the client. You can buy more through Extended Services.
Voice IDs
| ID | Voice | ID | Voice |
|---|---|---|---|
| 1 | British male | 2 | British female |
| 3 | US male #1 | 4 | US female #1 |
| 5 | US male #2 | 6 | US female #2 |
| 7 | Australian male | 8 | Australian female |
| 9 | Retro #1 | 10 | Retro #2 |
| 11 | Host voice | ||
| 101 | Spanish male | 102 | Spanish female |
| 201 | German male | 202 | German female |
| 301 | Italian male | 302 | Italian female |
| 401 | French male | 402 | French female |
| 501 | Mandarin male | 502 | Mandarin female |
| 601 | Hindi male | 602 | Hindi female |
| 701 | Japanese male | 702 | Japanese female |
| 801 | Arabic male | 802 | Arabic female |
| 901 | Korean male | 902 | Korean female |
| 1001 | Portuguese male | 1002 | Portuguese female |
AudioListener (as a source)¶
A listener's Output pin carries everything it hears, already spatialized. It is usually wired to an AudioDeviceOutput, but it can also feed effects, an analyzer, or another emitter (a relay, like a baby monitor). See Spatial audio.
VideoPlayer¶
VideoPlayer is wirable: its soundtrack can be wired into the audio graph like any other source, for example to an AudioEmitter on the screen part. Start videos on the client where you can, because a server-started video is not guaranteed to be loaded or in sync on every client.