Active speaker detection is enabled by default on all V100 meetings. Listen for speaker change events to drive your UI layout, auto-zoom, or simulcast layer priority.
// npm install v100-sdk
import { V100 } from 'v100-sdk';
const v100 = new V100('YOUR_API_KEY');
// Create meeting with speaker detection configured
const session = await v100.meetings.create({
name: 'Team Standup',
activeSpeaker: {
enabled: true, // Default: true
smoothingAlpha: 0.3, // EMA factor (0.1 = stable, 0.5 = fast)
minSwitchTime: 1000, // 1s minimum between switches
holdTime: 500, // 500ms hold after speaker stops
rankedCount: 4, // Top N speakers in ranked list
autoZoom: true // Enable auto-zoom on active speaker
}
});
// Join and listen for speaker events
const meeting = await v100.meetings.join(session.id);
// Active speaker changed
meeting.on('activeSpeaker', (event) => {
console.log(`Active speaker: ${event.participantId}`);
console.log(`Level: ${event.smoothedLevel}`);
// Update UI: enlarge this participant's tile
highlightSpeaker(event.participantId);
});
// Ranked speakers list updated
meeting.on('rankedSpeakers', (event) => {
console.log(`Top speakers:`, event.speakers);
// event.speakers → [
// { participantId: "user_a", level: 0.82, rank: 1 },
// { participantId: "user_b", level: 0.45, rank: 2 },
// { participantId: "user_c", level: 0.31, rank: 3 },
// { participantId: "user_d", level: 0.12, rank: 4 }
// ]
});
// Audio level beacons (for custom visualizations)
meeting.on('audioLevel', (event) => {
// event.participantId, event.rawLevel, event.smoothedLevel
updateAudioMeter(event.participantId, event.smoothedLevel);
});
curl -X POST https://api.v100.ai/v1/meetings \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Team Standup",
"activeSpeaker": {
"smoothingAlpha": 0.3,
"minSwitchTime": 1000,
"holdTime": 500,
"rankedCount": 4,
"autoZoom": true
}
}'