
voice-interface-builder
Expert in building voice interfaces, speech recognition, and text-to-speech systems
- Installs
- 184
- Last 24h
- —
- Trending rank
- —
- Security
- Not audited
Install
Works with every agent the skills CLI supports.
npx skills add https://github.com/daffy0208/ai-dev-standards --skill voice-interface-builder- 01
Install
Run the command in your project. The CLI asks which agents to install for.
- 02
Describe the task
Ask your agent for something this skill covers. It loads voice-interface-builder automatically when relevant.
- 03
Review the result
The agent follows the SKILL.md steps, scripts and references bundled with the skill.
SKILL.md
The instructions your agent reads when the skill is triggered.
Voice Interface Builder Skill
I help you build voice-enabled interfaces using the Web Speech API and modern voice technologies.
What I Do
Speech Recognition:
- Voice commands and controls
- Voice-to-text input
- Continuous dictation
- Command detection
Text-to-Speech:
- Reading content aloud
- Voice feedback and notifications
- Multilingual speech output
- Voice selection and customization
Voice UI:
- Voice-first interfaces
- Accessibility features
- Hands-free controls
- Voice search
Web Speech API Basics
Speech Recognition
// hooks/useSpeechRecognition.ts
'use client'
import { useState, useEffect, useRef } from 'react'
interface SpeechRecognitionOptions {
continuous?: boolean
language?: string
onResult?: (transcript: string) => void
onError?: (error: string) => void
}
export function useSpeechRecognition({
continuous = false,
language = 'en-US',
onResult,
onError
}: SpeechRecognitionOptions = {}) {
const [isListening, setIsListening] = useState(false)
const [transcript, setTranscript] = useState('')
const recognitionRef = useRef<SpeechRecognition | null>(null)
useEffect(() => {
if (typeof window === 'undefined') return
const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition
if (!SpeechRecognition) {
console.warn('Speech recognition not supported')
return
}
const recognition = new SpeechRecognition()
recognition.continuous = continuous
recognition.lang = language
recognition.interimResults = true
recognition.onresult = event => {
const transcript = Array.from(event.results)
.map(result => result[0].transcript)
.join('')
setTranscript(transcript)
onResult?.(transcript)
}
recognition.onerror = event => {
console.error('Speech recognition error:', event.error)
onError?.(event.error)
setIsListening(false)
}
recognition.onend = () => {
setIsListening(false)
}
recognitionRef.current = recognition
return () => {
recognition.stop()
}
}, [continuous, language, onResult, onError])
const start = () => {
if (recognitionRef.current && !isListening) {
recognitionRef.current.start()
setIsListening(true)
}
}
const stop = () => {
if (recognitionRef.current && isListening) {
recognitionRef.current.stop()
setIsListening(false)
}
}
return { isListening, transcript, start, stop }
}
Usage:
'use client'
import { useSpeechRecognition } from '@/hooks/useSpeechRecognition'
export function VoiceInput() {
const { isListening, transcript, start, stop } = useSpeechRecognition({
onResult: (text) => console.log('Recognized:', text)
})
return (
<div>
<button onClick={isListening ? stop : start}>
{isListening ? '🔴 Stop' : '🎤 Start Listening'}
</button>
<p>{transcript}</p>
</div>
)
}
Text-to-Speech
// hooks/useSpeechSynthesis.ts
'use client'
import { useState, useEffect } from 'react'
export function useSpeechSynthesis() {
const [voices, setVoices] = useState<SpeechSynthesisVoice[]>([])
const [speaking, setSpeaking] = useState(false)
useEffect(() => {
if (typeof window === 'undefined') return
const loadVoices = () => {
const availableVoices = window.speechSynthesis.getVoices()
setVoices(availableVoices)
}
loadVoices()
window.speechSynthesis.onvoiceschanged = loadVoices
}, [])
const speak = (
text: string,
options?: {
voice?: SpeechSynthesisVoice
rate?: number
pitch?: number
volume?: number
}
) => {
if (typeof window === 'undefined') return
const utterance = new SpeechSynthesisUtterance(text)
if (options?.voice) utterance.voice = options.voice
if (options?.rate) utterance.rate = options.rate // 0.1 - 10
if (options?.pitch) utterance.pitch = options.pitch // 0 - 2
if (options?.volume) utterance.volume = options.volume // 0 - 1
utterance.onstart = () => setSpeaking(true)
utterance.onend = () => setSpeaking(false)
utterance.onerror = () => setSpeaking(false)
window.speechSynthesis.speak(utterance)
}
const cancel = () => {
if (typeof window !== 'undefined') {
window.speechSynthesis.cancel()
setSpeaking(false)
}
}
return { speak, cancel, speaking, voices }
}
Usage:
'use client'
import { useSpeechSynthesis } from '@/hooks/useSpeechSynthesis'
export function TextToSpeech() {
const { speak, cancel, speaking, voices } = useSpeechSynthesis()
const [text, setText] = useState('Hello, how can I help you today?')
return (
<div>
<textarea
value={text}
onChange={(e) => setText(e.target.value)}
rows={4}
/>
<button
onClick={() => speak(text)}
disabled={speaking}
>
{speaking ? 'Speaking...' : '🔊 Speak'}
</button>
<button onClick={cancel} disabled={!speaking}>
⏹️ Stop
</button>
<select onChange={(e) => {
const voice = voices.find(v => v.name === e.target.value)
if (voice) speak(text, { voice })
}}>
{voices.map((voice) => (
<option key={voice.name} value={voice.name}>
{voice.name} ({voice.lang})
</option>
))}
</select>
</div>
)
}
Voice Commands
Command Detection
'use client'
import { useSpeechRecognition } from '@/hooks/useSpeechRecognition'
import { useEffect } from 'react'
interface Command {
phrase: string | RegExp
action: () => void
}
export function VoiceCommands({ commands }: { commands: Command[] }) {
const { isListening, transcript, start, stop } = useSpeechRecognition({
continuous: true
})
useEffect(() => {
if (!transcript) return
const lowerTranscript = transcript.toLowerCase()
for (const command of commands) {
if (typeof command.phrase === 'string') {
if (lowerTranscript.includes(command.phrase.toLowerCase())) {
command.action()
}
} else {
if (command.phrase.test(lowerTranscript)) {
command.action()
}
}
}
}, [transcript, commands])
return (
<button onClick={isListening ? stop : start}>
{isListening ? '🔴 Stop Voice Commands' : '🎤 Start Voice Commands'}
</button>
)
}
Usage:
export function App() {
const commands = [
{
phrase: 'go home',
action: () => router.push('/')
},
{
phrase: 'open menu',
action: () => setMenuOpen(true)
},
{
phrase: 'search for',
action: () => {
// Extract search query after "search for"
}
}
]
return <VoiceCommands commands={commands} />
}
Voice Search
'use client'
import { useSpeechRecognition } from '@/hooks/useSpeechRecognition'
import { useState } from 'react'
export function VoiceSearch() {
const [query, setQuery] = useState('')
const { isListening, start, stop } = useSpeechRecognition({
onResult: (transcript) => {
setQuery(transcript)
}
})
const handleSearch = () => {
if (query) {
// Perform search with query
console.log('Searching for:', query)
}
}
return (
<div className="flex gap-2">
<input
type="text"
value={query}
onChange={(e) => setQuery(e.target.value)}
placeholder="Search or speak..."
className="flex-1 px-4 py-2 border rounded"
/>
<button
onClick={isListening ? stop : start}
className={`px-4 py-2 rounded ${
isListening ? 'bg-red-600 text-white' : 'bg-gray-200'
}`}
>
{isListening ? '🔴' : '🎤'}
</button>
<button
onClick={handleSearch}
className="px-4 py-2 bg-blue-600 text-white rounded"
>
Search
</button>
</div>
)
}
Accessibility Features
Read Article Aloud
'use client'
import { useSpeechSynthesis } from '@/hooks/useSpeechSynthesis'
export function ReadAloudButton({ content }: { content: string }) {
const { speak, cancel, speaking } = useSpeechSynthesis()
return (
<button
onClick={() => speaking ? cancel() : speak(content)}
className="flex items-center gap-2 px-4 py-2 bg-blue-600 text-white rounded"
>
{speaking ? '⏹️ Stop Reading' : '🔊 Read Aloud'}
</button>
)
}
Voice Navigation
'use client'
import { useRouter } from 'next/navigation'
import { useSpeechRecognition } from '@/hooks/useSpeechRecognition'
import { useEffect } from 'react'
export function VoiceNavigation() {
const router = useRouter()
const { isListening, transcript, start, stop } = useSpeechRecognition()
useEffect(() => {
const lower = transcript.toLowerCase()
if (lower.includes('go to home')) router.push('/')
else if (lower.includes('go to about')) router.push('/about')
else if (lower.includes('go to contact')) router.push('/contact')
else if (lower.includes('go back')) router.back()
}, [transcript, router])
return (
<button onClick={isListening ? stop : start}>
{isListening ? 'Disable Voice Nav' : 'Enable Voice Nav'}
</button>
)
}
Voice Dictation
'use client'
import { useSpeechRecognition } from '@/hooks/useSpeechRecognition'
import { useState } from 'react'
export function VoiceDictation() {
const [text, setText] = useState('')
const { isListening, start, stop } = useSpeechRecognition({
continuous: true,
onResult: (transcript) => {
setText(transcript)
}
})
return (
<div>
<textarea
value={text}
onChange={(e) => setText(e.target.value)}
rows={10}
className="w-full p-4 border rounded"
placeholder="Start dictating..."
/>
<div className="mt-4 flex gap-2">
<button
onClick={isListening ? stop : start}
className={`px-4 py-2 rounded ${
isListening ? 'bg-red-600 text-white' : 'bg-blue-600 text-white'
}`}
>
{isListening ? '🔴 Stop Dictation' : '🎤 Start Dictation'}
</button>
<button
onClick={() => setText('')}
className="px-4 py-2 bg-gray-200 rounded"
>
Clear
</button>
</div>
</div>
)
}
Multilingual Support
'use client'
import { useSpeechRecognition } from '@/hooks/useSpeechRecognition'
import { useSpeechSynthesis } from '@/hooks/useSpeechSynthesis'
import { useState } from 'react'
const languages = [
{ code: 'en-US', name: 'English (US)' },
{ code: 'es-ES', name: 'Spanish (Spain)' },
{ code: 'fr-FR', name: 'French (France)' },
{ code: 'de-DE', name: 'German (Germany)' },
{ code: 'ja-JP', name: 'Japanese' },
{ code: 'zh-CN', name: 'Chinese (Simplified)' }
]
export function MultilingualVoice() {
const [language, setLanguage] = useState('en-US')
const [text, setText] = useState('')
const { isListening, transcript, start, stop } = useSpeechRecognition({
language,
onResult: (t) => setText(t)
})
const { speak } = useSpeechSynthesis()
return (
<div>
<select
value={language}
onChange={(e) => setLanguage(e.target.value)}
className="px-4 py-2 border rounded"
>
{languages.map((lang) => (
<option key={lang.code} value={lang.code}>
{lang.name}
</option>
))}
</select>
<div className="mt-4">
<button onClick={isListening ? stop : start}>
{isListening ? '🔴 Stop' : '🎤 Speak'}
</button>
<button onClick={() => speak(text)}>
🔊 Read Aloud
</button>
</div>
<textarea
value={text}
onChange={(e) => setText(e.target.value)}
rows={4}
className="w-full mt-4 p-4 border rounded"
/>
</div>
)
}
Voice Feedback
'use client'
import { useSpeechSynthesis } from '@/hooks/useSpeechSynthesis'
export function useVoiceFeedback() {
const { speak } = useSpeechSynthesis()
const announce = (message: string) => {
speak(message, { rate: 1.1, volume: 0.8 })
}
return {
success: (message: string) => announce(`Success: ${message}`),
error: (message: string) => announce(`Error: ${message}`),
info: (message: string) => announce(message),
confirm: (action: string) => announce(`${action} confirmed`)
}
}
// Usage
export function Form() {
const voice = useVoiceFeedback()
const handleSubmit = async () => {
try {
await submitForm()
voice.success('Form submitted successfully')
} catch (error) {
voice.error('Failed to submit form')
}
}
return <form onSubmit={handleSubmit}>...</form>
}
When to Use Me
Perfect for:
- Building voice-controlled interfaces
- Adding accessibility features
- Creating hands-free experiences
- Implementing voice search
- Building voice assistants
I'll help you:
- Implement speech recognition
- Add text-to-speech
- Build voice commands
- Support multiple languages
- Create accessible voice UI
What I'll Create
🎤 Speech Recognition
🔊 Text-to-Speech
🗣️ Voice Commands
🔍 Voice Search
🌍 Multilingual Support
♿ Accessibility Features
Let's make your app voice-enabled!
FAQ
What does the voice-interface-builder skill do?
Expert in building voice interfaces, speech recognition, and text-to-speech systems
How do I install voice-interface-builder?
Run npx skills add https://github.com/daffy0208/ai-dev-standards --skill voice-interface-builder in your project. The skills CLI detects the agents you use and copies the skill into the right folder. For Claude Code you can also place the skill folder at ~/.claude/skills/voice-interface-builder/ (personal) or .claude/skills/voice-interface-builder/ (project).
Which AI agents can use voice-interface-builder?
Any agent that supports the open Agent Skills format (a folder with a SKILL.md file), including Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, Windsurf, Cline, OpenCode and more.
Is voice-interface-builder safe to install?
No partner security audit is available yet. Skills can run commands and scripts, so read the SKILL.md and any bundled files before installing.
Who maintains voice-interface-builder?
It is published by daffy0208 in daffy0208/ai-dev-standards. It has 184 recorded installs.
More from daffy0208/ai-dev-standards
animation-designer
daffy0208/ai-dev-standards
Expert in web animations, transitions, and motion design using Framer Motion and CSS
brand-designer
daffy0208/ai-dev-standards
Expert in brand identity, logo design, and visual brand systems
3d-visualizer
daffy0208/ai-dev-standards
Expert in Three.js, 3D graphics, and interactive 3D visualizations
data-visualizer
daffy0208/ai-dev-standards
Expert in creating charts, dashboards, and data visualizations using modern libraries
video-producer
daffy0208/ai-dev-standards
Expert in video playback, streaming, and video player customization
knowledge base manager
daffy0208/ai-dev-standards
Open the skill to read its SKILL.md instructions.
Popular media & creative skills
hyperframes
heygen-com/hyperframes
Read first to make, edit, animate or render any video with HyperFrames (HTML rendered to video), including launch films, explainers, music videos, charts, maps, vertical clips, title cards, captions and overlays. Holds the render contract, the work loop and what each kind of video needs.
media-use
heygen-com/hyperframes
Get or make any media for a HyperFrames video - music, sound effects, images, icons, logos, voiceover, avatar and generated video, transcripts, cutouts, colour grades and looks - with HeyGen or free local tools, and mix placed audio. Also for footage that looks dark, flat or dull, or should be stylized or hidden.
hyperframes-registry
heygen-com/hyperframes
About 450 ready-made HyperFrames blocks and components installed as editable source - transitions, overlays, titles, kinetic type, captions, charts, map overlays, 3D, camera moves. Use it before hand-building any named visual (CRT scanlines, glitch, film grain, a chart); also for hyperframes add and catalog.
hyperframes-creative
heygen-com/hyperframes
Non-animation creative direction for HyperFrames videos. Use for design spec (frame.md / design.md) handling, palettes, typography, narration, beat planning, audio-reactive visuals, composition patterns, and brand / style decisions. For atomic motion patterns and scene blueprints, use hyperframes-animation.
ai-video-generation
101-skills/superpowers
Generate AI videos with Google Veo, Seedance 2.0, HappyHorse, Wan, Grok and 40+ models via inference.sh CLI. Models: Veo 3.1, Veo 3, Seedance 2.0, HappyHorse 1.0, Wan 2.5, Grok Imagine Video, OmniHuman, Fabric, HunyuanVideo. Capabilities: text-to-video, image-to-video, reference-to-video, video editing, lipsync, avatar animation, video upscaling, foley sound. Use for: social media videos, marketing content, explainer videos, product demos, AI avatars. Triggers: video generation, ai video, text to video, image to video, veo, animate image, video from image, ai animation, video generator, generate video, t2v, i2v, ai video maker, create video with ai, runway alternative, pika alternative, sora alternative, kling alternative, seedance, happyhorse
ai-image-generation
101-skills/superpowers
Generate AI images with GPT-Image-2, FLUX, Gemini, Grok, Seedream, Reve and 50+ models via inference.sh CLI. Models: GPT-Image-2, FLUX Dev LoRA, FLUX.2 Klein LoRA, Gemini 3 Pro Image, Grok Imagine, Seedream 4.5, Reve, ImagineArt. Capabilities: text-to-image, image-to-image, inpainting, LoRA, image editing, upscaling, text rendering. Use for: AI art, product mockups, concept art, social media graphics, marketing visuals, illustrations. Triggers: flux, image generation, ai image, text to image, stable diffusion, generate image, ai art, midjourney alternative, dall-e alternative, text2img, t2i, image generator, ai picture, create image with ai, generative ai, ai illustration, grok image, gemini image, gpt image, openai image, chatgpt image