BlocksAssistant
LiveKit voice
Connecting a LiveKit room to the shared voice session. Joining the room and exchanging tokens stays in your app. Once you're connected, the session takes over mute, mode, transcript sync and volume.
Recipe
LiveKit voice
Voice connected
Call publishTranscript for final user and assistant items, and keep high-frequency analyser samples on publishVoiceVolume; volume subscribers do not invalidate the main session state.
Framework adapters
Show code
import { Room, RoomEvent } from "livekit-client";
import { createVoiceSession } from "@grassroot/assistant/adapters/voice";
import { VoiceControl, VoiceOrb } from "@grassroot/ui-react/assistant";
const session = createVoiceSession({
setup: async ({ signal, publishTranscript, publishVoiceVolume, setMode }) => {
const room = new Room();
const token = await fetchVoiceToken({ signal });
await room.connect(token.url, token.token);
room.on(RoomEvent.AudioPlaybackStatusChanged, () => setMode("speaking"));
room.on(RoomEvent.DataReceived, (payload) => {
const item = JSON.parse(new TextDecoder().decode(payload));
if (item.type === "transcript") publishTranscript(item);
if (item.type === "volume") publishVoiceVolume(item.value);
});
return () => room.disconnect();
},
});
<VoiceOrb session={session} variant="default" />
<VoiceControl session={session} />
Show code
const session = createVoiceSession({ setup: connectLiveKitVoice });
<VoiceOrb :session="session" variant="default" />
<VoiceControl :session="session" />
Show code
session = createVoiceSession({ setup: connectLiveKitVoice });
<grassroot-voice-orb [session]="session" variant="default" />
<grassroot-voice-control [session]="session" />
Show code
const session = createVoiceSession({ setup: connectLiveKitVoice });
<VoiceOrb {session} variant="default" />
<VoiceControl {session} />
Show code
const session = createVoiceSession({ setup: connectLiveKitVoice });
<VoiceOrb session={session} variant="default" />
<VoiceControl session={session} />