SudoCapp

SudoCapp

Μια υποστηρικτική εφαρμογή για παιδιά με αυτισμό η οποία αξιοποιεί τεχνολογίες τεχνητής νοημοσύνης.

Η εφαρμογή θα λειτουργεί ως εικονικός φίλος και θα υπενθυμίζει στα παιδιά να κάνουν τις βασικές ρουτίνες της ημέρας, όπως να σηκώνονται από το κρεββάτι το πρωί, να πλένουν τα δόντια τους, να τρώνε πρωινό κ.ο.κ. Η επικοινωνία μεταξύ παιδιού και εφαρμογής θα γίνεται με ομιλία και θα υπάρχει ένα ολοκληρωμένο σύστημα αποφάσεων ανάλογα με τις λέξεις και τις φράσεις που χρησιμοποιούν τα παιδιά.

Έρευνα και σχεδιασμός

Αρχικά ξεκινήσαμε με τον σχεδιασμό του δέντρου αποφάσεων της εφαρμογής το οποίο αποτυπώσαμε στην εφαρμογή Mural. Μπορείτε να δείτε και να κατεβάσετε το δέντρο αποφάσεων από τον παρακάτω σύνδεσμο.

Σχεδιασμός χαρακτήρα

Για τον σχεδιασμό του χαρακτήρα που θα βρίσκεται στην οθόνη της εφαρμογής μια απλή επιλογή είναι το https://www.bitmoji.com/ Μπορούμε να δημιουργήσουμε έναν χαρακτήρα και μετά μας δίνει διάφορα emojis βασισμένα σε αυτόν. Δεν έχουν κίνηση αλλά υπάρχει μεγάλη ποικιλία και από χαρακτήρες και από stickers. Θα χρειαστούμε 10 εικόνες, μία για κάθε κατάσταση που ελέγχουμε και μία η οποία θα είναι η γενική. Τις αποθηκεύουμε τοπικά σε έναν φάκελο και τους δίνουμε ονόματα που περιγράφουν την κατάσταση τους.

Σχεδιασμός οθόνης στο AppInventor

Η εφαρμογή θα αποτελείται από μια μόνο οθόνη στην οποία το μεγαλύτερο μέρος θα το καταλαμβάνει μια εικόνα όπου θα εμφανίζουμε τα στιγμιότυπα από το avatar που έχουμε φτιάξει. Επίσης θα προσθέσουμε ένα label στο οποίο θα φαίνεται η ώρα και ένα button με το οποίο θα μπορούμε να κάνουμε reset στην κατάσταση των εργασιών που θα ελέγχουμε για να δοκιμάζουμε την εφαρμογή. Θα χρειαστούμε τρία clocks. Το ρολόι TimeClock θα εκτελείται διαρκώς κάθε δευτερόλεπτο και απλά θα αλλάζει την ώρα στο label. Το ρολόι MainClock θα τρέχει κάθε 20 δευτερόλεπτα και θα ελέγχει αν υπάρχει κάποια εργασία που πρέπει να γίνει ώστε να την ξεκινήσει. Το ρολόι ResponseClock θα τρέχει και αυτό κάθε 20 δευτερόλεπτα και θα ελέγχει την ολοκλήρωση μιας εργασίας που έχουμε ξεκινήσει. Τέλος θα χρειαστούμε το SpeechRecognizer και το TextToSpeech καθώς και μια βάση δεδομένων TinyDB για να κρατάμε την κατάσταση των εργασιών.

Όλα τα στοιχεία της οθόνης
Όλες οι εικόνες που θα χρησιμοποιήσουμε
Η εικόνα θα πρέπει να είναι clickable γιατί πατώντας πάνω της θα μπορούμε να μιλάμε στην εφαρμογή
Το MainClock θα έχει Interval 20 δευτερόλεπτα και θα είναι αρχικά ενεργοποιημένο
Το ResponseClock θα έχει και αυτό interval 20 δευτερόλεπτα και θα είναι αρχικά απενεργοποιημένο
Το TimeClock θα τρέχει κάθε 1 δευτερόλεπτο και θα είναι αρχικά ενεργοποιημένο
Στην βάση δεδομένων δίνουμε ένα όνομα στο namespace το οποίο να σχετίζεται με τα δεδομένα που κρατάει. Στην περίπτωση μας θα κρατάει την κατάσταση των εργασιών

Αναγνώριση θετικών και αρνητικών απαντήσεων

Στην ουσία η εφαρμογή θα δίνει προφορικές προτροπές στο παιδί και θα περιμένει την αντίδραση του για να καταλάβει αν έκανε τις απαραίτητες ενέργειες ή όχι. Για να καταλάβουμε αν η απάντηση του παιδιού είναι θετική ή αρνητική θα χρειαστεί να αναγνωρίζουμε τις λέξεις και τις προτάσεις που χρησιμοποιεί στις απαντήσεις του. Θα δημιουργήσουμε λίστες με λέξεις που φανερώνουν θετική ανταπόκριση και αντίστοιχα λίστες με αρνητική ανταπόκριση.

Ενδεικτικές λίστες για την αναγνώριση των απαντήσεων από τον χρήστη. Όσες περισσότερες βάλουμε τόσο καλύτερα! Επίσης προσέξτε πως πρέπει να ελέγχουμε τις πιθανές λέξεις και με μικρά ή κεφαλαία

Θετικές προτροπές

Όταν ο χρήστης θα απαντάει θετικά για την ολοκλήρωση μιας εργασίας τότε θα πρέπει να του δίνουμε ένα θετικό feedback. Θα κάνουμε μια λίστα με πιθανές θετικές αποκρίσεις από την εφαρμογή και κάθε φορά θα διαλέγουμε μία τυχαία.

Όσες περισσότερες φράσεις τόσο καλύτερα

Βασικές μεταβλητές

Θα χρειαστούμε τρεις μεταβλητές. Μία για να κρατάμε ποια είναι η τρέχουσα εργασία που προσπαθούμε να ολοκληρώσουμε, μία στην οποία θα ελέγχουμε αν μας έχει δώσει θετική απάντηση και μία στην οποία θα κρατάμε ολόκληρη την απάντηση του.

Λίστες και λεξικά με τις καθημερινές εργασίες

Για να μπορέσουμε να διαχειριστούμε όλες τις καθημερινές εργασίες που θα υποστηρίζει η εφαρμογή (ξύπνημα, πλύσιμο δοντιών, σχολείο κλπ) θα χρησιμοποιήσουμε λίστες και λεξικά. Η πρώτη λίστα που θα δημιουργήσουμε θα έχει μόνο τις ονομασίες των εργασιών, όπως φαίνεται παρακάτω.

Τα ονόματα των εργασιών

Για να κρατάμε την ώρα κατά την οποία θα πρέπει να έχει εκτελεστεί η εργασία θα χρησιμοποιήσουμε ένα λεξικό το οποίο για κάθε εργασία θα έχει μια λίστα με δύο τιμές. Η πρώτη θα είναι η ώρα και η δεύτερη τα λεπτά.

Προσοχή να έχουμε τα ίδια ονόματα με την βασική λίστα εργασιών!

Για τις προτροπές που θα δίνει η εφαρμογή για κάθε εργασία μόλις φτάσει η ώρα θα χρησιμοποιήσουμε πάλι ένα λεξικό.

Προσοχή πάλι να έχουμε τα ίδια ονόματα με την λίστα των εργασιών

Επίσης θα έχουμε και ένα λεξικό που θα περιλαμβάνει τις προτροπές που θα δίνει η εφαρμογή στην περίπτωση που ο χρήστης δεν έχει απαντήσει θετικά για κάποια εργασία.

Το λεξικό με τις προτροπές στις αρνητικές απαντήσεις του χρήστη

Τέλος θα χρειαστούμε και ένα λεξικό που θα έχει τις εικόνες για την κάθε κατάσταση.

Αρχικοποίηση των εργασιών

Η κατάσταση των εργασιών, αν δηλαδή έχουν ξεκινήσει, αν έχουν ολοκληρωθεί ή αν δεν έχουν ξεκινήσει θα είναι αποθηκευμένη στην βάση δεδομένων TinyDB. Ο λόγος για αυτό είναι επειδή δεν θέλουμε να χαθεί η κατάσταση στην περίπτωση που κλείσει η εφαρμογή και ανοίξει ξανά στην διάρκεια της ημέρας, ή αν ανοίξει και κλείσει το κινητό.

Όταν ξεκινάει η εφαρμογή όλες οι εργασίες είναι ανολοκλήρωτες. Επίσης όταν αλλάξει η ημέρα πάλι οι εργασίες θα πρέπει να ξεκινάν από την αρχή. Θα χρειαστούμε λοιπόν μια διαδικασία η οποία να κάνει αρχικά όλες τις εργασίες “Not started”.

Ονομάζω την διαδικασία Mark_all_tasks_as_not_started

Όταν ξεκινάει η εφαρμογή θα ελέγχω αν η βάση είναι άδεια (σημαίνει ότι ανοίγει για πρώτη φορά η εφαρμογή) και τότε θα αρχικοποιώ την βάση δεδομένων.

Κατά την διάρκεια των δοκιμών θα χρειαστεί να μπορώ να αρχικοποιώ τις εργασίες “χειροκίνητα” και για αυτό καλώ την διαδικασία και όταν πατηθεί το πλήκτρο reset

Ρολόι TimeClock

Το ρολόι TimeClock τρέχει συνέχεια κάθε δευτερόλεπτο και γράφει την ώρα στην οθόνη ενώ ελέγχει μήπως ολοκληρώθηκε η ημέρα και πρέπει να αρχικοποιηθούν πάλι οι εργασίες. Αρχικά θα χρειαστεί να δημιουργήσουμε μια διαδικασία η οποία να γράφει την ώρα στην ετικέτα LabelTime.

Επίσης θα χρειαστούμε και μια συνάρτηση η οποία θα ελέγχει αν είναι κάποια συγκεκριμένη ώρα. Η συνάρτηση αυτή θα δέχεται δύο τιμές (ώρα και λεπτά) και θα ελέγχει αν όντως είναι αυτή η τρέχουσα ώρα. Αν είναι θα επιστρέφει true αλλιώς θα επιστρέφει false.

Το TimeClock θα καλεί την διαδικασία Write_time και αν η ώρα είναι 0:00 δηλαδή μεσάνυχτα τότε θα αρχικοποιεί τις εργασίες για την επόμενη ημέρα.

Ρολόι MainClock και ResponseClock

Το ρολόι MainClock θα κάνει την βασική δουλειά του ελέγχου για την κατάσταση των εργασιών. Αρχικά θα χρειαστεί να φτιάξουμε μια συνάρτηση η οποία θα ελέγχει αν έχει περάσει η ώρα από μια συγκεκριμένη ώρα και λεπτά. Η συνάρτηση θα δέχεται ως παραμέτρους την ώρα και τα λεπτά και θα ελέγχει αν η τρέχουσα ώρα είναι μετά επιστρέφοντας true ή false αντίστοιχα.

Και πάμε τώρα στο MainClock. Εδώ θα πάρουμε με την σειρά όλα τα tasks και θα ελέγχουμε αν η ώρα έχει περάσει και αν αυτό το task δεν έχει ξεκινήσει ακόμα. Αν ισχύει αυτό τότε η εφαρμογή θα λέει την αντίστοιχη προτροπή και θα αποθηκεύει στην βάση δεδομένων την κατάσταση του task ως Started. Επίσης θα αλλάζει την εικόνα και θα σταματάει το MainClock ενώ παράλληλα θα ξεκινάει το ResponseClock.

Το ResponseClock θα ελέγχει τις απαντήσεις του χρήστη και αν είναι θετικές θα ολοκληρώνει το task αλλιώς θα συνεχίζει να δίνει προτροπές.

Επικοινωνία με τον χρήστη

Η επικοινωνία με τον χρήστη γίνει από το SpeechRecognizer

Σχόλια

Δεν υπάρχουν ακόμη σχόλια. Γιατί δεν ξεκινάτε τη συζήτηση;

Αφήστε μια απάντηση