'use client' import React, { useState, useRef, useCallback } from 'react' interface MicrophoneInputProps { expectedText: string lang: 'en' | 'de' onResult: (transcript: string, correct: boolean) => void isDark: boolean } export function MicrophoneInput({ expectedText, lang, onResult, isDark }: MicrophoneInputProps) { const [isListening, setIsListening] = useState(false) const [transcript, setTranscript] = useState('') const [feedback, setFeedback] = useState<'correct' | 'wrong' | null>(null) const recognitionRef = useRef(null) const startListening = useCallback(() => { const SpeechRecognition = (window as any).SpeechRecognition || (window as any).webkitSpeechRecognition if (!SpeechRecognition) { setTranscript('Spracherkennung nicht verfuegbar') return } const recognition = new SpeechRecognition() recognition.lang = lang === 'de' ? 'de-DE' : 'en-GB' recognition.interimResults = false recognition.maxAlternatives = 3 recognition.continuous = false recognition.onresult = (event: any) => { const results = event.results[0] let bestMatch = '' let isCorrect = false // Check all alternatives for a match for (let i = 0; i < results.length; i++) { const alt = results[i].transcript.trim().toLowerCase() if (alt === expectedText.trim().toLowerCase()) { bestMatch = results[i].transcript isCorrect = true break } if (!bestMatch) bestMatch = results[i].transcript } setTranscript(bestMatch) setFeedback(isCorrect ? 'correct' : 'wrong') setIsListening(false) setTimeout(() => { onResult(bestMatch, isCorrect) setFeedback(null) setTranscript('') }, isCorrect ? 1000 : 2500) } recognition.onerror = (event: any) => { console.error('Speech recognition error:', event.error) setIsListening(false) if (event.error === 'no-speech') { setTranscript('Kein Ton erkannt. Nochmal versuchen.') } else if (event.error === 'not-allowed') { setTranscript('Mikrofon-Zugriff nicht erlaubt.') } } recognition.onend = () => { setIsListening(false) } recognitionRef.current = recognition recognition.start() setIsListening(true) setTranscript('') setFeedback(null) }, [lang, expectedText, onResult]) const stopListening = useCallback(() => { recognitionRef.current?.stop() setIsListening(false) }, []) return (
{/* Microphone Button */} {/* Status Text */}

{isListening ? 'Sprich jetzt...' : transcript ? transcript : 'Tippe auf das Mikrofon'}

{/* Feedback */} {feedback === 'correct' && (

Richtig ausgesprochen!

)} {feedback === 'wrong' && (

Erkannt: "{transcript}"

Erwartet: "{expectedText}"

)}
) }