feat(presenter): add browser TTS (Web Speech API) + fix German umlauts
- Integrate Web Speech API into usePresenterMode for text-to-speech - Speech-driven paragraph advancement (falls back to timer if TTS unavailable) - TTS toggle button (Volume2/VolumeX) in PresenterOverlay - Chrome keepAlive workaround for long speeches - Voice selection: prefers premium/neural voices, falls back to any matching lang - Fix all German umlauts across presenter-script, presenter-faq, i18n, route.ts Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -53,11 +53,11 @@ export default function IntroPresenterSlide({ lang, onStartPresenter, isPresenti
|
||||
transition={{ delay: 0.3, duration: 0.5 }}
|
||||
>
|
||||
<h1 className="text-4xl md:text-5xl font-bold mb-3">
|
||||
<GradientText>{isDE ? 'KI-Praesentator' : 'AI Presenter'}</GradientText>
|
||||
<GradientText>{isDE ? 'KI-Präsentator' : 'AI Presenter'}</GradientText>
|
||||
</h1>
|
||||
<p className="text-lg text-white/60 max-w-lg mx-auto mb-8">
|
||||
{isDE
|
||||
? 'Ihr persoenlicher KI-Guide durch das BreakPilot ComplAI Pitch Deck. 15 Minuten, alle Fakten, jederzeit unterbrechbar.'
|
||||
? 'Ihr persönlicher KI-Guide durch das BreakPilot ComplAI Pitch Deck. 15 Minuten, alle Fakten, jederzeit unterbrechbar.'
|
||||
: 'Your personal AI guide through the BreakPilot ComplAI pitch deck. 15 minutes, all facts, interruptible at any time.'}
|
||||
</p>
|
||||
</motion.div>
|
||||
@@ -79,12 +79,12 @@ export default function IntroPresenterSlide({ lang, onStartPresenter, isPresenti
|
||||
{isPresenting ? (
|
||||
<>
|
||||
<Pause className="w-5 h-5" />
|
||||
{isDE ? 'Praesentation laeuft...' : 'Presentation running...'}
|
||||
{isDE ? 'Präsentation läuft...' : 'Presentation running...'}
|
||||
</>
|
||||
) : (
|
||||
<>
|
||||
<Play className="w-5 h-5" />
|
||||
{isDE ? 'Praesentation starten' : 'Start Presentation'}
|
||||
{isDE ? 'Präsentation starten' : 'Start Presentation'}
|
||||
</>
|
||||
)}
|
||||
</span>
|
||||
@@ -108,7 +108,7 @@ export default function IntroPresenterSlide({ lang, onStartPresenter, isPresenti
|
||||
</div>
|
||||
<div className="flex items-center gap-2">
|
||||
<span className="px-1.5 py-0.5 bg-white/10 rounded text-xs font-mono">ESC</span>
|
||||
<span>{isDE ? 'Slide-Uebersicht' : 'Slide Overview'}</span>
|
||||
<span>{isDE ? 'Slide-Übersicht' : 'Slide Overview'}</span>
|
||||
</div>
|
||||
</motion.div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user