voice-form-01
elevenlabs/voice-form-01FreeBlock
Voice-fill form
Install it
npx shadcn@latest add https://raw.githubusercontent.com/elevenlabs/ui/main/apps/www/public/r/voice-form-01.jsonSource
1"use client"23import { useCallback, useEffect, useRef, useState } from "react"4import { zodResolver } from "@hookform/resolvers/zod"5import { useForm } from "react-hook-form"67import { cn } from "@/lib/utils"8import { voiceToFormAction } from "@/app/voice-form/actions/voice-to-form"9import {10 exampleFormSchema,11 ExampleFormValues,12} from "@/app/voice-form/schema"13import { Button } from "@/components/ui/button"14import {15 Card,16 CardContent,17 CardDescription,18 CardHeader,19 CardTitle,20} from "@/components/ui/card"21import {22 Form,23 FormControl,24 FormField,25 FormItem,26 FormLabel,27 FormMessage,28} from "@/components/ui/form"29import { Input } from "@/components/ui/input"30import { VoiceButton } from "@/components/ui/voice-button"3132const AUDIO_CONSTRAINTS: MediaStreamConstraints = {33 audio: {34 echoCancellation: true,35 noiseSuppression: true,36 autoGainControl: true,37 },38}3940const SUPPORTED_MIME_TYPES = ["audio/webm;codecs=opus", "audio/webm"] as const4142function getMimeType(): string {43 for (const type of SUPPORTED_MIME_TYPES) {44 if (MediaRecorder.isTypeSupported(type)) {45 return type46 }47 }48 return "audio/webm"49}5051export default function Page() {52 const [isRecording, setIsRecording] = useState(false)53 const [isProcessing, setIsProcessing] = useState(false)54 const [error, setError] = useState("")55 const [success, setSuccess] = useState(false)5657 const mediaRecorderRef = useRef<MediaRecorder | null>(null)58 const audioChunksRef = useRef<Blob[]>([])59 const streamRef = useRef<MediaStream | null>(null)6061 const form = useForm<ExampleFormValues>({62 resolver: zodResolver(exampleFormSchema),63 defaultValues: {64 firstName: "",65 lastName: "",66 },67 mode: "onChange",68 })6970 const cleanupStream = useCallback(() => {71 if (streamRef.current) {72 streamRef.current.getTracks().forEach((track) => track.stop())73 streamRef.current = null74 }75 }, [])7677 const processAudio = useCallback(78 async (audioBlob: Blob) => {79 setIsProcessing(true)80 setError("")81 setSuccess(false)8283 try {84 const audioFile = new File([audioBlob], "audio.webm", {85 type: audioBlob.type,86 })8788 const result = await voiceToFormAction(audioFile)8990 if (result.data && Object.keys(result.data).length > 0) {91 Object.entries(result.data).forEach(([key, value]) => {92 if (value) {93 form.setValue(key as keyof ExampleFormValues, value as string, {94// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from shadcn/ui
All 50 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| music-player-01music-player-01 | shadcn/ui | Blocks | Free | no deps | |
| music-player-02music-player-02 | shadcn/ui | Blocks | Free | no deps | |
| pong-01pong-01 | shadcn/ui | Blocks | Free | 1 dep · 6 files | |
| realtime-transcriber-01realtime-transcriber-01 | shadcn/ui | Blocks | Free | 2 deps · 3 files | |
| speaker-01speaker-01 | shadcn/ui | Blocks | Free | no deps · 2 files | |
| transcriber-01transcriber-01 | shadcn/ui | Blocks | Free | 2 deps · 2 files | |
| voice-chat-01voice-chat-01 | shadcn/ui | Blocks | Free | 1 dep | |
| voice-chat-02voice-chat-02 | shadcn/ui | Blocks | Free | 2 deps |
