Getting Started
Components
- Agent Status
- Agent Template Card
- API Key Card
- Audio Player
- Bar Visualizer
- Channel Status Card
- Chat Composer
- Code Editor
- Condition Builder
- Confirm Dialog
- Conversation
- Conversation Bar
- Dataset Card
- Document Status Badge
- Extraction Strategy Select
- File Icon
- File Upload
- Indexing Progress
- Live Waveform
- Matrix
- Message
- Mic Selector
- Model Diff View
- Model Selector
- Model Type Filter
- Node Catalog
- Option Editor
- Orb
- Output Variables View
- Package Card
- Prompt Editor
- Provider Status Card
- Radio Card
- Resource Card
- Resource Sidebar
- Response
- Run Node List
- Scrub Bar
- Segment Card
- Shimmering Text
- Speech Input
- Token Trend Chart
- Tool Call Card
- Transcript Viewer
- Usage Stat Card
- Variable Binding Editor
- Variable Selector
- Voice Button
- Voice Picker
- Waveform
- Workflow Node Card
- Workspace Selector
Live Audio Waveform
Real-time microphone input visualization with audio reactivity
"use client"
import { useState } from "react"
import { Button } from "@/components/ui/button"
import { LiveWaveform } from "@/components/ui/live-waveform"
export function LiveWaveformDemo() {
const [active, setActive] = useState(false)
const [processing, setProcessing] = useState(false)
const [mode, setMode] = useState<"static" | "scrolling">("static")
const handleToggleActive = () => {
setActive(!active)
if (!active) {
setProcessing(false)
}
}
const handleToggleProcessing = () => {
setProcessing(!processing)
if (!processing) {
setActive(false)
}
}
return (
<div className="bg-card w-full rounded-lg border p-6">
<div className="mb-4">
<h3 className="text-lg font-semibold">Live Audio Waveform</h3>
<p className="text-muted-foreground text-sm">
Real-time microphone input visualization with audio reactivity
</p>
</div>
<div className="space-y-4">
<LiveWaveform
active={active}
processing={processing}
height={80}
barWidth={3}
barGap={2}
mode={mode}
fadeEdges={true}
barColor="gray"
historySize={120}
/>
<div className="flex flex-wrap justify-center gap-2">
<Button
size="sm"
variant={active ? "default" : "outline"}
onClick={handleToggleActive}
>
{active ? "Stop" : "Start"} Listening
</Button>
<Button
size="sm"
variant={processing ? "default" : "outline"}
onClick={handleToggleProcessing}
>
{processing ? "Stop" : "Start"} Processing
</Button>
<Button
size="sm"
variant="outline"
onClick={() => setMode(mode === "static" ? "scrolling" : "static")}
>
Mode: {mode === "static" ? "Static" : "Scrolling"}
</Button>
</div>
</div>
</div>
)
}
Installation
pnpm dlx shadcn@latest add https://ui.zgi.ai/r/live-waveform.json
Usage
import { LiveWaveform } from "@/components/ui/live-waveform"<LiveWaveform active={true} />Examples
Static Mode
<LiveWaveform active={true} mode="static" />Scrolling Mode
<LiveWaveform active={true} mode="scrolling" />Processing State
Shows an animated wave pattern while waiting for input.
<LiveWaveform processing={true} mode="static" />Custom Styling
<LiveWaveform
active={true}
barWidth={4}
barHeight={6}
barGap={2}
barColor="#3b82f6"
height={100}
fadeEdges={true}
/>API Reference
LiveWaveform
A canvas-based real-time audio visualizer with microphone input support.
Props
| Prop | Type | Default | Description |
|---|---|---|---|
| active | boolean | false | Whether to actively listen to microphone input |
| processing | boolean | false | Show processing animation when not active |
| barWidth | number | 3 | Width of each bar in pixels |
| barHeight | number | 4 | Height of each bar in pixels |
| barGap | number | 1 | Gap between bars in pixels |
| barRadius | number | 1.5 | Border radius of bars |
| barColor | string | - | Color of the bars (defaults to text color) |
| fadeEdges | boolean | true | Whether to fade the edges of the waveform |
| fadeWidth | number | 24 | Width of the fade effect in pixels |
| height | string | number | 64 | Height of the waveform |
| sensitivity | number | 1 | Audio sensitivity multiplier |
| smoothingTimeConstant | number | 0.8 | Audio analyser smoothing (0-1) |
| fftSize | number | 256 | FFT size for audio analysis |
| historySize | number | 60 | Number of bars to keep in history (scrolling) |
| updateRate | number | 30 | Update rate in milliseconds |
| mode | "scrolling" | "static" | "static" | Visualization mode |
| onError | (error: Error) => void | - | Error callback |
| onStreamReady | (stream: MediaStream) => void | - | Callback when stream is ready |
| onStreamEnd | () => void | - | Callback when stream ends |
| className | string | - | Custom CSS class |
| ...props | HTMLDivElement | - | All standard div element props |
Notes
- Uses Web Audio API for real-time frequency analysis
- Automatically requests microphone permissions when
active={true} - Canvas-based rendering with HiDPI support
- Properly cleans up media streams and audio contexts on unmount
- Static mode: Displays symmetric waveform bars across multiple frequency bands (detailed visualization)
- Scrolling mode: Shows historical average audio volume as bars scrolling from right to left (timeline view)
- Processing state: Shows animated waves while waiting for input
- Smooth transitions between active, processing, and idle states
- Scrolling mode builds up history gradually - bars appear from right and fill over time
Deploy and Scale Agents with ZGI
ZGI delivers the infrastructure and developer experience you need to ship reliable audio & agent applications at scale.
Talk to an expert