import { useMemo, useState } from "react"; import { StreamStatus, useAudioStreamer } from "./hooks/useAudioStreamer"; import { StatusBadge } from "./components/StatusBadge"; import SessionControls from "./components/SessionControls"; import StatBoard from "./components/StatBoard"; import TranscriptSurface from "./components/TranscriptSurface"; const DEFAULT_WS_URI = import.meta.env.VITE_WS_URI ?? "ws://localhost:8000/ws"; const statusHint: Record = { idle: "Ready to connect.", "requesting-permission": "Requesting microphone access...", connecting: "Connecting to the backend...", recording: "Streaming audio...", error: "An error occurred.", }; export default function App() { const [wsUri, setWsUri] = useState(DEFAULT_WS_URI); const { status, transcript, error, stats, isRecording, start, stop, clearTranscript } = useAudioStreamer(wsUri); const statusDescription = useMemo(() => statusHint[status], [status]); const isBusy = status === "requesting-permission" || status === "connecting"; const showReset = wsUri !== DEFAULT_WS_URI; const handleToggleStreaming = async () => { if (isRecording) { await stop(); return; } clearTranscript(); await start(); }; const handleStop = async () => { await stop(); }; const handleResetEndpoint = () => { setWsUri(DEFAULT_WS_URI); }; return (
Docs
Gemini Live API

Cosmic Flow

A real-time audio streaming interface powered by Google Gemini.

{statusDescription}

Session Controls

Configure and manage your audio stream.

); }