165

Bar Visualizer

PreviousNext

Real-time audio frequency visualizer with state-based animations for voice agents and audio interfaces.

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

PropTypeDescription
stateAgentStateVoice assistant state: connecting, initializing, listening, speaking, thinking
barCountnumberNumber of bars to display. Default: 15
mediaStreamMediaStreamAudio source for real-time visualization
minHeightnumberMinimum bar height as percentage. Default: 20
maxHeightnumberMaximum bar height as percentage. Default: 100
demobooleanEnable demo mode with fake audio data. Default: false
centerAlignbooleanAlign bars from center instead of bottom. Default: false
...propsHTMLAttributesAll standard div element props

useAudioVolume Composable

Get the overall volume level from an audio stream.

const volume = useAudioVolume(mediaStream, {
fftSize: 32,
smoothingTimeConstant: 0,
})

Parameters

ParameterTypeDescription
mediaStreamMediaStream | nullThe audio stream to analyze
optionsAudioAnalyserOptionsFFT 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

ParameterTypeDescription
mediaStreamMediaStream | nullThe audio stream to analyze
optionsMultiBandVolumeOptionsBand count, frequency range, interval

useBarAnimator Composable

Create animation sequences for different states.

const highlightedIndices = useBarAnimator("connecting", 15, 100)

Parameters

ParameterTypeDescription
stateAnimationStateCurrent animation state
columnsnumberNumber of bars
intervalnumberAnimation frame interval in ms

AgentState Type

type AgentState =
| "connecting" // Establishing connection
| "initializing" // Setting up
| "listening" // Listening for input
| "speaking" // Playing audio output
| "thinking" // Processing

Notes

  • 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)