Différences entre versions de « Projets:Read For Me »

De wikilab
Ligne 51 : Ligne 51 :
  
 
===Les contraintes===
 
===Les contraintes===
 +
  
 
* '''Fonctionnement hors ligne''' : fonctionnement hors ligne ne nécessitant pas de connexion internet
 
* '''Fonctionnement hors ligne''' : fonctionnement hors ligne ne nécessitant pas de connexion internet
Ligne 56 : Ligne 57 :
 
* '''Facile à prendre en main''' : ne nécessite pas ou très peu de formation
 
* '''Facile à prendre en main''' : ne nécessite pas ou très peu de formation
 
* '''Rapidité''' : 10 secondes d'attente maximum
 
* '''Rapidité''' : 10 secondes d'attente maximum
 +
  
 
==Analyse de l'existant==
 
==Analyse de l'existant==
 +
  
 
Des solutions performantes existent déjà pour smartphone, par exemple l'application [https://www.microsoft.com/en-us/ai/seeing-ai seeing-ai de Microsoft]. Elles ne sont cependant pas satisfaisantes dans tous les cas, en effet :
 
Des solutions performantes existent déjà pour smartphone, par exemple l'application [https://www.microsoft.com/en-us/ai/seeing-ai seeing-ai de Microsoft]. Elles ne sont cependant pas satisfaisantes dans tous les cas, en effet :
Ligne 67 : Ligne 70 :
  
 
===Solutions commerciales===
 
===Solutions commerciales===
 +
  
 
Il semble d'autant plus pertinent de développer une solution "tout en 1" que ce genre de dispositifs est effectivement disponible dans le commerce, à des prix qui peuvent cependant paraître relativement élevés (à partir de 1000€ sur le site [https://www.mieux-voir.fr/107-machine-a-lire www.mieux-voir.fr])
 
Il semble d'autant plus pertinent de développer une solution "tout en 1" que ce genre de dispositifs est effectivement disponible dans le commerce, à des prix qui peuvent cependant paraître relativement élevés (à partir de 1000€ sur le site [https://www.mieux-voir.fr/107-machine-a-lire www.mieux-voir.fr])
 +
  
 
[[File:rfm_blaze.jpg|300px|Photo: Solution commerciale blaze]][[File:rfm_vocatex.jpg|300px|Photo: Solution commerciale vocatex]]
 
[[File:rfm_blaze.jpg|300px|Photo: Solution commerciale blaze]][[File:rfm_vocatex.jpg|300px|Photo: Solution commerciale vocatex]]
 +
  
 
===Projets DIY existant===
 
===Projets DIY existant===
 +
  
 
'''Machine à lire AccessDVLinux'''
 
'''Machine à lire AccessDVLinux'''
Ligne 92 : Ligne 99 :
  
 
Ce prototype (documenté sur ce wiki : [[Projets:Machine_a_lire_Mémo]]) est fonctionnel mais la partie synthèse vocale ne fonctionne que pour l'anglais.
 
Ce prototype (documenté sur ce wiki : [[Projets:Machine_a_lire_Mémo]]) est fonctionnel mais la partie synthèse vocale ne fonctionne que pour l'anglais.
 +
  
 
[[File:rfm_proto_circuit.jpg|340px|Photo: circuit du prototype "PiTextReader"]]  [[File:rfm_pitextreader.JPG|340px|Photo: prototype en carton "PiTextReader"]]
 
[[File:rfm_proto_circuit.jpg|340px|Photo: circuit du prototype "PiTextReader"]]  [[File:rfm_pitextreader.JPG|340px|Photo: prototype en carton "PiTextReader"]]
 +
  
 
Durant le Fabrikarium, une partie de l'équipe va travailler à faire fonctionner la lecture en français et améliorer l'expérience utilisateur de ce prototype.
 
Durant le Fabrikarium, une partie de l'équipe va travailler à faire fonctionner la lecture en français et améliorer l'expérience utilisateur de ce prototype.
Ligne 99 : Ligne 108 :
  
 
===Solutions logicielles===
 
===Solutions logicielles===
 +
  
 
Au niveau logiciel, en plus de la gestion de l'interface utilisateur, la machine à lire consiste à faire fonctionner successivement deux processus :
 
Au niveau logiciel, en plus de la gestion de l'interface utilisateur, la machine à lire consiste à faire fonctionner successivement deux processus :
 
* la transformation de l'image en texte, qu'on appelle l'OCRisation,
 
* la transformation de l'image en texte, qu'on appelle l'OCRisation,
 
* la transformation du texte en son : la synthèse vocale.
 
* la transformation du texte en son : la synthèse vocale.
 
  
 
Pour l'OCRisation, toutes les solutions mentionnées plus haut utilisent le logiciel 'tesseract' disponible sous linux et notamment sur raspbian (pour le raspberry pi).
 
Pour l'OCRisation, toutes les solutions mentionnées plus haut utilisent le logiciel 'tesseract' disponible sous linux et notamment sur raspbian (pour le raspberry pi).
Ligne 112 : Ligne 121 :
  
 
Orca gère l'entièreté du processus, mais n'est malheureusement pas simple à contrôler sans un clavier. En tant que lecteur d'écran, il est fait pour être utilisé avec des applications de bureau et non de manière embarqué dans un dispositif sans écran/souris/clavier.
 
Orca gère l'entièreté du processus, mais n'est malheureusement pas simple à contrôler sans un clavier. En tant que lecteur d'écran, il est fait pour être utilisé avec des applications de bureau et non de manière embarqué dans un dispositif sans écran/souris/clavier.
 +
  
 
==Déroulement du fabrikarium==
 
==Déroulement du fabrikarium==
 +
  
 
===Prototypage d'une version portable===
 
===Prototypage d'une version portable===
  
Le premier jour du fabrikarium, alors que les contraintes techniques par rapport au cahier des charges esperé n'étaient pas encore bien connues, l'équipe de designeur·euse·s s'affaire à prototyper une version portable. Il s'agit de prendre en compte l'encombrement des différents composants (batterie, raspberry pi) dans la conception d'un boîtier, et de réfléchir à l'interface de commande, c'est-à-dire les boutons nécessaires et leur disposition sur le boîtier. Cela se fait d'abord par le dessin puis la réalisation d'un prototype en carton.
+
 
 +
Le premier jour du fabrikarium, alors que les contraintes techniques par rapport au cahier des charges esperé n'étaient pas encore bien connues, l'équipe de designeur·euse·s s'affaire à prototyper une version portable. Il s'agit de prendre en compte l'encombrement des différents composants (batterie, raspberry pi) dans la conception d'un boîtier, et de réfléchir à l'interface de commande, c'est-à-dire les boutons nécessaires et leur disposition sur le boîtier.
 +
 
 +
Cela se fait d'abord par le dessin puis la réalisation d'un prototype en carton.
  
 
[[File:rfm_proto_carton1.JPG|700px|Photo: design d'interface pour la version portable]]   
 
[[File:rfm_proto_carton1.JPG|700px|Photo: design d'interface pour la version portable]]   
Ligne 124 : Ligne 138 :
 
''Photo: François teste un prototype en carton''
 
''Photo: François teste un prototype en carton''
  
/photo de François avec le prototype en main/
+
 
  
 
Dès le lendemain cependant, on se rend compte qu'il sera compliqué de faire un boitier portable pour l'instant. En effet la mise au point de la caméra et le redressement de l'image ne sont pas encore fonctionnelle sur raspberry pi. La detection du texte ou d'une feuille de papier n'est pas simple non plus et nous ne trouvons aucun projet fonctionnel et documenté à ce sujet.
 
Dès le lendemain cependant, on se rend compte qu'il sera compliqué de faire un boitier portable pour l'instant. En effet la mise au point de la caméra et le redressement de l'image ne sont pas encore fonctionnelle sur raspberry pi. La detection du texte ou d'une feuille de papier n'est pas simple non plus et nous ne trouvons aucun projet fonctionnel et documenté à ce sujet.
Ligne 137 : Ligne 151 :
  
 
[[File:rfm_anim_1.gif|350px|Animation: Dépliage de l'appareil]][[File:rfm_anim_2.gif|350px|Animation: Zoom sur l'articulation]]
 
[[File:rfm_anim_1.gif|350px|Animation: Dépliage de l'appareil]][[File:rfm_anim_2.gif|350px|Animation: Zoom sur l'articulation]]
 +
  
 
'''Conception des boutons'''
 
'''Conception des boutons'''
Ligne 143 : Ligne 158 :
  
 
Le principe utilisé consiste à utiliser un boutons par fonction, celle ci étant identifiable à partir d'une pictogramme en relier sur chaque bouton.
 
Le principe utilisé consiste à utiliser un boutons par fonction, celle ci étant identifiable à partir d'une pictogramme en relier sur chaque bouton.
 +
  
 
[[File:rfm_boutons.png|700px|Image: Rendu de la modélisation des boutons]]
 
[[File:rfm_boutons.png|700px|Image: Rendu de la modélisation des boutons]]
 +
  
 
[[File:rfm_boitier_boutons.JPG|700px|Photo: Les boutons sur le boitier]]
 
[[File:rfm_boitier_boutons.JPG|700px|Photo: Les boutons sur le boitier]]
 +
  
 
===Développements logiciels à partir de la machine à lire AccessDVLinux===
 
===Développements logiciels à partir de la machine à lire AccessDVLinux===
  
 
Les développements sont disponibles sur un dépot git hébergé sur le compte github de MHK : [https://github.com/myhumankit/ReadForMe ReadForMe]
 
Les développements sont disponibles sur un dépot git hébergé sur le compte github de MHK : [https://github.com/myhumankit/ReadForMe ReadForMe]
 +
  
 
'''Principe de fonctionnement'''
 
'''Principe de fonctionnement'''
  
 
Le script principal est le script python <tt>Main.py</tt> qui permet de faire l'interface entre les commandes connectées au <tt>raspberry pi</tt>, le script d'aquisition <tt>OCRSCan</tt> et le lecteur d'écran <tt>Orca</tt>.
 
Le script principal est le script python <tt>Main.py</tt> qui permet de faire l'interface entre les commandes connectées au <tt>raspberry pi</tt>, le script d'aquisition <tt>OCRSCan</tt> et le lecteur d'écran <tt>Orca</tt>.
 +
  
 
[[File:rfm_principe.png|700px|Schéma: Schéma de principe du dispositif]]
 
[[File:rfm_principe.png|700px|Schéma: Schéma de principe du dispositif]]
 
''Schéma: Schéma de principe du dispositif''
 
''Schéma: Schéma de principe du dispositif''
 +
[[:File:RFM_principe_export.svg]]
  
[[:File:RFM_principe_export.svg]]
 
  
 
'''Main.py'''
 
'''Main.py'''
Ligne 169 : Ligne 189 :
 
* '''<tt>encoder.py</tt>''' : définition de l'objet <tt>RotatyEncoder</tt> permettant de lire les encodeurs et définition des actions des encodeurs rotatifs
 
* '''<tt>encoder.py</tt>''' : définition de l'objet <tt>RotatyEncoder</tt> permettant de lire les encodeurs et définition des actions des encodeurs rotatifs
 
* '''<tt>send_shortcuts.py</tt>''' : émulation des raccourcis clavier (avec <tt>xdotool</tt>) permettant de contrôler <tt>orca</tt>
 
* '''<tt>send_shortcuts.py</tt>''' : émulation des raccourcis clavier (avec <tt>xdotool</tt>) permettant de contrôler <tt>orca</tt>
 +
  
 
'''Gestion de l'alimentation'''
 
'''Gestion de l'alimentation'''
 
 
<span style="color:#FFFFFF; background:#00C000; padding:5px"> Testé et fonctionnel</span>
 
<span style="color:#FFFFFF; background:#00C000; padding:5px"> Testé et fonctionnel</span>
  
Ligne 179 : Ligne 199 :
 
* démarrer le raspberry pi lorsqu'il est éteint en utilisant le fait que cette broche est déjà programmé pour réaliser cette action
 
* démarrer le raspberry pi lorsqu'il est éteint en utilisant le fait que cette broche est déjà programmé pour réaliser cette action
 
* éteindre le raspberry pi (c'est à dire arréter proprement le système d'exploitation <tt>raspbian</tt>) à l'aide d'une action définie en python et exécutée à l'aide du module <tt>subprocess</tt>
 
* éteindre le raspberry pi (c'est à dire arréter proprement le système d'exploitation <tt>raspbian</tt>) à l'aide d'une action définie en python et exécutée à l'aide du module <tt>subprocess</tt>
 +
  
 
'''Gestion des boutons'''
 
'''Gestion des boutons'''
 
 
<span style="color:#FFFFFF; background:#00C000; padding:5px"> Testé et fonctionnel</span>
 
<span style="color:#FFFFFF; background:#00C000; padding:5px"> Testé et fonctionnel</span>
  
Ligne 202 : Ligne 222 :
 
button_alim.when_pressed = alim_event
 
button_alim.when_pressed = alim_event
 
</pre>
 
</pre>
 +
  
 
'''Gestion des encodeurs rotatifs'''
 
'''Gestion des encodeurs rotatifs'''
 
 
<span style="color:#FFFFFF; background:#00C000; padding:5px"> Testé et fonctionnel</span>
 
<span style="color:#FFFFFF; background:#00C000; padding:5px"> Testé et fonctionnel</span>
  
Ligne 235 : Ligne 255 :
 
debit_encoder.when_rotated = debit_event
 
debit_encoder.when_rotated = debit_event
 
</pre>
 
</pre>
 +
  
 
[[File:rfm_circuit_pi.JPG|700px|Prototypage du câblage des boutons sur breadboard]]
 
[[File:rfm_circuit_pi.JPG|700px|Prototypage du câblage des boutons sur breadboard]]
Ligne 241 : Ligne 262 :
  
 
'''Action des raccourcis clavier sur <tt>orca</tt>'''
 
'''Action des raccourcis clavier sur <tt>orca</tt>'''
 
 
<span style="color:#FFFFFF; background:#CC0000; padding:5px">Non testé</span>
 
<span style="color:#FFFFFF; background:#CC0000; padding:5px">Non testé</span>
  
Ligne 247 : Ligne 267 :
  
 
Si le déclenchement d'action du clavier à partir de python par l'intermédiaire d' <tt>xdotool</tt> semble fonctionnel, nous n'avons pas pu tester son intégration avec <tt>orca</tt> lors de la lecture du document.  
 
Si le déclenchement d'action du clavier à partir de python par l'intermédiaire d' <tt>xdotool</tt> semble fonctionnel, nous n'avons pas pu tester son intégration avec <tt>orca</tt> lors de la lecture du document.  
 +
  
 
'''Execution d'OCRSCan'''
 
'''Execution d'OCRSCan'''
 
 
<span style="color:#FFFFFF; background:#FFA500; padding:5px">partiellement fonctionnel</span>
 
<span style="color:#FFFFFF; background:#FFA500; padding:5px">partiellement fonctionnel</span>
  
Ligne 258 : Ligne 278 :
 
* lancement de <tt>orca</tt>
 
* lancement de <tt>orca</tt>
 
* ouverture du fichier texte avec <tt>mousepad</tt>
 
* ouverture du fichier texte avec <tt>mousepad</tt>
 +
  
 
'''Prise de vue avec autofocus'''
 
'''Prise de vue avec autofocus'''
 
 
<span style="color:#FFFFFF; background:#00C000; padding:5px">Testé et fonctionnel</span>
 
<span style="color:#FFFFFF; background:#00C000; padding:5px">Testé et fonctionnel</span>
  
Ligne 266 : Ligne 286 :
  
 
Le script <tt>Aquisition_scan.py</tt> est un copier/coller du script [https://github.com/ArduCAM/RaspberryPi/blob/master/Motorized_Focus_Camera/Autofocus.py Autofocus.py] de l'exemple cité plus haut ou seul la destination de l'image obtenue est changée.
 
Le script <tt>Aquisition_scan.py</tt> est un copier/coller du script [https://github.com/ArduCAM/RaspberryPi/blob/master/Motorized_Focus_Camera/Autofocus.py Autofocus.py] de l'exemple cité plus haut ou seul la destination de l'image obtenue est changée.
 +
  
 
'''Détection de la feuille et redressement de l'image'''
 
'''Détection de la feuille et redressement de l'image'''
 
 
<span style="color:#FFFFFF; background:#FFA500; padding:5px">partiellement fonctionnel</span>
 
<span style="color:#FFFFFF; background:#FFA500; padding:5px">partiellement fonctionnel</span>
  
Ligne 276 : Ligne 296 :
  
 
Malheureusement, il fonctionne dans des conditions assez précises qui ne permettent pas son utilisation "à mains levés" par une personne mal voyante. Il faut par exemple que les 4 coins de la pages soient bien cadrées, et il est relativement sensible à l'éclairage.  
 
Malheureusement, il fonctionne dans des conditions assez précises qui ne permettent pas son utilisation "à mains levés" par une personne mal voyante. Il faut par exemple que les 4 coins de la pages soient bien cadrées, et il est relativement sensible à l'éclairage.  
 +
 
   
 
   
 
'''OCRisation avec tesseract'''
 
'''OCRisation avec tesseract'''
 
 
<span style="color:#FFFFFF; background:#00C000; padding:5px">Testé et fonctionnel</span>
 
<span style="color:#FFFFFF; background:#00C000; padding:5px">Testé et fonctionnel</span>
  
Ligne 289 : Ligne 309 :
  
 
Toutes les configurations et modifications présentées plus bas sont intégrées sur le dépôts, dans le script d'installation <tt>install.sh</tt> et dans le scrip python <tt>pitextreader.py</tt>.
 
Toutes les configurations et modifications présentées plus bas sont intégrées sur le dépôts, dans le script d'installation <tt>install.sh</tt> et dans le scrip python <tt>pitextreader.py</tt>.
 +
  
 
'''Synthèse vocale en français'''
 
'''Synthèse vocale en français'''
Ligne 319 : Ligne 340 :
 
espeak-ng -v mb/mb-fr4 "Test d'un texte à lire en français"
 
espeak-ng -v mb/mb-fr4 "Test d'un texte à lire en français"
 
</pre>
 
</pre>
 +
  
 
'''Ajout d'un ruban led'''
 
'''Ajout d'un ruban led'''
Ligne 329 : Ligne 351 :
  
 
L'utilisation de leds addessables nécessite de lancer le script python en tant qu'utilisateur root. Cela fonctionnait bien sur le raspberry pi 2 utilisé lors du Fabrikarium, mais pas avec le raspberry pi 4 utilisé après coup pour rédiger la documentation. Le ruban led a donc été desactivé dans la version de <tt>PiTextReader</tt>.
 
L'utilisation de leds addessables nécessite de lancer le script python en tant qu'utilisateur root. Cela fonctionnait bien sur le raspberry pi 2 utilisé lors du Fabrikarium, mais pas avec le raspberry pi 4 utilisé après coup pour rédiger la documentation. Le ruban led a donc été desactivé dans la version de <tt>PiTextReader</tt>.
 +
  
 
==Matériel nécessaire==
 
==Matériel nécessaire==
Ligne 368 : Ligne 391 :
 
!scope="col"| nombre
 
!scope="col"| nombre
 
!scope="col"| coût
 
!scope="col"| coût
 +
!scope="col"| lien
 
|-
 
|-
 
| Raspberry pi 4
 
| Raspberry pi 4
Ligne 373 : Ligne 397 :
 
| 1
 
| 1
 
| 60€
 
| 60€
 +
| [https://www.gotronic.fr/art-carte-raspberry-pi-4-b-2-gb-30349.htm 1]
 
|-
 
|-
 
| Arducam
 
| Arducam
Ligne 378 : Ligne 403 :
 
| 1
 
| 1
 
| 18,90€
 
| 18,90€
 +
| [https://www.gotronic.fr/art-module-camera-5-mpx-autofocus-b0176-31619.htm 1]
 +
|-
 +
| Ampli audio mono
 +
| 14,90€
 +
| 1
 +
| 14,90€
 +
| [https://www.gotronic.fr/art-module-ampli-audio-gravity-dfr0064-19310.htm 1]
 +
|-
 +
| Batterie portable USB 2 ports
 +
| 18,90€
 +
| 1
 +
| 18,90€
 +
|
 +
|-
 +
| Encodeurs rotatifs
 +
| 5€
 +
| 2
 +
| 10€
 +
|
 +
|-
 +
| Boutons poussoirs
 +
| 0.5€
 +
| 6
 +
| 3€
 +
|
 +
|-
 +
| Ruban led
 +
| 18,90€
 +
| 1
 +
| 18,90€
 +
|
 
|}
 
|}
 
  
 
https://www.gotronic.fr/art-module-camera-5-mpx-autofocus-b0176-31619.htm
 
https://www.gotronic.fr/art-module-camera-5-mpx-autofocus-b0176-31619.htm
  
 
==Délai estimé==
 
==Délai estimé==
 +
  
 
==Fichiers source==
 
==Fichiers source==
 +
  
 
==Étape de fabrication pas à pas==
 
==Étape de fabrication pas à pas==
Ligne 395 : Ligne 452 :
 
* installation des dépendances logicielles
 
* installation des dépendances logicielles
 
* démarrage automatique
 
* démarrage automatique
 +
  
 
===Schéma de cablage===
 
===Schéma de cablage===
 +
  
 
Le schéma suivant présente la manière dont les différents composants sont connectés au raspberry pi. Les boutons et encodeurs n'ont pas été intégrés dans le prototype final faute de temps.   
 
Le schéma suivant présente la manière dont les différents composants sont connectés au raspberry pi. Les boutons et encodeurs n'ont pas été intégrés dans le prototype final faute de temps.   
 +
  
 
[[File:rfm_circuit.png|700px|Schéma: Schéma de cablage]]
 
[[File:rfm_circuit.png|700px|Schéma: Schéma de cablage]]
 
''Schéma de cablage''
 
''Schéma de cablage''
 +
  
 
'''Cablage de l'audio'''
 
'''Cablage de l'audio'''
Ligne 409 : Ligne 470 :
 
* Le câble audio a une prise jack 3.5mm mono d'un côté et un connecteur dupont femelle a deux broches de l'autre côté.
 
* Le câble audio a une prise jack 3.5mm mono d'un côté et un connecteur dupont femelle a deux broches de l'autre côté.
 
* Le câble du haut parleur est connecté avec un bornier à vis du côté de l'amplification et soudé au haut parleur.
 
* Le câble du haut parleur est connecté avec un bornier à vis du côté de l'amplification et soudé au haut parleur.
 +
  
 
[[File:rfm_cablageampli.JPG|700px|Photo: Câblage de l'amplification]]  
 
[[File:rfm_cablageampli.JPG|700px|Photo: Câblage de l'amplification]]  
'''Câblage de l'amplification'''
+
''Câblage de l'amplification''
  
  
Ligne 424 : Ligne 486 :
 
Le boitier est fabriqué avec du contreplaqué de 3mm découpé au laser.
 
Le boitier est fabriqué avec du contreplaqué de 3mm découpé au laser.
  
[[File:rfl_decoupe.png|700px|Image: Plan de découpe du boitier]]
+
 
 +
[[File:rfm_decoupe.png|700px|Image: Plan de découpe du boitier]]
 +
 
  
 
L'assemblage se fait à partir de queue d'arrondes droites maintenues par des boulons.
 
L'assemblage se fait à partir de queue d'arrondes droites maintenues par des boulons.
Ligne 434 : Ligne 498 :
 
[[File:rfm_polissage.JPG|700px|Photo: polissage du diffusant pour les leds]]
 
[[File:rfm_polissage.JPG|700px|Photo: polissage du diffusant pour les leds]]
 
''Polissage du diffusant pour les leds''
 
''Polissage du diffusant pour les leds''
 +
  
 
Les composants (leds, ampli, batteries) sont fixés au boitier à l'aide d'un pistolet à colle.
 
Les composants (leds, ampli, batteries) sont fixés au boitier à l'aide d'un pistolet à colle.
Ligne 439 : Ligne 504 :
  
 
[[File:rfm_montage_boitier.JPG|700px|Photo: Montage du boitier]]
 
[[File:rfm_montage_boitier.JPG|700px|Photo: Montage du boitier]]
'''Montage du boîtier'''
+
''Montage du boîtier''
 +
 
  
 
[[File:rfm_boitier_colle.JPG|700px|Photo: Collage en place des composants]]
 
[[File:rfm_boitier_colle.JPG|700px|Photo: Collage en place des composants]]
'''Collage des composants dans le boitier'''
+
''Collage des composants dans le boitier''
 +
 
 +
 
 +
Après quelques tests, on se rend compte que le signal audio est fortement perturbé. Toutes les liaisons électroniques sont alors recouvertes de papier aluminium. Ce qui semble efficace.
  
Après quelques tests, on se rend compte que le siglal audio est fortement perturbé. Toutes les liaisons électroniques sont alors recouvertes de papier aluminium. Ce qui semble efficace.
 
  
 
[[File:rfm_boitier_aluminium.jpg|700px]]
 
[[File:rfm_boitier_aluminium.jpg|700px]]
''Ajout de papier aluminium'''
+
''Ajout de papier aluminium''
  
  
  
[[File:rfm_boitier_interieur.JPG|700px]]
+
[[File:rfm_boitier_interieur.JPG|700px|Photo: intégration des composants]]
 +
''Intégration des composants''
  
  
[[File:rfm_boitier_test.JPG|700px]]
+
[[File:rfm_boitier_test.JPG|700px|Premiers tests]]
 +
''Premiers tests'''
  
 
==Notes diverses==
 
==Notes diverses==

Version du 18 novembre 2020 à 14:05

Présentation du projet

Description

Le but est de créer une petite machine à lire portable capable d’acquérir le texte à partir d'une capture d'image et de le lire au moyen d’une synthèse vocale.

Équipe

  • François, ArianeGroup, porteur de projet
  • Lucie, MHK, coordination
  • Leyla, ArianeGroup
  • Aldrick, ArianeGroup
  • Evan, stagiaire MHK, étudiant Epitech
  • Baptiste, IMT
  • Célia, designer
  • Théo, fabmanager Eesab
  • Laurent, Floss Manuals, documentation

Photo: L'équipe autour de la table

Photo: L'équipe concentrée sur une démonstration de Christophe

Résumé

Le Fabrikarium a permis d'avancer sur de nombreux aspects mais nous n'avons pas eu le temps de recoller les briques ensemble afin de disposer d'un prototype complètement fonctionnel :

  • Christophe a fait fonctionné sa machine à lire sur un raspberry pi en ajoutant la prise en charge de la prise de vue et de l'autofocus
  • Aldrick et Evan ont développé toute l'interface logicielle et électronique pour le contrôleur de la machine à lire :gestion des boutons poussoirs et encodeurs rotatifs d'une part et action pour la prise de vue et le déclenchement des raccourcis clavier nécessaire au contrôle de la lecture d'autre part)
  • Baptiste a ajouté la lecture en français et perfectionné l'expérience utilisateur d'un prototype existant basé sur PiTextReader (voir plus bas)
  • Lucie, Lydia, Théo et Célia ont développé un nouveau prototype matériel en soignant le design de la machine et l'interface du contrôleur adapté pour des personnes mal-voyantes (boutons en relief)

Cette documentation détaille les avancées réalisées sur chacun des points ainsi qu'un tutoriel de réalisation d'un prototype pour lequel il manque néanmoins des étapes (par exemple l'intégration des boutons).

Cahier des charges

Fonctionnalités principales

  • Lecture audio sur un haut parleur
  • Lecture d'une page A4 multicolonnne en langue française

Fonctionnalités secondaires

  • réglage du débit / de la vitesse de lecture
  • réglage du volume sonore
  • éclairage
  • possibilité de mettre en pause
  • bouton de mise en marche et de mise à l'arrêt
  • prise de vue autofocus

Les contraintes

  • Fonctionnement hors ligne : fonctionnement hors ligne ne nécessitant pas de connexion internet
  • Portable : fonctionnement sur batterie
  • Facile à prendre en main : ne nécessite pas ou très peu de formation
  • Rapidité : 10 secondes d'attente maximum


Analyse de l'existant

Des solutions performantes existent déjà pour smartphone, par exemple l'application seeing-ai de Microsoft. Elles ne sont cependant pas satisfaisantes dans tous les cas, en effet :

  • Tout le monde ne dispose pas d'un smartphone ou ne souhaite pas en disposer car ils peuvent être difficiles à prendre en main, notamment pour des personnes agées ou déficientes mentales et ce d'autant plus si celles-ci sont mal-voyants.
  • Leur usage n'est pas forcément adapté dans le cadre d'école ou de centre d'accueil.
  • Les services utilisés ne fonctionne généralement pas hors ligne et cela pose question par rapport au respect de la vie privée et à la divulgation possible d'informations sensibles ou confidentielles sur les serveurs des entreprises qui fournissent ces solutions.


Solutions commerciales

Il semble d'autant plus pertinent de développer une solution "tout en 1" que ce genre de dispositifs est effectivement disponible dans le commerce, à des prix qui peuvent cependant paraître relativement élevés (à partir de 1000€ sur le site www.mieux-voir.fr)


Photo: Solution commerciale blazePhoto: Solution commerciale vocatex


Projets DIY existant

Machine à lire AccessDVLinux

AccessDVLinux est une distribution linux pour déficients visuels développé par Christophe. Dans ce cadre, Christophe a également dévellopé un logiciel de machine à lire : [1].

Ce logiciel fonctionne en mode bureau à l'aide d'un scanner.

Pour répondre à notre cahier des charges, certaines adaptations sont nécessaires :

  • Le logiciel doit pouvoir fonctionner à partir d'une caméra à la place du scanner.
  • Il doit pouvoir fonctionner sans environnement de bureau, c'est à dire sans écran et sans interaction avec la souris et le clavier.
  • Le contrôle de la prise de vue et de la lecture doit se faire à partir de boutons "physiques"
  • Il faut pouvoir installer tous les composants logiciels sur un raspberry pi, ce qui n'est pas évident car celui ci n'a sur la même base matériel qu'un ordinateur de bureau ou qu'un ordinateur portable (en particulier son processeur basé sur l'architecture ARM)


Machine à lire sur Raspberry Pi

En amont du Fabrikarium, Lucie et Delphine de MHK ont produit un prototype de machine à lire à partir du projet documenté sur la plateforme Instructables PiTextReader.

Ce prototype (documenté sur ce wiki : Projets:Machine_a_lire_Mémo) est fonctionnel mais la partie synthèse vocale ne fonctionne que pour l'anglais.


Photo: circuit du prototype "PiTextReader" Photo: prototype en carton "PiTextReader"


Durant le Fabrikarium, une partie de l'équipe va travailler à faire fonctionner la lecture en français et améliorer l'expérience utilisateur de ce prototype.


Solutions logicielles

Au niveau logiciel, en plus de la gestion de l'interface utilisateur, la machine à lire consiste à faire fonctionner successivement deux processus :

  • la transformation de l'image en texte, qu'on appelle l'OCRisation,
  • la transformation du texte en son : la synthèse vocale.

Pour l'OCRisation, toutes les solutions mentionnées plus haut utilisent le logiciel 'tesseract' disponible sous linux et notamment sur raspbian (pour le raspberry pi).

La question est plus délicate pour la partie synthèse vocale, pour laquelle de nombreuses solutions existent à différents niveaux d'intégration : depuis le lecteur d'écran Orca jusqu'aux briques logicielles plus élémentaires (qu'orca utilise en partie) : speech-dispatcher, espeak, mbrola.

Chacune de ses briques a en effet un rôle particulier pour la réalisation de la synthèse vocale.

Orca gère l'entièreté du processus, mais n'est malheureusement pas simple à contrôler sans un clavier. En tant que lecteur d'écran, il est fait pour être utilisé avec des applications de bureau et non de manière embarqué dans un dispositif sans écran/souris/clavier.


Déroulement du fabrikarium

Prototypage d'une version portable

Le premier jour du fabrikarium, alors que les contraintes techniques par rapport au cahier des charges esperé n'étaient pas encore bien connues, l'équipe de designeur·euse·s s'affaire à prototyper une version portable. Il s'agit de prendre en compte l'encombrement des différents composants (batterie, raspberry pi) dans la conception d'un boîtier, et de réfléchir à l'interface de commande, c'est-à-dire les boutons nécessaires et leur disposition sur le boîtier.

Cela se fait d'abord par le dessin puis la réalisation d'un prototype en carton.

Photo: design d'interface pour la version portable

Photo: François teste un prototype en carton Photo: François teste un prototype en carton


Dès le lendemain cependant, on se rend compte qu'il sera compliqué de faire un boitier portable pour l'instant. En effet la mise au point de la caméra et le redressement de l'image ne sont pas encore fonctionnelle sur raspberry pi. La detection du texte ou d'une feuille de papier n'est pas simple non plus et nous ne trouvons aucun projet fonctionnel et documenté à ce sujet.

On repart donc sur une version fixe, à l'image du prototype PiTextReader.

Nouveau prototype de boîtier et d'interface de commande

À partir de ces nouvelles contraintes, les designeur·euse·s décide de partir sur un boitier pliable qui aurait la forme d'un livre et pourrait donc se loger dans une bibliothèque.

L'animation ci dessous montre le principe du pliage/dépliage de l'appareil.

Animation: Dépliage de l'appareilAnimation: Zoom sur l'articulation


Conception des boutons

Le design joue un rôle important pour les dispositifs utilisé par des personnes mal-voyantes.

Le principe utilisé consiste à utiliser un boutons par fonction, celle ci étant identifiable à partir d'une pictogramme en relier sur chaque bouton.


Image: Rendu de la modélisation des boutons


Photo: Les boutons sur le boitier


Développements logiciels à partir de la machine à lire AccessDVLinux

Les développements sont disponibles sur un dépot git hébergé sur le compte github de MHK : ReadForMe


Principe de fonctionnement

Le script principal est le script python Main.py qui permet de faire l'interface entre les commandes connectées au raspberry pi, le script d'aquisition OCRSCan et le lecteur d'écran Orca.


Schéma: Schéma de principe du dispositif Schéma: Schéma de principe du dispositif File:RFM_principe_export.svg


Main.py

Main.py fait appel à plusieurs modules python dont les fonctionnalités sont :

  • constantes.py : définition des ports GPIO utilisés pour les boutons et les encodeurs
  • buttons.py : définition des actions des boutons poussoirs
  • encoder.py : définition de l'objet RotatyEncoder permettant de lire les encodeurs et définition des actions des encodeurs rotatifs
  • send_shortcuts.py : émulation des raccourcis clavier (avec xdotool) permettant de contrôler orca


Gestion de l'alimentation Testé et fonctionnel

Les Raspberry Pi n'ont pas de bouton pour les allumer et les éteindre. Il faut donc le définir nous même à partir des GPIO. La broche GPIO 3 permet de démarrer le raspberry pi quand elle est reliée à la masse.

Le bouton poussoir relié à cette broche a donc deux effets :

  • démarrer le raspberry pi lorsqu'il est éteint en utilisant le fait que cette broche est déjà programmé pour réaliser cette action
  • éteindre le raspberry pi (c'est à dire arréter proprement le système d'exploitation raspbian) à l'aide d'une action définie en python et exécutée à l'aide du module subprocess


Gestion des boutons Testé et fonctionnel

La lecture de l'état des boutons et l'exécution des actions qui leur sont liées sont gérées avec la bibliothèque gpiozero. Celle-ci permet en particulier de gérer le processus à l'aide d'événements non bloquants, dont la programmation est détaillée ci-après en prenant l'exemple du bouton d'alimentation.

from gpiozero import Button
from subprocess import run

# définition des actions à effectuer (= événement, dans buttons.py)
def alim_event():
    print("alim button pressed")
    run(['sudo','shutdown','now'])

# définition des broches utilisées (dans constantes.py)
GPIO_ALIM = 3

# liaison entre le bouton et l'action (dans Main.py)
button_alim = Button(GPIO_ALIM)
button_alim.when_pressed = alim_event


Gestion des encodeurs rotatifs Testé et fonctionnel

L'objet RotatyEncoder, définit dans encoder.py, permet de la même manière de relier les encodeurs à un événement, qui est également défini sous forme de fonction qui prend cette fois ci un argument qui permet de savoir sur l'encodeur est tourné dans un sens ou dans l'autre.

from encoder import RotaryEncoder
from send_shortcuts import send_shortcut

# événement attaché à l'encodeur (dans encoder.py)
switch_debit = False

def debit_event(val):
    global switch_debit
    switch_debit = not switch_debit
    if switch_debit:
        if val<0: # encodeur dans le sens inverse des aiguilles d'une montre
            print("débit down")
            send_shortcut('KP_Insert+Shift_L+KP_Page_Down')
        else:     # encodeur dans le sens des aiguilles d'une montre
            print("débit up")
            send_shortcut('KP_Insert+Shift_L+KP_Page_Up')

# définition des broches utilisées (dans constantes.py)
CLK_DEBIT = 24 #for debit encoder
DT_DEBIT = 25 #for volume encoder

# liaison entre l'encodeur et l'action (dans Main.py)
debit_encoder = RotaryEncoder(DT_DEBIT, CLK_DEBIT, True)
debit_encoder.when_rotated = debit_event


Prototypage du câblage des boutons sur breadboard Photo: Prototypage du câblage des boutons sur breadboard


Action des raccourcis clavier sur orca Non testé

Le seul moyen de contrôler le lecter orca en direct est l'utilisation de raccourci clavier. Ceux ci sont émulés à l'aide de l'utilitaire xdotool. C'est la méthode utilisée pour la version scanner d'OCRSCan.

Si le déclenchement d'action du clavier à partir de python par l'intermédiaire d' xdotool semble fonctionnel, nous n'avons pas pu tester son intégration avec orca lors de la lecture du document.


Execution d'OCRSCan partiellement fonctionnel

Le bouton capture lance l'exécution lOCRSCan. Il s'agit d'un script de bash qui va exécuter successivement les tâches suivantes (détailler dans les parties suivantes:

  • arrêt de orca
  • prise de vue et traitement de l'image
  • "ocrisation"
  • lancement de orca
  • ouverture du fichier texte avec mousepad


Prise de vue avec autofocus Testé et fonctionnel

Avec l'objectif de pouvoir réaliser une version portable, l'utilisation d'une picamera avec un autofocus a été testé. Le script utilisé est issue de la documentation d'Arducam : Motorized_Focus_Camera. Il nécessite d'activer la communication i2c à l'aide du script fourni enable_i2c_vc.sh.

Le script Aquisition_scan.py est un copier/coller du script Autofocus.py de l'exemple cité plus haut ou seul la destination de l'image obtenue est changée.


Détection de la feuille et redressement de l'image partiellement fonctionnel

Le script scan_main.py sert à détecter une page dans la photo prise à l'étape précedante, puis à corriger la perpective pour remettre la page à plat. En effet, le logiciel d'OCR tesseract admet de léger défauts de perspective mais la tolérance peut être bien plus grande si l'on est capable de redresser la page avec d'autres outils en amont.

Le script utilise du code issue du blog pyimagesearch

Malheureusement, il fonctionne dans des conditions assez précises qui ne permettent pas son utilisation "à mains levés" par une personne mal voyante. Il faut par exemple que les 4 coins de la pages soient bien cadrées, et il est relativement sensible à l'éclairage.


OCRisation avec tesseract Testé et fonctionnel


Amélioration du projet PiTextReader

En attendant que la solution basée sur le logiciel OCRScan soit fonctionnelle sur raspberry pi, Baptiste a repris le prototype basé sur PiTextReader en y ajoutant le français et une voix française mbrola. Ce prototype ne prend pas en charge l'autofocus et ne permet pas encore de gérer les paramètres de lecture (vitesse, volume, navigation dans le texte).

La version modifiée du code de PiTextReader est disponible sur un dépôt github de MHK.

Toutes les configurations et modifications présentées plus bas sont intégrées sur le dépôts, dans le script d'installation install.sh et dans le scrip python pitextreader.py.


Synthèse vocale en français

La version originale de 'PiTextReader' utilise le logiciel flite comme moteur de synthèse vocale, or celui-ci ne fonctionne pas avec le français.

Pour le français, nous utilisons deux logiciels, spd-say qui est fourni avec le paquet speech-dispatcher, et espeak-ng. Ils sont disponibles dans les dépots raspbian :

sudo apt-get install speech-dispatcher espeak-ng


L'installation de mbrola se fait à partir d'un paquet debian qui n'est pas celui des dépots par défaut du raspberry pi. Pour l'installer :

wget http://steinerdatenbank.de/software/mbrola3.0.1h_armhf.deb
sudo dpkg -i mbrola3.0.1h_armhf.deb

Les voix françaises sont bien installable depuis les dépots raspbian :

sudo apt-get install mbrola-fr1

On peut utiliser une des voix française mbrola (par exemple fr4) avec espeak :

espeak-ng -v mb/mb-fr4 "Test d'un texte à lire en français"


Ajout d'un ruban led

Afin d'avoir une luminosité suffisante lors de la prise de photo, des rubans leds RVB addressables ont été ajouté. Pour les contrôler, nous utilisons la librairie python rpi_ws281x. Pour l'installer :

sudo pip install rpi_ws281x

L'utilisation de leds addessables nécessite de lancer le script python en tant qu'utilisateur root. Cela fonctionnait bien sur le raspberry pi 2 utilisé lors du Fabrikarium, mais pas avec le raspberry pi 4 utilisé après coup pour rédiger la documentation. Le ruban led a donc été desactivé dans la version de PiTextReader.


Matériel nécessaire

Electronique

  • raspberry pi 4
  • carte sd
  • arducam caméra pour raspberry pi, 5Mp, autofocus (gotronic)
  • batterie de secours ("power bank") USB, 5V
  • boutons poussoirs (x6)
  • encodeur rotatif (x2)
  • bande de leds
  • ampli audio DF Robot
  • haut parleur
  • un morceau de cable USB (alimentation ampli)

Fabrication du boitier

  • contreplaqué 5mm
  • fil PLA impression 3d
  • PMMA diffusant ou transparent

Outils nécessaires

Électronique

  • fer à souder

Fabrication

  • Découpeuse laser
  • Imprimante 3d


Coût

+ Légende du tableau
Référence coût unitaire nombre coût lien
Raspberry pi 4 60€ 1 60€ 1
Arducam 18,90€ 1 18,90€ 1
Ampli audio mono 14,90€ 1 14,90€ 1
Batterie portable USB 2 ports 18,90€ 1 18,90€
Encodeurs rotatifs 5€ 2 10€
Boutons poussoirs 0.5€ 6 3€
Ruban led 18,90€ 1 18,90€

https://www.gotronic.fr/art-module-camera-5-mpx-autofocus-b0176-31619.htm

Délai estimé

Fichiers source

Étape de fabrication pas à pas

Installation du raspberry pi

  • configuration du raspberry pi
  • installation des dépendances logicielles
  • démarrage automatique


Schéma de cablage

Le schéma suivant présente la manière dont les différents composants sont connectés au raspberry pi. Les boutons et encodeurs n'ont pas été intégrés dans le prototype final faute de temps.


Schéma: Schéma de cablage Schéma de cablage


Cablage de l'audio

Le cablage du module d'amplification nécessite 3 câbles qui doivent être fabriqués ou modifiés :

  • Le cable d'alimentation est un cable USB dont une des extrémités a été coupé et remplacé par un connecteur dupont femelle à deux broches.
  • Le câble audio a une prise jack 3.5mm mono d'un côté et un connecteur dupont femelle a deux broches de l'autre côté.
  • Le câble du haut parleur est connecté avec un bornier à vis du côté de l'amplification et soudé au haut parleur.


Photo: Câblage de l'amplification Câblage de l'amplification


Photo: Test du circuit d'amplification audio Test du circuit d'amplification audio


Réalisation du boitier

Le boitier est fabriqué avec du contreplaqué de 3mm découpé au laser.


Image: Plan de découpe du boitier


L'assemblage se fait à partir de queue d'arrondes droites maintenues par des boulons.


Une fois l'extérieur du boitier assemblé, on ajoute la couverture des ouvertures pour l'éclairage, qui sont deux petites pièces d'acrylique transparentes découpées au laser et dépolie au papier de verre afin de les rendre diffusantes.


Photo: polissage du diffusant pour les leds Polissage du diffusant pour les leds


Les composants (leds, ampli, batteries) sont fixés au boitier à l'aide d'un pistolet à colle.


Photo: Montage du boitier Montage du boîtier


Photo: Collage en place des composants Collage des composants dans le boitier


Après quelques tests, on se rend compte que le signal audio est fortement perturbé. Toutes les liaisons électroniques sont alors recouvertes de papier aluminium. Ce qui semble efficace.


Rfm boitier aluminium.jpg Ajout de papier aluminium


Photo: intégration des composants Intégration des composants


Premiers tests Premiers tests'

Notes diverses

La piste easyocr

Contrôle d'orca

Pour contrôler le lecteur d'écran orca, on utilise l'émulation d'événement clavier à partir de l'utilitaire xdotool

KP_Add
play
Ctrl
pause
KP_Down
reculer d'un mot
KP_Up
avancer d'un mot
Ins+Maj+KP_PageUp
augmenter le volume
Ins+Maj+KP_PageDown
diminuer le volume
Ins+Ctrl+KP_PageUp
augmenter le débit
Ins+Ctrl+KP_PageDown
diminuer le débit