Wayland keyboard in python and C

Iniziative e progetti della comunità legati a Ubuntu.
Regole della sezione
Questa sezione ha lo scopo di raccogliere le iniziative/progetti della nostra Comunità legati ad Ubuntu. I progetti ospitati nascono da iniziative degli utenti o gruppi di utenti. In futuro i progetti potrebbero rimanere iniziative "personali" o essere integrate nella distribuzione, sponsorizzate da Ubuntu o da Canonical a discrezione dei responsabili. All'interno di essa sarà possibile inserire delle discussioni che hanno la funzione di pubblicizzare avvenimenti, iniziative e progetti software su Ubuntu e GNU/Linux in generale. Sarà inoltre possibile per gli utenti proporre lo sviluppo di nuovi software e in questo caso la discussione di richiesta avrà la funzione di generare un requisito funzionale del prodotto da sviluppare.

Sezione I - Iniziative
  • Fanno parte di iniziative, ad esempio, le seguenti categorie: corsi, progetti editoriali, libri.
  • La segnalazione di un'iniziativa avviene creando una discussione con l'annuncio.
  • Una volta effettuata la segnalazione, la discussione viene chiusa dal Gruppo Forum.
  • Se l'iniziativa esposta comporta un costo di adesione o fruizione, questo deve essere esplicitamente riportato all'interno della discussione.
  • È obbligatorio segnalare all'interno della discussione i riferimenti per poter contattare/partecipare all'iniziativa.
Sezione II - Progetti
  • La segnalazione di un progetto software, come per le iniziative, avviene e si sviluppa all'interno di una singola discussione.
  • Sarà consentito l'inserimento di software solo se rilasciati sotto licenza GPL (in tutte le sue versioni) o equivalente FOSS, tale da garantire agli utenti l'utilizzo del prodotto senza restrizioni e agli sviluppatori la proprietà intellettuale del codice prodotto.
  • Nell'oggetto della discussione dovrà essere riportata la categoria (es. [Iniziativa], [Progetto] o [Proposta]) e una semplice descrizione del progetto.
  • Se il progetto ha già un sito che lo ospita sarà a discrezione del Gruppo Forum chiuderla come segnalazione o lasciarla aperta.
  • Se il progetto non ha un sito che lo ospita si potranno aprire due discussioni, una per proporre modifiche/implementazioni (dove nel titolo occorre specificare [sviluppo]) ed una per segnalare problemi (e nel titolo dovrà comparire [supporto]).
  • Non è consentita l'apertura di nuove discussioni in riferimento a versioni superiori o modificate di un prodotto già riportato in precedenza.
  • Se il software oggetto del progetto ha una dimensione non superiore ai 128 kB, per prodotti che non hanno un sito che li ospita, sarà possibile allegarlo alla discussione.
Sezione III - Proposte
  • Una proposta deve essere eseguita e si svilupperà all'interno di una singola discussione.
  • Le proposte dovranno essere inserite direttamente nella sezione "Progetti della Comunità".
  • Dovranno essere specificate le funzionalità che devono essere sviluppate.
  • Non dovranno essere riportate diciture tipo "...deve fare come questo software...", ma indicare nel miglior modo possibile i requisiti.
  • Una volta segnalata la discussione resterà aperta per consentire uno scambio di idee su come sviluppare il codice o finché gli sviluppatori non forniranno una soluzione (da pubblicizzare poi, come visto prima, nella sezione Progetti) che ne soddisfi il requisito.
Per quanto non esposto sopra, si fa comunque riferimento al Regolamento del forum ed al Codice di Condotta della Comunità.
LUBO-BACK
Prode Principiante
Messaggi: 89
Iscrizione: mercoledì 19 gennaio 2022, 1:00
Sesso: Maschile

Wayland keyboard in python and C

Messaggio da LUBO-BACK »

Ciao a tutti, sono stato a lungo assente.

Ho messo giù un progetto carino durante le feste, dovendo usare kde plasma con un 2 in 1.

Supporta lo swipe, il riconoscimento della scrittura a mano (via api google ed anche in locale). Idem per lo speech recognition (google e vosk).

Se qualcuno è interessato, posso condividere il codice, che è ben commentato. Sono circa 1500 righe di Python più due "motori" in C per la parte matematica. Ho fatto tutto in una sessantina di ore a tempo perso perché mi ha aiutato anche l'AI, altrimenti ci avrei messo di più. Mi dava fastidio non avere una buona osk per linux.

L'ho proposta a Kde plasma, ma il team aborre le Gtk in favore di Qt... Però la loro maliit fa schifo:)

Vi lascio un video https://www.youtube.com/watch?v=3LuOhEI_nYo

Fatemi sapere.

Luca
Avatar utente
wilecoyote
Tenace Tecnocrate
Tenace Tecnocrate
Messaggi: 16811
Iscrizione: giovedì 20 agosto 2009, 16:21
Desktop: Kubuntu et alii
Distribuzione: 9.04 32bit 14/18/20/22.04 LTS 64bit
Sesso: Maschile
Località: Ceranesi - Ge

Re: Wayland keyboard in python and C

Messaggio da wilecoyote »

) Salve, proporre un'applicazione Gtk a Plasma/KDE è come curare i calli colle caramelle balsamiche.

Proponila a Gnome semmai.

:: Ciao
ACER Extensa 5230E 2,2 Ghz cpu Celeron 900 hdd 160 GB Ram 1 GB scheda video Intel GM500
ACER Extensa 5635Z 2,2 Ghz cpu Celeron T3100 hdd 320 GB Ram 4 GB scheda video Intel Mobile 4
Quando una Finestra chiusa incontra un Pinguino la Finestra chiusa è una Finestra aperta.
LUBO-BACK
Prode Principiante
Messaggi: 89
Iscrizione: mercoledì 19 gennaio 2022, 1:00
Sesso: Maschile

Re: Wayland keyboard in python and C

Messaggio da LUBO-BACK »

Sarà un post lunghissimo, ma ha carattere informativo.

E' di carattere tecnico e rivolto a chi programma, da un lato, e a chi avesse piacere di fare da tester con dispositivi 2 in 1 o tablet puri.

La tastiera può essere ovviamente usata anche col mouse ma, fatta salva l'utilità per le persone con qualche difficoltà fisica, è più che altro mirata all'uso con le dita o lo stiilo.

Spero di incuriosirvi, visto che qui c'è gente sveglia con cui sarebbe bello collaborare per dare a Gnu Linux una tastiera su schermo decente dopo anni di progetti inconcludenti.

Mi piacerebbe farne un progetto condiviso e, già adesso, è una tastiera non lontana da quelle di Android come performance ed addirittura ha maggiori funzionalità.

La programmazione, in sè, è stata la cosa più facile, il difficile è stato imparare, ricercare e mettere insieme le informazioni necessarie e le numerose risorse open source disponibili in rete.

Mi sono fatto aiutare da Gemini a scrivere il riassunto di come funziona la mia tastiera ed ho però inserito miei commenti e precisazioni.

Non è una semplice tastiera "clicca e scrivi", ma un tentativo, come ho detto prima, di portare funzionalità tipiche delle tastiere "mobile" (come Gboard o SwiftKey) su desktop Linux, utilizzando l'AI ibrida (Online/Offline).


1. Descrizione Generale
Wayland Keyboard Experimental è una tastiera virtuale flottante e personalizzabile. Utilizza il protocollo Layer Shell per disegnarsi sopra le altre finestre in ambienti Wayland. Si distingue per l'integrazione di motori di intelligenza artificiale per il riconoscimento della scrittura a mano, la dettatura vocale e la correzione automatica, offrendo un approccio ibrido che permette di scegliere tra servizi Cloud (Google) e modelli locali (Vosk, TensorFlow Lite) per la privacy.
  • Il mio scopo iniziale era di avere una tastiera Pure Wayland e non una che usasse il backend x11 perché prima o poi Xwayland verrà rimosso, poi mi sono lasciato portare un po’ dall’entusiasmo ed ho deciso di aggiungere tutte le funzionalità delle tastiere android. Poi ci ho messo anche i motori locali per dare un tocco di privacy.
  • Il progetto è tutto mio, non c'è una riga di codice scopiazzata in giro perché non esiste nulla di simile. Mi sono fatto aiutare dall'AI per alcune parti, ma la direzione tecnica (per così dire) è sempre stata mia.
  • Al contrario, le tecnologie e la matematica le ho trovate pronte da applicare, erano lì in attesa.
2. Tecnologie Impiegate
  • Il progetto è un mix di Python puro, interfacce grafiche GTK e librerie C per le prestazioni.
    Linguaggio Core: Python 3.11 (perché il 3.14 ha al momento problemi di compatibilità, ma ovviamente più versioni di Python possono coesistere, basta eseguire il .py con la versione giusta)[l/ist]
    • Interfaccia Grafica (GUI):
      Il vantaggio enorme di usare Python per la GUI non è solo nel fatto che è meno "verboso" e più facile di Rust od addirittura C, ma che, non essendo complilato, editare lo script anche per minime correzioni, aggiungere una classe, modifcare un dettaglio, richiede poco tempo. Python è un bel mix tra potenza e leggerezza, certo non bisigna delegargli il lavoro pesante perché è pur sempre un linguaggio interpretato.
    • Il .py si occupa, ad ogni avvio di controllare sia la presenza dei dizionari delle 50.000 parole più diffuse delle lingue supportate (italiano, inglese. spagnolo, tedesco e francese) e, se necessario, di scaricarli, sia di verificare se ci sono i motori in C. In mancanza, la modalità di fallback fa comunque funzionare la tastiera, ma in modo dummy.
    • GTK 3 (via PyGObject): Per i widget, pulsanti e finestre.
    • GtkLayerShell: Libreria critica che permette alla finestra di comportarsi come un pannello/overlay in Wayland (ancoraggio, livelli, esclusione input).
      NB: manca in Gnome, come vedremo sotto.
    • Cairo: Per il disegno vettoriale delle tracce di swipe e della scrittura a mano.
    • Qui la difficoltà è stata duplice, ovvero disegnare un layer sopra ai tasti e fare in modo che swipe e digitazione comunque arrivassero ai tasti stessi e condividere il layer con la schermata dell'handwriting recognition, in quanto l'utilizzo di due layer creava continue interruzioni e, soprattutto con Google input tools, era un macello.
    • Input System:
      python-uinput: Interagisce direttamente con il kernel Linux per simulare la pressione fisica dei tasti. La tastiera viene vista dal sistema come una periferica fisica reale e ad ogni input corrisponde il segnale del pulsante della tastiera fisica come mappato dal layout scelto.
    • NB: per come funziona Linux, il layout non dipende dalla tastiera fisica in sè, ma dal layout che l’utente sceglie nel desktop di riferimento. Io, per esempio, ho una qwerty US ed uso il layout US intl. with dead keys e questo bisogna "spiegarlo" alla OSK.
      Per questo ho implementato, ma non è ancora nella versione corrente, un sistema di calibrazione che renda la OSK agnostica rispetto alle scelte dell’utente e svincola la OSK dall'essere uguale alla tastiera fisica.
    • Intelligenza Artificiale e Motori locali:
      TensorFlow Lite (tflite): rete neurale per il riconoscimento della scrittura a mano offline (file handwriting.tflite).
      Vosk:pPer il riconoscimento vocale offline veloce e locale.
      SpeechRecognition: Wrapper per l'uso delle API Google Speech (online).
      NumPy & Pillow (PIL): per la pre-elaborazione delle immagini delle tracce disegnate prima di passarle al modello neurale (dipende dal modello impiegato, è importante sia a risoluzione, che lo spessore del tratto etc.)
    • Ottimizzazione (Ctypes):
      Il codice carica librerie condivise .so compilate in C (swipe_engine.so, autocorrect_trie.so) per calcoli pesanti come l'algoritmo di swipe e la ricerca veloce nel dizionario (Trie structure), aggirando la lentezza di Python nei loop complessi.
      I due approcci tecnici impiegati nel codice in C sono la matrice di Levenshtein ed il pruning che è un sistema per “sfrondare” la necessità di ricercare ad ogni step tutte le 50.000 parole del dizionario. Sfrutto ovviamente idee di altri, ma le metto insieme in modo abbastanza originale. D'altra parte le risorse rispetto a quelle di Google sono ridicole ed è necessario un approccio diverso.
    3. Feature Implementate
    • Modalità di Input
    • Digitazione Classica: Layout QWERTY completo con tasti modificatori (Shift, Ctrl, Alt, ecc.).
      Qui, come detto sopra, ho anche realizzato un sistema di calibrazione della tastiera che non ho ancora implementato nella versione corrente. E’ una cosa che si potrebbe fare se diventasse un progetto della comunità.
    • Swipe / Glide Typing: Supporto per trascinare il dito/stilo tra le lettere. Utilizza un algoritmo in C per calcolare il percorso migliore.
    • In Italiano ed Inglese funziona bene. Magari qualcosa potrebbe essere aggiustata, ma è comunque utilizzabile tutti i giorni e non lontana da Gboard.
    • Non c'è nulla di simile per Linux, i pochi plugin esistenti per altre tastiere usano Presage che sta al mio sistema come un cavallo (forse un mulo) sta ad un'automobile.
    • Scrittura a Mano (Handwriting) - non esiste virtualmente su Linux, se si escludono gli embrionali tentativi con Tesseract e PaddleOCR. Prima di elaborare la mia strada, ho testato tutte le alternative e le ho scartate.
    • Modalità Online: Usa le API non documentate ma gratuite di Google Input Tools. Precisione uguale alla tastiera di Google, ovviamente serve la connessione.
    • Modalità Offline: Usa un modello TensorFlow Lite già addestrato e scaricato legalmente da Github.
    • User Pattern Matcher: Sistema per "insegnare" gesti personalizzati rapidi (implementato per sicurezza quando nella precedente versione usavo una scarsissima rete neurale testata sui cartelli stradali)
    • Qui, in realtà, nel riconoscimento della scrittura con TFlite che è intrinsecamente molto meno preciso, soprattutto nelle parole brevi, delle Api di Google, ho creato anche un motore geometrico che concorre con la rete neurale e ne cerca di prevenire gli errori (Gemini non deve averlo notato!).
    • Mi servirebbe un modello migliore, quello che utilizzo riconosce singole parole e non le frasi, ma mi manca una buona GPU per allenarlo. La scrittura con motore locale funziona, come si può vedere nel video, il codice che la gestisce è già ok, ma non è all'altezza di Google input tools. Diciamo che sta al 60% scarso, ma con un modello professionale andrebbe al 90% in un attimo.
    • Dettatura Vocale (Voice Typing): Loop continuo di ascolto con pulsante dedicato (supporto Google Online o Vosk Offline).
      Qui Vosk funziona moooolto bene e mi stupisce. Anche perché utilizzo la versione meno pesante, se scaricassi quella da un Giga, penso sarebbe perfetto (non dovrei fare altro che sostituire il file).
    • Emoji: Pannello dedicato con categorie per l'inserimento rapido.
    • Predizione e Correzione
      Next-Word Prediction: Suggerisce la parola successiva basandosi su bigrammi (coppie di parole frequenti, es: "Ciao" -> "come"). Ci sono margini di miglioramento.
      Autocorrezione: Corregge errori di digitazione usando dizionari di frequenza (scaricati da GitHub se mancanti) e un motore Trie in C.
      Apprendimento: La tastiera impara nuovi vocaboli digitati dall'utente e li salva localmente.
    • Interfaccia e UX
      Temi: Supporto per temi (Nero, Bianco, Blu) con gestione colori via CSS dinamico.
      Layout JSON: I layout della tastiera (mappatura tasti e visualizzazione) sono definiti in file JSON esterni, rendendola facilmente estendibile per altre lingue. Qui verrà superato dalla calibrazione della tastiera. se diventerà un progetto condiviso.
    • Floating Icon: Un'icona mobile "sempre in primo piano" per richiamare la tastiera quando minimizzata (con animazione di "accartocciamento").
    • Docking Mode: Possibilità di ancorare la tastiera al fondo dello schermo (stile smartphone) o lasciarla flottante.
    • Trasparenza e Ridimensionamento: Opacità e dimensioni del font regolabili al volo.
    • Feedback Sonoro: Suoni di click meccanici sintetizzati proceduralmente all'avvio (senza bisogno di file wav esterni).
    4. Compatibilità Desktop (Compositor)

    • Poiché il codice utilizza GtkLayerShell, la tastiera NON funzionerà su X11. Funziona solo su compositori Wayland che supportano il protocollo wlr-layer-shell.
    • NB: ho anche delle versioni minori fatte come esperimento che funzionano con x11 o con Xwayland. Sono buggate o perché preliminari o perché, nelle ultime versioni, gestire tutte le funzionalità con tecnologie diverse è diventato complesso e poi il mio è un progetto da vacanze di Natale e da noia quando il film in tv non mi interessa. Per lo sforzo che ci ho messo, mi ha ripagato anche troppo.
    • Pienamente Compatibile:

      Sway (i3-compatible Wayland compositor)
      Hyprland
      Phosh (Phone Shell - Librem 5, PinePhone)
      Wayfire
      River

      Parzialmente Compatibile / Richiede estensioni:

      KDE Plasma (Wayland session): Le versioni recenti supportano il layer-shell, magari tra 3 o 4 anni non sarà così. Anche Plasma mobile funziona senza problemi (fatti salvi quelli intrinseci a Plasma mobile!).
      GNOME (Wayland session): GNOME non supporta nativamente il layer-shell. Dovrebbe esistere un’estensione, ma io non sono riuscito a trovarla. Resta la possibilità di sfruttare Xwayland con la versione alternativa della tastiera/
    5. Istruzioni per l'Installazione
    Poiché è uno script "sperimentale", non c'è un pacchetto .deb o .rpm (non sto a farlo perché. se volessi distribuirlo, il codice in C dovrebbe essere complilato al momento, come da policy della maggiorparte delle distro). Devi eseguirlo da sorgente.

    Prerequisiti di Sistema
    Devi avere installato le librerie di sviluppo Python 3.11 (non altre versioni), GTK3 e le dipendenze audio/input.

    (Comandi per Debian/Ubuntu/Raspberry Pi OS):

    Codice: Seleziona tutto

    Bash: occhio, il comando sotto va adattato per Python 3.11!!! Qui Gemini ha sbagliato a generalizzare.
    
    
    sudo apt update
    sudo apt install python3-pip python3-gi python3-gi-cairo gir1.2-gtk-3.0 gir1.2-gtk-layer-shell-0.1 libgirepository1.0-dev libcairo2-dev libasound2-dev portaudio19-dev python3-pyaudio
    
    Nota: Assicurati che gir1.2-gtk-layer-shell-0.1 sia disponibile. Su alcune distro vecchie potrebbe mancare.

    Dipendenze Python
    Installa le librerie richieste dallo script:

    Codice: Seleziona tutto

    Bash
    
    
    pip3 install numpy pillow requests vosk speechrecognition tensorflow-aarch64 
    # Nota: se sei su PC x86_64 usa 'tensorflow' o 'tflite-runtime'. 
    # Se 'python-uinput' non si installa via pip, usa apt: sudo apt install python3.11-uinput
    pip3 install python-uinput
    
    File Esterni Necessari (li fornirò quando pubblicherò il codice, insieme al .py)

    Lo script fa riferimento a file che devono esistere nella stessa cartella (BASE_DIR):
    swipe_engine.so (Libreria C compilata per lo swipe).
    autocorrect_trie.so (Libreria C compilata per l'autocorrezione).
    handwriting.tflite (Il modello neurale per la scrittura, quello che potrebbe essere migliore).
    vosk-model-small-it (Cartella del modello Vosk scaricata dal sito ufficiale Vosk e posizionata in ~/.config/wayland-keyboard o nella cartella script).

    Senza le librerie .so, la tastiera si avvierà ma Swipe e Autocorrect saranno disabilitati (lo script gestisce l'errore).

    Permessi Input (Cruciale)
    La tastiera usa uinput per digitare. Di default, solo root può scriverci.
    Hai due opzioni:
    Metodo Rapido (Sconsigliato per sicurezza): Esegui lo script con sudo.
    Metodo Corretto: Crea una regola udev per dare i permessi al tuo utente.

    Codice: Seleziona tutto

    [code]Bash
    echo 'KERNEL=="uinput", MODE="0660", GROUP="input", OPTIONS+="static_node=uinput"' | sudo tee /etc/udev/rules.d/99-uinput.rules
    sudo udevadm control --reload-rules
    sudo udevadm trigger
    sudo usermod -aG input $USER
    # Poi riavvia o fai logout/login
    [/code]

    Avvio

    Codice: Seleziona tutto

    Bash
    
    
    python3.11  wayland-keyboard-experimental.py

    Se vedi errori relativi a gtk-layer-shell non trovato, significa che il tuo Desktop Environment non supporta quel protocollo o manca la libreria gir1.2.

    Alla fine, sui miei pc funziona tutto, ma senza 10-20 tester con diverse risoluzioni e desktop, è difficile verificare se c'è qualcosa da sistemare. E" per questo che sarebbe bello farne un progetto di comunità.

    I motori in C sono già abbastanza solidi, il codice Python funziona, ma potrebbero esserci bug. Superando di slancio le 1500 righe inizia ad essere un po' più complesso da gestire senza errori in fase di modifica o implementazione di nuove feature.
Ultima modifica di LUBO-BACK il venerdì 23 gennaio 2026, 20:41, modificato 3 volte in totale.
LUBO-BACK
Prode Principiante
Messaggi: 89
Iscrizione: mercoledì 19 gennaio 2022, 1:00
Sesso: Maschile

Re: Wayland keyboard in python and C

Messaggio da LUBO-BACK »

wilecoyote ha scritto:
giovedì 22 gennaio 2026, 23:16
) Salve, proporre un'applicazione Gtk a Plasma/KDE è come curare i calli colle caramelle balsamiche.

Proponila a Gnome semmai.

:: Ciao

Con Gnome ci sono altri problemi, vedi mio lughissimo post:)
LUBO-BACK
Prode Principiante
Messaggi: 89
Iscrizione: mercoledì 19 gennaio 2022, 1:00
Sesso: Maschile

Re: Wayland keyboard in python and C

Messaggio da LUBO-BACK »

Allego i file oggetto dello spiegone di cui sopra.

Il file .py l'ho dovuto rinominare in .txt perché non me lo accettava, ovviamente andrà ripristinato il giusto suffisso per eseguirlo.

Allego anche i file in C, da compilare ovviamente

gcc -shared -o autocorrect_trie.so -fPIC autocorrect_trie.c

gcc -shared -o swipe_engine.so -fPIC swipe_engine.c

RIlascio in preview a questa community. Se avrò modo, lo farò anche su Github.

Anche se dubito che ci farò mai una causa sopra, la licenza è da intendersi GNU/GPL.

Buona lettura.

Luca

PS: non ho allegato né il file di Vosk, nè il modello per l'handwriting perchè pesano troppo. Stasera o domani controllo la policy del sito e vedo se si può inserire un link al mio cloud.
Allegati
swipe_engine.c
(4.18 KiB) Scaricato 3 volte
autocorrect_trie.c
(4.24 KiB) Scaricato 4 volte
wayland-keyboard-experimental.txt
(79.22 KiB) Scaricato 4 volte
Scrivi risposta

Ritorna a “Progetti della Comunità”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti