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 @elevenlabs/cli@latest components add live-waveform
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 ElevenLabs
ElevenLabs delivers the infrastructure and developer experience you need to ship reliable audio & agent applications at scale.
Talk to an expert