Un'applicazione web che osserva i segni della Lingua dei Segni Italiana (LIS), li riconosce come parole, compone una frase italiana grammaticalmente corretta e la pronuncia ad alta voce.
A web application that observes Italian Sign Language (LIS) gestures, recognizes them as words, composes a grammatically correct Italian sentence and speaks it out loud.
Ogni fotogramma in ingresso viene passato attraverso MediaPipe Holistic, che esegue contemporaneamente tre sotto-modelli:
Each incoming frame is passed through MediaPipe Holistic, which runs three sub-models simultaneously:
Coordinate nello spazio immagine normalizzato 0..1. Frame senza mano riempiti con NaN.
Coordinates in normalized 0..1 image space. Frames missing a hand are filled with NaN.
| ParametroParameter | ValoreValue |
|---|---|
| model_complexity | 1 |
| smooth_landmarks | True |
| min_detection_confidence | 0.4 |
| min_tracking_confidence | 0.4 |
I landmark grezzi vengono convertiti in un vettore a 134 dimensioni, invariante rispetto a traslazione e scala.
Raw landmarks are converted into a 134-dimensional feature vector, invariant to translation and scale.
Ogni segno conosciuto ha un template di riferimento. Il sistema confronta la sequenza in ingresso con ogni template tramite DTW.
Each known sign has a stored reference template. The system compares the input sequence against every template using DTW.
Il DTW trova l'allineamento ottimale tra due serie temporali a velocita diverse, accumulando distanze euclidee frame per frame lungo il miglior percorso monotono. Risultato normalizzato per lunghezza del percorso.
DTW finds the optimal alignment between two time series at different speeds, accumulating frame-by-frame Euclidean distances along the best monotonic path. Result normalized by path length.
I confini dei segni vengono rilevati tracciando un segnale di energia di movimento: i picchi separati da valli individuano i segmenti candidati. Ogni segmento viene confrontato tramite DTW e la parola migliore aggiunta alla coda.
Sign boundaries are detected via a motion energy signal: peaks separated by valleys identify candidate segments. Each segment is DTW-matched and the best word is added to the queue.
I segni riconosciuti si accumulano come lista ordinata. Alla riproduzione, la lista viene inviata a OpenAI gpt-4o-mini con prompt vincolato.
Recognized signs accumulate as an ordered list. On playback, the list is sent to OpenAI gpt-4o-mini with a constrained prompt.
[ Noi, Tecnologia, Vita, Migliorare, Guerra, Serve, Non ]
La frase viene inviata all'API TTS di ElevenLabs con il modello eleven_multilingual_v2.
The sentence is sent to the ElevenLabs TTS API using the eleven_multilingual_v2 model.
| ParametroParameter | ValoreValue |
|---|---|
| stability | 0.5 |
| similarity_boost | 0.75 |
Restituisce audio MP3, codificato base64, inviato al browser sullo stesso WebSocket come JSON tipo speech.
Returns MP3 audio, base64-encoded, sent to the browser over the same WebSocket as a JSON speech message.
Un endpoint WebSocket FastAPI trasmette due payload per ogni fotogramma:
A FastAPI WebSocket endpoint streams two payloads per processed frame:
Il frontend disegna il video su un canvas, sovrappone i landmark e mostra le parole come chip. L'utente richiede la riproduzione e il backend esegue LLM + TTS.
The frontend draws video on a canvas, overlays landmarks and displays words as chips. The user triggers playback and the backend runs LLM + TTS.
| LivelloLayer | TecnologiaTechnology |
|---|---|
| Backend | Python, FastAPI, WebSocket, OpenCV, NumPy |
| Computer Vision | MediaPipe Holistic (BlazePose + manihands + visoface) |
| RiconoscimentoRecognition | DTW custom su spazio 134-DCustom DTW on 134-D feature space |
| LinguaggioLanguage | OpenAI gpt-4o-mini |
| VoceVoice | ElevenLabs eleven_multilingual_v2 TTS |
| Frontend | Vanilla JS, HTML5 Canvas, WebSocket, HTML5 Audio |