import React, { useState, useCallback, useMemo } from 'react'; import { DiarizationEntry } from './types'; import { processAudioFile } from './services/geminiService'; import FileUpload from './components/FileUpload'; import Loader from './components/Loader'; import DiarizationResult from './components/DiarizationResult'; import { ResetIcon } from './components/icons'; import ApiKeyInput from './components/ApiKeyInput'; const App: React.FC = () => { const [apiKey, setApiKey] = useState(''); const [useStarFormat, setUseStarFormat] = useState(true); const [file, setFile] = useState(null); const [diarizationResult, setDiarizationResult] = useState(null); const [isLoading, setIsLoading] = useState(false); const [loadingMessage, setLoadingMessage] = useState(''); const [error, setError] = useState(null); const isApiKeySet = apiKey.trim() !== ''; const handleFileSelect = useCallback(async (selectedFile: File) => { if (!isApiKeySet) { setError("Veuillez d'abord fournir une clé API Gemini."); return; } setFile(selectedFile); setIsLoading(true); setError(null); setDiarizationResult(null); setLoadingMessage('Analyse audio en cours... (cela peut prendre un moment)'); try { const result = await processAudioFile(selectedFile, apiKey); const formattedResult = result.map(entry => ({ ...entry, speaker: useStarFormat ? `*${entry.speaker.replace(/ /g, '_')}` : entry.speaker, })); setDiarizationResult(formattedResult); } catch (err) { const errorMessage = err instanceof Error ? err.message : 'An unexpected error occurred.'; setError(errorMessage); } finally { setIsLoading(false); setLoadingMessage(''); } }, [apiKey, isApiKeySet, useStarFormat]); const speakerCount = useMemo(() => { if (!diarizationResult) return 0; const speakers = new Set(diarizationResult.map(entry => entry.speaker)); return speakers.size; }, [diarizationResult]); const handleReset = () => { setFile(null); setDiarizationResult(null); setIsLoading(false); setError(null); setLoadingMessage(''); }; const renderContent = () => { if (isLoading) { return ; } if (error) { return (

Erreur

{error}

); } if (diarizationResult && file) { return ; } // L'upload est désactivé si la clé n'est pas fournie return ; }; return (

Diarisation de MP3 par IA

Fournissez votre clé API Gemini, puis téléchargez un MP3 pour obtenir une analyse des locuteurs.

{!diarizationResult && (

Configuration

setUseStarFormat(e.target.checked)} className="h-4 w-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500 bg-gray-700" />
)}
{renderContent()}
{(diarizationResult || error) && !isLoading && ( )}
); }; export default App;