Logo

Ursa Robotics

Η σελίδα για το Project 'Έξυπνο Σπίτι' του 1ου ΕΠΑ.Λ. Πρέβεζας

Δείτε το έργο στο GitΗub https://github.com/stav98/UrsaRobotics_SmartHome

Αναγνώριση ομιλίας και φωνητικών εντολών

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

Στο παρακάτω σχήμα βλέπουμε τον τρόπο διασύνδεσης όλων των προγραμμάτων μέσω του πρωτοκόλλου mqtt. Στη πραγματικότητα το MQTT Message Bus είναι το σύνολο των εντολών subscribe και publish μεταξύ των προγραμμάτων και του broker.

Μεγένθυση

Από την πλευρά του hardware, πρέπει να βάλουμε μια USB κάρτα ήχου ή μια USB κάμερα με μικρόφωνο επειδή το Raspberry δεν διαθέτει συσκευή ηχογράφησης. Από την πλευρά του λογισμικού χρησιμοποιήσαμε την έτοιμη βιβλιοθήκη SpeechRecognition για την online μηχανή αναγνώρισης της Google. Η βιβλιοθήκη αυτή υποστηρίζει και offline αναγνώριση φωνής με το πακέτο CMUSphinx, αλλά δεν προλάβαμε να ασχοληθούμε με αυτό.

Πρέπει να εγκατασταθούν τα ακόλουθα πακέτα:

  • sudo apt-get install libportaudio0 libportaudio2 libportaudiocpp0 portaudio19-dev

    Σε άλλα συστήματα ίσως χρειαστεί το flac:
    sudo apt-get install flac
  • sudo pip3 install pyaudio
  • sudo pip3 install SpeechRecognition

Αρχικά σκεφτήκαμε να ακούει συνεχώς τον χώρο, αλλά με οποιαδήποτε φασαρία ή θόρυβο προσπαθεί να αναγνωρίσει την ομιλία απαντώντας με την έκφραση αστοχίας “Δεν κατάλαβα τι είπες.”. Έπειτα σκεφτήκαμε να ενεργοποιούμε την ακρόαση ομιλίας σφυρίζοντας, χτυπώντας παλαμάκια ή λέγοντας μια λέξη κλειδί. Γι’ αυτό χρησιμοποιήσαμε την βιβλιοθήκη sopare ώστε μετά να καλεί το SpeechRecognition. Και πάλι τα αποτελέσματα δεν ήταν ικανοποιητικά. Τελικά κάναμε ότι και στα smart phones, δηλαδή πριν μιλήσουμε πατάμε σύντομα το εφεδρικό κουμπί στο J2 (ακροδέκτες 7 & 8). Αν το πατήσουμε παρατεταμένα παίζει ραδιόφωνο. Τότε το tts.py μας ειδοποιεί με την φράση “Σας ακούω”. Την δημοσίευση mqtt του ελεγκτή την ακούει και το πρόγραμμα speech_recogn.py το οποίο μπαίνει σε κατάσταση ακρόασης και αποκωδικοποίησης των φωνητικών εντολών. Αν γίνει επιτυχής αποκωδικοποίηση τότε δημοσιεύει το αντίστοιχο mqtt topic και γυρίζει σε κατάσταση αναμονής, δηλαδή περιμένει να ξαναπατήσουμε το κουμπί. Την επιβεβαίωση της εκτέλεσης αναλαμβάνει το tts.py το οποίο μας ειδοποιεί με φωνή για την ενέργεια. Αν δεν γίνει σωστή αναγνώριση, περιμένει 20sec και γυρίζει πάλι σε κατάσταση αναμονής.

Στην γραμμή 91 δηλώνουμε τον αριθμό της συσκευής ηχογράφισης στην παράμετρο device_index:

 with sr.Microphone(device_index=2) as source:

Για να βρούμε τον αριθμό της συσκευής εκτελούμε το αρχείο test.py :

  import speech_recognition as sr
  for index, name in enumerate(sr.Microphone.list_microphone_names()):
    print("Microphone with name \"{1}\" found for `Microphone(device_index={0})`".format(index, name))
 

Μετά την εκτέλεση εμφανίζει κάτι παρόμοιο:

  Python 3.5.3 (default, Sep 27 2018, 17:25:39)
  [GCC 6.3.0 20170516] on linux
  Type "copyright", "credits" or "license()" for more information.
  >>>
  ==================== RESTART: /home/pi/smarthome/test.py ====================
  Microphone with name "bcm2835 ALSA: - (hw:0,0)" found for `Microphone(device_index=0)`
  Microphone with name "bcm2835 ALSA: IEC958/HDMI (hw:0,1)" found for `Microphone(device_index=1)`
  Microphone with name "USB Device 0x471:0x307: Audio (hw:1,0)" found for `Microphone(device_index=2)`
  Microphone with name "sysdefault" found for `Microphone(device_index=3)`
  Microphone with name "dmix" found for `Microphone(device_index=4)`
  Microphone with name "default" found for `Microphone(device_index=5)`
  >>>
 

Για να ξεκινήσει η ακοκωδικοποίηση απαιτείται μια λέξη 'κλειδί' που στην περίπτωσή μας είναι η λέξη 'ΣΠΙΤΙ'. Δεν έχει σημασία η σειρά των λέξεων, αρκεί να υπάρχουν οι σωστές λέξεις μέσα στην πρόταση. Δηλαδή καταλαβαίνει το ίδιο καλά αν πούμε 'Σπίτι πες μου την εξωτερική θερμοκρασία' ή αν πόυμε 'Πες μου την εξωτερική θερμοκρασία στο σπίτι'. Και στις δύο περιπτώσεις ανιχνεύει τις λέξεις Σπίτι, Εξωτερική και Θερμοκρασία.

Τέλος το πρόγραμμα speech_recogn.py περιέχει τμήμα με τον κώδικα του tts.py ώστε να μας δίνει πληροφορίες όπως θερμοκρασίες, ώρα κλπ. Όπως και στα δύο προηγούμενα προγράμματα (tts.py και radio.py), αν θέλουμε να εκτελείται κατά την εκκίνηση του Raspberry, τότε πρέπει να το κάνουμε εκτελέσιμο και να το δηλώσουμε στο /etc/rc.local.

Δοκιμές αναγνώρισης με διαφορετικές φωνές μαθητών


Αρχική