Prebuilt aeval binaries and runnable voice-agent evaluation scenarios.
Download the binary for your operating system and architecture from the GitHub releases page:
aeval-macos-arm64aeval-macos-x86_64aeval-linux-x86_64aeval-linux-arm64aeval_SHA256SUMS.txt
Install the latest release automatically:
OS="$(uname -s | tr '[:upper:]' '[:lower:]')"; ARCH="$(uname -m)"; case "${OS}-${ARCH}" in darwin-arm64) TARGET="macos-arm64" ;; darwin-x86_64) TARGET="macos-x86_64" ;; linux-x86_64) TARGET="linux-x86_64" ;; linux-aarch64|linux-arm64) TARGET="linux-arm64" ;; *) echo "Unsupported platform: ${OS}-${ARCH}" >&2; exit 1 ;; esac; curl -fsSL "https://github.com/Agora-Build/aeval/releases/latest/download/aeval-${TARGET}" -o aeval && chmod +x aeval && ./aeval --helpFor a manually downloaded file, rename it to aeval, make it executable, and
verify it:
mv aeval-macos-arm64 aeval
chmod +x aeval
./aeval --versionNative virtual-soundcard audio I/O is the runtime default, even when audio_io
is omitted. Existing scenarios remain unchanged: audio.play automatically
uses the resolved soundcard route for corpus playback. The default device name
is BlackHole 2ch on macOS and the ALSA card ID is VirtualAudio on Linux.
Set audio_io.soundcard.device to override the device label or card ID.
- Install BlackHole 2ch.
- In Audio MIDI Setup, configure BlackHole 2ch for 48 kHz and two channels.
- Allow the terminal or browser process to access the microphone in macOS Privacy & Security settings.
Install the host libraries, load snd-aloop with the required stable card ID,
and add the current user to the audio group:
sudo apt-get update
sudo apt-get install -y alsa-utils libportaudio2 libsndfile1
sudo modprobe snd-aloop id=VirtualAudio pcm_substreams=1
sudo usermod -aG audio "$USER"Log in again after changing group membership. Before running aeval, verify
that /proc/asound/cards, aplay -l, and arecord -l show the VirtualAudio
card with playback and capture devices.
To use the legacy browser-injection route instead, set a scenario-level override:
audio_io:
mode: web_hookExamples are under examples/interrupt/, examples/response/, and
examples/multi_turn_dialogue/:
./aeval run examples/interrupt/interrupt_I00_en.yaml --headful
./aeval run examples/response/response_R00_en.yaml --headful
./aeval run examples/multi_turn_dialogue/scenario.yaml --headfulAuthenticated platforms require the corresponding environment variables or a saved browser storage state. LiveKit's public example does not require account credentials.
aeval analyze can calculate response latency, interruption latency, and
turn-taking metrics from one prerecorded stereo WAV without a scenario or
browser metadata. The channel assignment is required:
- left / channel 0: user
- right / channel 1: agent
Both channels must use the same timeline. Preserve silence and overlapping speech, and avoid speaker leakage between channels. PCM WAV is recommended; the analyzer resamples the recording internally. Mono or mixed-down audio cannot provide reliable speaker-specific latency metrics.
Run the bundled 20-second examples:
./aeval analyze examples/offline_analysis/response \
--config config/analysis_presets/offline_stereo.yaml
./aeval analyze examples/offline_analysis/interruption \
--config config/analysis_presets/offline_stereo.yamlThe response recording validates response latency and turn-taking. The
interruption recording validates interruption action latency and
post-interruption continuation.
To analyze your own recording, place it in any session directory:
offline-session/
`-- recordings/
`-- conversation.wav
Run the shipped event-free preset:
./aeval analyze offline-session \
--config config/analysis_presets/offline_stereo.yamlNo console.log, transcript, or metadata sidecar is needed. The analysis is
written to offline-session/analysis/, including vad.json, turns.json,
metrics.json, and report.html.
The main JSON metrics are:
response_metrics.latency.summary: agent start minus user endinterruption_metrics.latency.summary: agent stop minus interruption startinterruption_metrics.post_interruption_latency.summary: next agent start minus interruption endanalysis_quality: coverage and ambiguity indicators for interpreting the measurements
For a session originally produced by aeval run, keep its
recordings/ and logs/console.log directories and use the event-aware default
preset instead:
./aeval analyze SESSION_DIR \
--config config/analysis_presets/default.yamlThe project is licensed under the MIT License, except for the audio
corpus and its metadata under corpus/, which are dedicated to the public
domain under CC0 1.0 Universal.