WebberUI

AI 語音球

Siri 式語音球:待機呼吸、聆聽波動、思考旋轉、說話脈動四態。

以 canvas 2d 繪製的有機 blob 語音球:多層正弦擾動輪廓疊加漸層與光暈,由 state 驅動四種型態——待機時緩慢呼吸、聆聽時隨模擬音量劇烈波動、思考時環繞粒子雙向旋轉、說話時依類音節節奏脈動,狀態切換以指數趨近平滑過渡,適合語音助理與 AI 對話介面。

載入預覽⋯

Playground

即時調整 props、程式碼片段同步更新——直接試出你要的樣子再複製。

220
<AiVoiceOrb />

安裝

npx shadcn@latest add https://webberui.com/r/ai-voice-orb.json

或在 components.json 設定 registries 後,改用 @webberui/ai-voice-orb 安裝。

安裝依賴後,從 registry JSON(/r/ai-voice-orb.jsonfiles[0].content)複製 ai-voice-orb.tsx 原始碼到你的 components/ui/ 目錄:

npm install motion clsx tailwind-merge

使用

import { AiVoiceOrb } from "@/components/ui/ai-voice-orb";

<AiVoiceOrb state="listening" palette="aurora" size={200} showLabel />

搭配語音辨識或串流回覆時,把辨識與回覆的生命週期映射到 state 即可:

const [state, setState] = React.useState<VoiceOrbState>("idle");
// 開始收音 → setState("listening")
// 等待模型 → setState("thinking")
// 播放回覆 → setState("speaking")

Props

Prop型別預設值說明
state"idle" | "listening" | "thinking" | "speaking""idle"語音球目前狀態,切換時動畫參數平滑過渡
palette"aurora" | "sunset" | "ocean" | "mint""aurora"內建配色主題
colors[string, string, string]自訂三色漸層(主色、輔色、點綴色),優先於 palette
sizenumber220畫布尺寸(px),光暈與粒子皆繪製在此範圍內
showLabelbooleanfalse是否在球體下方顯示目前狀態文字
labelsPartial<Record<VoiceOrbState, string>>覆寫各狀態的顯示文字(同時用於 aria-live 播報)
classNamestring透傳到外層容器

可及性

  • 使用者系統開啟「減少動態效果」時,改渲染靜態漸層圓與狀態文字,完全不啟動 canvas 動畫迴圈
  • canvas 具 role="img" 與描述性 aria-label(例如「AI 語音球:聆聽中」)
  • 狀態變化透過 aria-live="polite" 的 sr-only 區域向螢幕閱讀器播報
  • 元件滾出可視範圍時以 IntersectionObserver 暫停 rAF,回到畫面自動恢復,節省效能與電量

On this page