EOS voice chat
Voice chat lets players communicate in real-time during gameplay. This guide shows you how to integrate Epic Online Services (EOS) Voice with AccelByte Gaming Services (AGS) to enable voice chat in parties, teams, and game sessions.
- How to set up EOS Voice Chat with AGS
- How to add voice chat to parties, teams, and game sessions
- How to control voice features in your game
The AGS CLI is the unified command-line tool for AGS, and it now includes Extend and AMS tooling. The instructions on this page remain valid today. See the AGS CLI documentation to learn about the unified tool.
How it works
The integration uses two components that work together:
- Backend Service - An Extend Service Extension app that generates EOS voice tokens
- Unreal Plugin - Connects players to voice channels using those tokens
When a player joins a party or game session, the game client requests a voice token from the backend service. The backend validates that the player is actually in that party or session, then requests a token from Epic. The player uses that token to join the voice channel.
Voice channel types
The integration supports three types of voice channels:
| Channel | Description | Use case |
|---|---|---|
| Party | Talk with party members | Friends chatting before and during matches |
| Team | Talk with teammates in a session | Tactical team communication |
| Session | Talk with everyone in the match | Lobby chat, casual games |
All channels use non-positional (2D) audio, meaning players hear each other at equal volume regardless of in-game position.
Prerequisites
Before you start, make sure you have:
- An AccelByte Gaming Services account with a game namespace
- An Epic Games Developer Portal account with a product configured
- An Unreal Engine project with the AGS SDK installed
- Docker installed for building and deploying the backend service
Get started
Step 1: Set up Epic Developer Portal
First, configure Epic Online Services to work with AccelByte authentication.
-
Open your product in the Epic Developer Portal.
-
Navigate to Product Settings > Clients and create an OAuth client with:
- Policy Type:
TrustedServer - Permissions: Voice and Connect enabled
Keep the Client ID and Client Secret.
- Policy Type:
-
Note your Deployment ID from the product settings.
-
Navigate to Product Settings > Identity Providers and add an OpenID provider:
Field Value Identity Provider OpenID Description AccelByte Type UserInfo Endpoint UserInfo API Endpoint https://{your-ags-domain}/iam/v3/public/users/meHTTP Method GET AccountId userIdDisplayName displayName
This configuration links AccelByte accounts to Epic, allowing the backend service to generate voice tokens for your players.
Step 2: Deploy the backend service
The backend service handles voice token generation and validates player membership in parties and sessions.
-
Clone the repository:
git clone https://github.com/AccelByte/extend-eos-voice-rtc.git -
In the AGS Admin Portal, go to your namespace and navigate to Extend > Service Extension.
-
Click Create New and provide a name for your app (e.g.,
eos-voice). -
On the app details page, configure the following environment secrets:
Secret Description AB_CLIENT_IDAccelByte OAuth client ID for the service AB_CLIENT_SECRETAccelByte OAuth client secret EPIC_CLIENT_IDEpic Games OAuth client ID EPIC_CLIENT_SECRETEpic Games OAuth client secret EPIC_DEPLOYMENT_IDEpic RTC deployment ID -
Configure the following environment variables:
Variable Value BASE_PATH/eos-voiceEPIC_BASE_URLhttps://api.epicgames.devPLUGIN_GRPC_SERVER_AUTH_ENABLEDtrue -
Build and upload the container image using extend-helper-cli:
export AB_BASE_URL='https://your-ags-domain'
export AB_CLIENT_ID='your-client-id'
export AB_CLIENT_SECRET='your-client-secret'
extend-helper-cli image-upload --login --namespace <namespace> --app <app-name> --image-tag v0.0.1 -
On the app details page, click Deploy Latest Image and wait until the status shows RUNNING.
For AGS Private Cloud:
ADMIN:ROLE [READ]ADMIN:NAMESPACE:{namespace}:NAMESPACE [READ]ADMIN:NAMESPACE:{namespace}:SESSION [READ]ADMIN:NAMESPACE:{namespace}:SESSION:PARTY [READ]ADMIN:NAMESPACE:{namespace}:NOTIFICATION [CREATE]
For AGS Public Cloud:
- IAM > Roles (Read)
- Basic > Namespace (Read)
- Session > Game Session (Read)
- Session > Admin Party (Read)
- Lobby > Notification (Create)
Step 3: Install the Unreal plugin
The Unreal plugin manages voice channel connections and provides a simple API for controlling voice features.
-
Download the AccelByteEOSVoice plugin from the GitHub releases.
-
Copy the plugin to your project's
Plugins/directory. -
Generate the SDK for the backend service using the Extend Codegen CLI. This creates the
AccelByteUe4SdkCustomizationplugin that the voice plugin depends on. -
Enable the required plugins in your
.uprojectfile:{
"Plugins": [
{ "Name": "AccelByteUe4Sdk", "Enabled": true },
{ "Name": "OnlineSubsystemAccelByte", "Enabled": true },
{ "Name": "OnlineSubsystemEOS", "Enabled": true },
{ "Name": "EOSVoiceChat", "Enabled": true },
{ "Name": "AccelByteEOSVoice", "Enabled": true },
{ "Name": "AccelByteUe4SdkCustomization", "Enabled": true }
]
}
Step 4: Configure your project
Add the following configuration to your project's DefaultEngine.ini:
[/Script/AccelByteEOSVoice.AccelByteEOSVoiceConfig]
; Auto-join party voice when creating/joining a party
bAutoJoinPartyVoice=true
; Auto-join team voice when joining a game session
bAutoJoinTeamVoice=false
; Auto-join session-wide voice when joining a game session
bAutoJoinSessionVoice=false
; Auto-generate display names for users without one (format: Player-XXXX)
bAutoGenerateDisplayNameIfEmpty=true
Configure EOS to use OpenID authentication:
[/Script/OnlineSubsystemEOS.EOSSettings]
bUseEAS=false
bUseEOSConnect=true
bUseNewLoginFlow=true
Step 5: Test voice chat
-
Launch your game with two players.
-
Have both players log in and join the same party.
-
Verify that voice communication works between the players.
If voice chat doesn't connect, check the Troubleshooting section.
Control voice features
The plugin provides a simple C++ API for controlling voice features at runtime.
Get the voice subsystem
// Get the voice subsystem from the game instance
UGameInstance* GameInstance = GetWorld()->GetGameInstance();
UAccelByteEOSVoiceSubsystem* VoiceSubsystem =
GameInstance->GetSubsystem<UAccelByteEOSVoiceSubsystem>();
Mute your microphone
// Mute your microphone
VoiceSubsystem->SetAudioInputDeviceMuted(true);
// Unmute your microphone
VoiceSubsystem->SetAudioInputDeviceMuted(false);
Mute your speakers
// Mute all incoming voice (deafen)
VoiceSubsystem->SetAudioOutputDeviceMuted(true);
// Unmute speakers
VoiceSubsystem->SetAudioOutputDeviceMuted(false);
Mute a specific player
// Mute a specific player by their display name
VoiceSubsystem->SetPlayerMuted(TEXT("PlayerName"), true);
// Unmute the player
VoiceSubsystem->SetPlayerMuted(TEXT("PlayerName"), false);
Switch which channel you transmit to
When a player is in multiple voice channels (e.g., party and team), you can control which channel they transmit to:
// Transmit to party channel only
VoiceSubsystem->TransmitToSpecificChannel(
EAccelByteEOSVoiceVoiceChannelType::PARTY);
// Transmit to team channel only
VoiceSubsystem->TransmitToSpecificChannel(
EAccelByteEOSVoiceVoiceChannelType::TEAM);
// Transmit to session channel (all players)
VoiceSubsystem->TransmitToSpecificChannel(
EAccelByteEOSVoiceVoiceChannelType::SESSION);
Access advanced EOS voice features
For advanced functionality, you can access the underlying EOS voice interface:
IVoiceChatUser* VoiceChatUser = VoiceSubsystem->GetVoiceChatUser();
if (VoiceChatUser)
{
// Get list of players in a channel
TArray<FString> Players = VoiceChatUser->GetPlayersInChannel(TEXT("PARTY"));
// Get all joined channels
TArray<FString> Channels = VoiceChatUser->GetChannels();
// Check if currently transmitting
bool bIsTransmitting = VoiceChatUser->IsTransmitting();
}
Troubleshooting
Voice chat not connecting
- Verify the backend service is deployed and showing RUNNING status
- Check that EOS Connect is configured in Epic Developer Portal
- Ensure players have joined a party or session before requesting voice
- Confirm
bAutoJoinPartyVoiceis enabled in your config
Can't hear other players
- Make sure your speakers are not muted in the game
- Verify the other player is in the same voice channel
- Check that both players successfully joined the channel (no errors in logs)
- Ensure
bAutoJoinPartyVoiceorbAutoJoinSessionVoiceis enabled
EOS login fails
Symptoms: Failed to login to EOS voice for LocalUserNum X
Solutions:
- Verify EOS Connect OpenID provider is configured in Epic Developer Portal
- Check that users have a display name (enable
bAutoGenerateDisplayNameIfEmpty=true) - Confirm EOS credentials in
DefaultEngine.ini - Ensure
bUseEOSConnect=trueandbUseNewLoginFlow=true
Epic account not linked (Error 40303)
Symptoms: Backend returns error code 40303
Solutions:
- Configure EOS Connect OpenID provider in Epic Developer Portal (see Step 1)
- Implement account linking in your game using EOS Connect SDK
- For dev/stage environments: add test accounts to an Epic Player Group with the OpenID identity provider
Permission denied on admin endpoints
Admin endpoints (/admin/session/{session_id}/token and /admin/room/{room_id}/token/revoke) require additional permissions.
Admin endpoints are only available in AGS Private Cloud. Custom permissions cannot be created in Public Cloud.
For Private Cloud, add these permissions to your OAuth client:
ADMIN:NAMESPACE:{namespace}:VOICE [CREATE]ADMIN:NAMESPACE:{namespace}:VOICE [DELETE]
Next steps
- Customize the backend service to add custom logic
- Learn about Extend Service Extension architecture
- View the backend service repository for API documentation
- View the Unreal plugin repository for detailed plugin documentation