Skip to content
Merged
Changes from 19 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
f7ff17f
Update voice-chat.md
rbxphogen Jun 12, 2025
4cc43d6
Update content/en-us/chat/voice-chat.md
rbxphogen Jun 12, 2025
179a17d
Update content/en-us/chat/voice-chat.md
rbxphogen Jun 12, 2025
9026fdd
Update voice-chat.md
IgnisRBX Jun 12, 2025
6d8403f
Update content/en-us/chat/voice-chat.md
IgnisRBX Jun 12, 2025
ab831f9
Update content/en-us/chat/voice-chat.md
IgnisRBX Jun 12, 2025
2ab1b6b
Update content/en-us/chat/voice-chat.md
IgnisRBX Jun 12, 2025
3437d6a
Update content/en-us/chat/voice-chat.md
IgnisRBX Jun 12, 2025
ce14bd4
Update content/en-us/chat/voice-chat.md
IgnisRBX Jun 12, 2025
521279e
Update content/en-us/chat/voice-chat.md
IgnisRBX Jun 26, 2025
d94fa1c
Apply suggestions from code review
IgnisRBX Jun 26, 2025
219b044
Update voice-chat.md
IgnisRBX Jun 26, 2025
efed6ee
Update content/en-us/chat/voice-chat.md
IgnisRBX Jun 30, 2025
094ceb1
Merge branch 'main' into rbxphogen-patch-1
IgnisRBX Jun 30, 2025
6d7db80
Update content/en-us/chat/voice-chat.md
rbxphogen Jun 30, 2025
94f09b6
Update content/en-us/chat/voice-chat.md
rbxphogen Jun 30, 2025
040e327
Update content/en-us/chat/voice-chat.md
rbxphogen Jun 30, 2025
d147f93
Update content/en-us/chat/voice-chat.md
rbxphogen Jun 30, 2025
a378e3f
Update content/en-us/chat/voice-chat.md
IgnisRBX Jun 30, 2025
a480d09
Update content/en-us/chat/voice-chat.md
rbxphogen Jun 30, 2025
4d19be8
Update content/en-us/chat/voice-chat.md
rbxphogen Jun 30, 2025
18ba550
Update content/en-us/chat/voice-chat.md
rbxphogen Jun 30, 2025
2b02eca
Update content/en-us/chat/voice-chat.md
rbxphogen Jun 30, 2025
284c513
Merge branch 'main' into rbxphogen-patch-1
IgnisRBX Jun 30, 2025
e275237
Merge branch 'main' into rbxphogen-patch-1
IgnisRBX Jun 30, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
162 changes: 137 additions & 25 deletions content/en-us/chat/voice-chat.md
Original file line number Diff line number Diff line change
@@ -1,65 +1,177 @@
---
title: Voice chat
description: Explains how to use the proximity-based voice chat feature.
title: Voice Chat
description: Explains how to use the Voice Chat feature.
---

<Alert severity="success">
Voice chat is currently available to all 13+ [phone number verified](../production/publishing/account-verification.md#verify-through-phone-number) users in these countries: US, CA, GB, IE, AU, NZ, ES, MX, CL, CR, PR, FR, IT, AT, CHE, DE, JP, KR, CH, AR, COL, PE, DO, GT, UY, SV, HN, PY, NI, EC, BO, VE, PA, PT, and BR. Users **not** in these countries should use [ID verification](https://en.help.roblox.com/hc/en-us/articles/4407282410644) to enable chat with voice. Once verified, eligible 13+ phone verified users can opt‑in to use this feature by visiting their account **Settings** page or from within a voice enabled experience, allowing them to chat with voice in any Roblox experience that supports it. Experiences with voice often see an uplift in engagement, DAU, and spending.
Voice Chat is currently available to all 13+ phone number verified users in a specific set of countries. Review the [Voice Chat FAQ](https://en.help.roblox.com/hc/en-us/articles/4405807645972-Voice-Chat-FAQs) to learn more. Users **not** in these countries should use [ID verification](https://en.help.roblox.com/hc/en-us/articles/4407282410644) to enable chat with voice. Once verified, eligible 13+ phone verified users can opt‑in to use this feature by visiting their account **Settings** page or from within a voice enabled experience, allowing them to chat with voice in any Roblox experience that supports it. Experiences with voice often see an uplift in engagement, DAU, and spending.
</Alert>

**Voice chat** is a proximity-based chat feature that simulates realistic communication based on how close you are to other users who are speaking. The closer you are to another user's avatar, the louder their voice; conversely, the farther away you are, the softer their voice.

Voice chat is only available for places that support a maximum of 50 users.
**Voice Chat** is a feature enabling real-time, spoken communication between yourself and other player characters. It is only available for places that support a maximum of 50 players.

<img src="../assets/players/voice-chat/In-Experience-Example.jpg" width="800" alt="Two users chatting with voice inside an experience" />

## Enable voice chat
## Enable Voice Chat

Before you can enable voice chat in an experience, you must first [publish](../production/publishing/publish-experiences-and-places.md) it, then:
Before you can enable Voice Chat in an experience, you must first [publish](../production/publishing/publish-experiences-and-places.md) it, then:

1. Open your experience in Studio.
1. Open **File**&nbsp;⟩ **Game Settings**.
1. Navigate to the **Communication** tab on the left side of the window.
1. Toggle **Enable Microphone** so the selector turns from gray to green.
1. **(Optional)** For greater communication among users within your experience, toggle on **Enable&nbsp;Camera** to allow eligible users to animate their avatar with their movement.
1. <Chip label="OPTIONAL" size="small" variant="outlined" /> For greater communication among players within your experience, toggle on **Enable&nbsp;Camera** to allow eligible players to animate their avatar with their movement.
1. [Publish](../production/publishing/publish-experiences-and-places.md) the place to save the changes.

Voice chat will now be available to verified 13+ users who opt‑in to the feature, in every place within the experience that's set to a maximum of 50 users.
Voice Chat will now be available to verified 13+ users who opt‑in to the feature, in every place within the experience that's set to a maximum of 50 players.

### Set maximum users
### Set maximum players

If you previously set the maximum number of users in a place to more than 50, you'll need to reduce it to support voice chat.
If you previously set the maximum number of players in a place to more than 50, you'll need to reduce it to support .

1. In the left-hand navigation of the **Game Settings** window, select **Places**. Every place within your experience displays.
1. Click the **&ctdot;** button next to the place with more than 50 players, then select **Configure Place**.
1. In the **Max Players** field, enter any number less than or equal to 50.
1. Click the **Save** button and then [publish](../production/publishing/publish-experiences-and-places.md) to save the changes.

When you update the maximum number of users in a place to fewer than 50, there may be servers already configured to a different, higher number. Since those servers won't support voice chat, it's recommended to [restart servers](../production/publishing/publish-experiences-and-places.md#update-experiences).
When you update the maximum number of players in a place to fewer than 50, there may be servers already configured to a different, higher number. Since those servers won't support Voice Chat, it's recommended to [restart servers](../production/publishing/publish-experiences-and-places.md#update-experiences).

### Customize voice behavior

Voice Chat is **proximity-based** by default, adjusting the volume of participants based on how close they are to each other. However, you can set `Class.VoiceChatService.UseAudioApi|UseAudioApi` to `Enum.AudioApiRollout|Enabled` to take control over how voices are set up and used in your experience.

If `Class.VoiceChatService` does not appear already:

1. Right‑click over any visible service in the **Explorer** window and select **Show&nbsp;Services…** from the context menu.
2. Select `Class.VoiceChatService` in the popup window and click **Insert**. The service appears in the **Explorer** hierarchy.

<img src="../assets/studio/explorer/VoiceChatService.png" width="320" alt="VoiceChatService in Explorer hierarchy" />

3. With `Class.VoiceChatService` selected, ensure that `Class.VoiceChatService.UseAudioApi|UseAudioApi` to `Enum.AudioApiRollout|Enabled` in the **Properties** window. This may already be done for you.

#### Team-based

To implement `Class.Team`-based chat where only teammates can hear one another, you can use the following `Class.Script` within `Class.ServerScriptService`:

```lua title="Team Chat"
local Teams = game:GetService("Teams")

local function findAudioInput(forPlayer : Player) : AudioDeviceInput?
-- Assumes there is only one AudioDeviceInput per player, parented to the Player object
-- This is provided for you if VoiceChatService.EnableDefaultVoice is true
-- May need to be reworked for generality if your place puts AudioDeviceInput objects elsewhere
return forPlayer:FindFirstChildWhichIsA("AudioDeviceInput")
end

local function onTeamChanged(player : Player)
local team = player.Team
if not team then return end

local device = findAudioInput(player)
if not device then return end

-- Only permit teammates to hear each other
device.AccessType = Enum.AccessModifierType.Allow
local allowed = {}
for _, player : Player in team:GetPlayers() do
table.insert(allowed, player.UserId)
end

device:SetUserIdAccessList(allowed)
end

local function onTeamAdded(team : Team)
team.PlayerAdded:Connect(onTeamChanged)
team.PlayerRemoved:Connect(onTeamChanged)
end

for _, team : Team in Teams:GetTeams() do
onTeamAdded(team)
end

Teams.ChildAdded:Connect(function(child : Instance)
if child:IsA("Team") then
onTeamAdded(child)
end
end)
```

#### Non-spatial

You might not want to use the default, proximity-chat behavior. Depending on your experience's needs, it might make more sense to hear others with equal volume, regardless of their geographic location.

If you [disable default Voice Chat](#disable-per-place), you can then implement flat/nonspatial Voice Chat through the following `Class.Script` within `Class.ServerScriptService`:

```lua title="Non-Proximity Chat"
local Players = game:GetService("Players")
local Workspace = game:GetService("Workspace")

local function wireUp(source : Instance, target : Instance)
local wire = Instance.new("Wire")
wire.SourceInstance = source
wire.TargetInstance = target
wire.Parent = source
end

-- Set up a global volume slider for everybody's voice
local volumeSlider = Instance.new("AudioFader", Workspace)
local output = Instance.new("AudioDeviceOutput", Workspace)
wireUp(volumeSlider, output)

local function onPlayerAdded(player : Player)
local device = Instance.new("AudioDeviceInput", player)
device.Player = player
-- Route each new player's microphone input to the global volume slider
wireUp(device, volumeSlider)
end

for _, player in Players:GetPlayers() do
onPlayerAdded(player)
end
Players.PlayerAdded:Connect(onPlayerAdded)
```

The above script runs on the server; it creates an `Class.AudioDeviceInput|AudioDeviceInput` per-player, and connects them all to a shared `Class.AudioFader|AudioFader`.

Taking this behavior as-is allows each player to hear everybody – including themselves! Hearing yourself can be quite distracting: you can place this `Class.LocalScript` in `Class.StarterPlayerScripts` to remove the `Class.Wire|Wires` that would otherwise ferry your own voice back to your own speakers:

```lua title="LocalScript"
local Players = game:GetService("Players")

local player = Players.LocalPlayer

local function onDescendantAdded(descendant : Instance)
if descendant:IsA("Wire") then
descendant:Destroy()
end
end

for _, descendant in player:GetDescendants() do
onDescendantAdded(descendant)
end
player.DescendantAdded:Connect(onDescendantAdded)
```

### Disable per place

If you don't want to enable voice chat for every place within your experience, you can disable it within specific places that would otherwise be voice‑eligible through the `Class.VoiceChatService.EnableDefaultVoice|EnableDefaultVoice` property.
If you don't want to enable Voice Chat for every place within your experience, you can disable it within specific places that would otherwise be voice‑eligible.

<Alert severity="info">
If you're currently setting a place's **Max Players** to a value over 50 in order to disable voice chat, it's recommended to use this workflow instead.
If you're currently setting a place's **Max Players** to a value over 50 in order to disable Voice Chat, it's recommended to use this workflow instead.
</Alert>

To disable voice chat for a specific place within an experience:
To disable Voice Chat for a specific place within an experience:

1. Open the place in Studio.
1. In the toolbar's **Model** tab, click the **Service** icon.
1. Select **VoiceChatService** and click **Insert**.
1. In the [Explorer](../studio/explorer.md) window, select **VoiceChatService**.
1. Right‑click over any visible service in the **Explorer** window and select **Show&nbsp;Services…** from the context menu.
2. Select `Class.VoiceChatService` in the popup window and click **Insert**. The service appears in the **Explorer** hierarchy.

<img src="../assets/studio/explorer/VoiceChatService.png" width="320" alt="VoiceChatService in Explorer hierarchy" />

1. In the [Properties](../studio/properties.md) window, disable the **EnableDefaultVoice** property.
1. Publish the place to save the changes and [restart servers](../production/publishing/publish-experiences-and-places.md#update-experiences) to ensure the change takes effect for all servers currently running your experience.
3. With `Class.VoiceChatService` selected, disable `Class.VoiceChatService.EnableDefaultVoice|EnableDefaultVoice` in the **Properties** window.
4. Publish the place to save the changes and [restart servers](../production/publishing/publish-experiences-and-places.md#update-experiences) to ensure the change takes effect for all servers currently running your experience.

## Check voice chat status
## Check status

You can check if a user has enabled voice chat by calling `Class.VoiceChatService:IsVoiceEnabledForUserIdAsync()|IsVoiceEnabledForUserIdAsync()` in a `Class.LocalScript`, or in a `Class.Script` with `Class.BaseScript.RunContext|RunContext` set to `Enum.RunContext.Client`.
You can check if a player has enabled Voice Chat by calling `Class.VoiceChatService:IsVoiceEnabledForUserIdAsync()|IsVoiceEnabledForUserIdAsync()` in a `Class.LocalScript`, or in a `Class.Script` with `Class.BaseScript.RunContext|RunContext` set to `Enum.RunContext.Client`.

```lua title="Client Script - Check Voice Chat Status"
local Players = game:GetService("Players")
Expand All @@ -71,6 +183,6 @@ local success, enabled = pcall(function()
return VoiceChatService:IsVoiceEnabledForUserIdAsync(localPlayer.UserId)
end)
if success and enabled then
print("Voice chat enabled!")
print("Voice Chat enabled!")
end
```