// src/pages/VoiceLabPage.tsx import React, { useState } from 'react'; import { generateSpeechFromText, startVoiceSession } from '../services/aiApiClient'; import { logger } from '../services/logger.client'; import { notifyError } from '../services/notificationService'; import { LoadingSpinner } from '../components/LoadingSpinner'; import { SpeakerWaveIcon } from '../components/icons/SpeakerWaveIcon'; import { MicrophoneIcon } from '../components/icons/MicrophoneIcon'; export const VoiceLabPage: React.FC = () => { const [textToSpeak, setTextToSpeak] = useState( 'Hello! This is a test of the text-to-speech generation.', ); const [isGeneratingSpeech, setIsGeneratingSpeech] = useState(false); const [audioPlayer, setAudioPlayer] = useState(null); // Debug log for rendering logger.debug({ hasAudioPlayer: !!audioPlayer }, '[VoiceLabPage] Render'); const handleGenerateSpeech = async () => { logger.debug('[VoiceLabPage] handleGenerateSpeech triggered'); if (!textToSpeak.trim()) { notifyError('Please enter some text to generate speech.'); return; } setIsGeneratingSpeech(true); try { logger.debug('[VoiceLabPage] Calling generateSpeechFromText'); const response = await generateSpeechFromText(textToSpeak); const base64Audio = await response.json(); // Extract the base64 audio string from the response logger.debug({ audioLength: base64Audio?.length }, '[VoiceLabPage] Response JSON received'); if (base64Audio) { const audioSrc = `data:audio/mpeg;base64,${base64Audio}`; logger.debug('[VoiceLabPage] Creating new Audio()'); const audio = new Audio(audioSrc); logger.debug('[VoiceLabPage] Audio created'); logger.debug('[VoiceLabPage] Calling setAudioPlayer'); setAudioPlayer(audio); logger.debug('[VoiceLabPage] Calling audio.play()'); await audio.play(); logger.debug('[VoiceLabPage] audio.play() resolved'); } else { logger.warn('[VoiceLabPage] base64Audio was falsy'); notifyError('The AI did not return any audio data.'); } } catch (error) { logger.error({ err: error }, '[VoiceLabPage] Failed to generate speech'); const errorMessage = error instanceof Error ? error.message : 'An unknown error occurred.'; notifyError(`Speech generation failed: ${errorMessage}`); } finally { logger.debug('[VoiceLabPage] finally block - setting isGeneratingSpeech false'); setIsGeneratingSpeech(false); } }; const handleStartVoiceSession = () => { try { // This function is currently a stub and will throw an error. // This is the placeholder for the future real-time voice implementation. startVoiceSession({ onmessage: (message) => { logger.info('Received voice session message:', message); }, }); } catch (error) { const errorMessage = error instanceof Error ? error.message : 'An unknown error occurred.'; logger.error({ err: error }, 'Failed to start voice session:'); notifyError(`Could not start voice session: ${errorMessage}`); } }; return (

Admin Voice Lab

This page is for testing and developing voice-related AI features.

{/* Text-to-Speech Section */}

Text-to-Speech Generation