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

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} />