Audio Frequency Visualizer
Real-time frequency band visualization with animated state transitions
<script setup lang="ts">
import type { AgentState } from '@/components/elevenlabs-ui/bar-visualizer'
import { BarVisualizer } from '@/components/elevenlabs-ui/bar-visualizer'
import { Button } from '@/components/ui/button'
import {
Card,
CardContent,
CardDescription,
CardHeader,
CardTitle,
} from '@/components/ui/card'
import { ref } from 'vue'
const state = ref<AgentState>('listening')
const states: AgentState[] = [
'connecting',
'initializing',
'listening',
'speaking',
'thinking',
]
// Helper function to capitalize first letter for display
const capitalize = (s: string) => s.charAt(0).toUpperCase() + s.slice(1)
</script>
<template>
<Card>
<CardHeader>
<CardTitle>Audio Frequency Visualizer</CardTitle>
<CardDescription>
Real-time frequency band visualization with animated state transitions
</CardDescription>
</CardHeader>
<CardContent>
<div class="space-y-4">
<BarVisualizer
:state="state"
:demo="true"
:bar-count="20"
:min-height="15"
:max-height="90"
class="h-40 max-w-full"
/>
<div class="flex flex-wrap gap-2">
<Button
v-for="s in states"
:key="s"
size="sm"
:variant="state === s ? 'default' : 'outline'"
@click="state = s"
>
{{ capitalize(s || '') }}
</Button>
</div>
</div>
</CardContent>
</Card>
</template>Installation
pnpm dlx elevenlabs-ui-vue@latest add bar-visualizer
Usage
import {
BarVisualizer,
useAudioVolume,
useBarAnimator,
useMultibandVolume,
type AgentState,
type AudioAnalyserOptions,
type BarVisualizerProps,
type MultiBandVolumeOptions,
} from "@/components/elevenlabs-ui/bar-visualizer"Basic Visualizer
<BarVisualizer :state="listening" :barCount="15" :mediaStream="stream" />Demo Mode
<BarVisualizer :state="speaking" :demo="true" :centerAlign="true" />API Reference
BarVisualizer
The main visualizer component that displays animated frequency bars.
<BarVisualizer :state="speaking" :mediaStream="stream" />Props
| Prop | Type | Description |
|---|---|---|
| state | AgentState | Voice assistant state: connecting, initializing, listening, speaking, thinking |
| barCount | number | Number of bars to display. Default: 15 |
| mediaStream | MediaStream | Audio source for real-time visualization |
| minHeight | number | Minimum bar height as percentage. Default: 20 |
| maxHeight | number | Maximum bar height as percentage. Default: 100 |
| demo | boolean | Enable demo mode with fake audio data. Default: false |
| centerAlign | boolean | Align bars from center instead of bottom. Default: false |
| ...props | HTMLAttributes | All standard div element props |
useAudioVolume Composable
Get the overall volume level from an audio stream.
const volume = useAudioVolume(mediaStream, {
fftSize: 32,
smoothingTimeConstant: 0,
})Parameters
| Parameter | Type | Description |
|---|---|---|
| mediaStream | MediaStream | null | The audio stream to analyze |
| options | AudioAnalyserOptions | FFT size, smoothing, and dB range |
useMultibandVolume Composable
Track volume across multiple frequency bands for visualization.
const frequencyBands = useMultibandVolume(mediaStream, {
bands: 15,
loPass: 100,
hiPass: 200,
updateInterval: 32,
})Parameters
| Parameter | Type | Description |
|---|---|---|
| mediaStream | MediaStream | null | The audio stream to analyze |
| options | MultiBandVolumeOptions | Band count, frequency range, interval |
useBarAnimator Composable
Create animation sequences for different states.
const highlightedIndices = useBarAnimator("connecting", 15, 100)Parameters
| Parameter | Type | Description |
|---|---|---|
| state | AnimationState | Current animation state |
| columns | number | Number of bars |
| interval | number | Animation frame interval in ms |
AgentState Type
type AgentState =
| "connecting" // Establishing connection
| "initializing" // Setting up
| "listening" // Listening for input
| "speaking" // Playing audio output
| "thinking" // ProcessingNotes
- Uses Web Audio API for real-time frequency analysis
- Supports both real audio streams and demo mode for development
- Bars animate based on the current state
- FFT analysis splits audio into frequency bands
- Smooth animations using requestAnimationFrame
- Works with any MediaStream source (microphone, audio elements, WebRTC)