import React, { useState, useRef, useCallback, useEffect } from 'react'; interface AudioInputProps { onAudioSubmit: (blob: Blob, mimeType: string) => void; isProcessing: boolean; } const MicrophoneIcon: React.FC<{className?: string}> = ({ className }) => ( ); const UploadIcon: React.FC<{className?: string}> = ({ className }) => ( ); export const AudioInput: React.FC = ({ onAudioSubmit, isProcessing }) => { const [isRecording, setIsRecording] = useState(false); const [audioURL, setAudioURL] = useState(null); const [audioBlob, setAudioBlob] = useState(null); const [mimeType, setMimeType] = useState('audio/webm'); const mediaRecorderRef = useRef(null); const audioChunksRef = useRef([]); const [recordTime, setRecordTime] = useState(0); const timerIntervalRef = useRef(null); const formatTime = (seconds: number) => { const minutes = Math.floor(seconds / 60); const secs = seconds % 60; return `${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`; }; useEffect(() => { return () => { if(timerIntervalRef.current) clearInterval(timerIntervalRef.current); } }, []); const handleStartRecording = async () => { try { const stream = await navigator.mediaDevices.getUserMedia({ audio: true }); setIsRecording(true); setAudioURL(null); setAudioBlob(null); let options = { mimeType: 'audio/webm' }; if (!MediaRecorder.isTypeSupported('audio/webm')) { options = { mimeType: 'audio/mp4' }; } setMimeType(options.mimeType); mediaRecorderRef.current = new MediaRecorder(stream, options); mediaRecorderRef.current.ondataavailable = (event) => { audioChunksRef.current.push(event.data); }; mediaRecorderRef.current.onstop = () => { const blob = new Blob(audioChunksRef.current, { type: options.mimeType }); const url = URL.createObjectURL(blob); setAudioBlob(blob); setAudioURL(url); audioChunksRef.current = []; stream.getTracks().forEach(track => track.stop()); // Stop microphone access }; mediaRecorderRef.current.start(); setRecordTime(0); timerIntervalRef.current = window.setInterval(() => { setRecordTime(prev => prev + 1); }, 1000); } catch (err) { console.error("Error accessing microphone:", err); alert("Could not access microphone. Please check your browser permissions."); } }; const handleStopRecording = () => { if (mediaRecorderRef.current) { mediaRecorderRef.current.stop(); setIsRecording(false); if (timerIntervalRef.current) clearInterval(timerIntervalRef.current); } }; const handleFileUpload = (event: React.ChangeEvent) => { const file = event.target.files?.[0]; if (file && file.type.startsWith('audio/')) { const url = URL.createObjectURL(file); setAudioBlob(file); setMimeType(file.type); setAudioURL(url); } else { alert("Please upload a valid audio file."); } }; const handleSubmit = () => { if(audioBlob) { onAudioSubmit(audioBlob, mimeType); } }; const handleReset = () => { setAudioBlob(null); setAudioURL(null); setIsRecording(false); setRecordTime(0); if(mediaRecorderRef.current && mediaRecorderRef.current.state === 'recording') { mediaRecorderRef.current.stop(); } if (timerIntervalRef.current) clearInterval(timerIntervalRef.current); }; return (

Submit Your Voice Sample

Record up to 3 minutes of audio or upload a file.

{isRecording ? ( ) : ( )} OR
{audioURL && (

Your Audio Sample:

)}
); };