Αποστολή sms με φωνητική εντολή

...τα πάντα για το open source στον χώρο των gadgets, συζητήσεις, εργαλεία, open hardware, οδηγοί κ.ά.

Συντονιστής: adem1

Αποστολή sms με φωνητική εντολή

Δημοσίευσηαπό malos » 30 Μαρ 2024, 04:48

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

Ανοίξτε το τερματικό και πριν απ' όλα εγκαταστήστε το portaudio19-dev
Κώδικας: Επιλογή όλων
sudo apt install portaudio19-dev


φτιάξτε ένα φάκελο πληκτρολογώντας
Κώδικας: Επιλογή όλων
mkdir sms



Ή ονομάστε τον όπως θέλετε και όχι απαραίτητα "sms"

Μπείτε στον φάκελο
Κώδικας: Επιλογή όλων
cd sms


Πληκτρολογήστε την εντολή
Κώδικας: Επιλογή όλων
python3 -m venv sms-venv


Αυτή η εντολή δημιουργεί έναν φάκελο που ονομάζεται "sms-venv" όπως το πληκτρολογήσατε. Αυτός θα προσφέρει ένα εικονικό περιβάλλον για να εγκαταστήσετε βιβλιοθήκες που θα χρειαστεί η εφαρμογούλα και για να μην τις εγκαταστήσετε καθολικά στο σύστημα.
Μπείτε τώρα στο περιβάλλον με την εντολή
Κώδικας: Επιλογή όλων
source sms-venv/bin/activate


Θα δείτε κάτι αλλαγμένο στο τερματικό εκεί που γράφει το όνομα χρήστη. θα έχει από μπροστά μία παρένθεση που θα γράφει (sms-venv)
Κάπως έτσι δηλαδή

Κώδικας: Επιλογή όλων
(sms-venv) user@name_PC:~/sms$


Εγκαταστήστε τώρα τις βιβλιοθήκες
Κώδικας: Επιλογή όλων
pip install SpeechRecognition sounddevice PyQt5 PyAudio


Αφού εγκατασταθούν οι βιβλιοθήκες, ανοίξτε με τον κειμενογράφο σας (αναφέρεται και ως "επεξεργαστής κειμένου") τον gedit είστε σε gnome ή τον pluma σε mate ή τον xed σε mint mate ή τον kate σε kde plasma και γράψτε μέσα τον παρακάτω κώδικα (βασικά κάντε αντιγραφή και επικολλήστε τον)

Κώδικας: Επιλογή όλων
import sys
import os
import json
import sounddevice
import speech_recognition as sr
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QTextEdit, QPushButton, QListWidget, QListWidgetItem
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtGui import QIcon, QPixmap, QKeyEvent, QMovie, QPainter, QFont, QColor


class VasikoWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowFlag(Qt.FramelessWindowHint)
        self.setGeometry(580, 316, 410, 340)
        self.setFixedSize(410, 340)
        self.setWindowFlag(Qt.WindowStaysOnTopHint)
        self.setStyleSheet("background-color: #040102;")
        self.recognizer = sr.Recognizer()

        vbox = QVBoxLayout(self)
        vbox.setContentsMargins(0, 0, 0, 0)

        self.label_animation = QLabel(self)
        self.label_animation.setGeometry(0, 0, 410, 160)
        self.movie = QMovie("gifs/planet.gif")
        self.label_animation.setMovie(self.movie)
        self.movie.start()

        self.text_input = QTextEdit(self)
        self.text_input.setStyleSheet("border: 3px solid #FFDF5A; background-color: transparent; color: white; font-weight: bold;  font-size: 15pt;")
        self.text_input.setGeometry(10, 180, 410, 160)
        self.text_input.setFixedHeight(160)
        self.text_input.setAlignment(Qt.AlignTop | Qt.AlignLeft)
        vbox.addWidget(self.text_input)
        self.contacts_list = QListWidget(self)
        self.contacts_list.setStyleSheet('''
            QListWidget {
                color: #030203;
                background-color: #FCAF3E;
                font-weight: bold;
                font-size: 14pt;
            }
            QListWidget::item:hover {
                color: #FF0000;
                background-color: #FCAF3E;
                font-weight: bold;
                font-size: 18pt;
            }
        ''')

        self.contacts_list.setGeometry(10, 0, 150, 240)
        vbox.addWidget(self.contacts_list)

        self.send_button = QPushButton('Αποστολή', self)
        self.send_button.setStyleSheet('''
            QPushButton {
                background-color: #d4d6c1;
                color: black;
                font-weight: bold;
                font-size: 13pt;
            }
            QPushButton:hover {
                background-color: #40413b;
                color: #FFFF00;
                font-weight: bold;
                font-size: 17pt;
            }
            QPushButton:pressed {
                background-color: #550000;
                color: #ffFFFF;
                font-weight: bold;
                font-size: 22pt;
            }
        ''')
        vbox.addWidget(self.send_button)

        self.timer = QTimer(self)
        self.timer.timeout.connect(self.update_animation)
        self.timer.start(50)

        self.start_recognition_button = QPushButton(self)
        pixmap = QPixmap("png/mic4.png")
        icon = QIcon(pixmap)
        self.start_recognition_button.setIcon(icon)
        self.start_recognition_button.setIconSize(pixmap.rect().size())
        self.start_recognition_button.setMaximumSize(40, 40)
        self.start_recognition_button.clicked.connect(self.start_recognition)

        self.history_file = "history-special.json"
        self.load_history()

        self.start_recognition_button.move(360, 120)

        self.setup_ui()

    def update_animation(self):
        if not self.movie.currentPixmap().isNull():
            self.repaint()

    def start_recognition(self):
        with sr.Microphone() as source:
            audio = self.recognizer.listen(source, 7, 5)
        try:
            text = self.recognizer.recognize_google(audio, language="el-GR")
            self.text_input.setPlainText(text)
            print(text)
            self.add_to_history(text)
        except sr.UnknownValueError:
            print("H φωνητική αναγνώριση google δεν μπόρεσε να καταλάβει τον ή")
        except sr.RequestError as e:
            print(f"Δεν ήταν δυνατό να ζητηθούν αποτελέσματα από την υπηρεσία Google Speech Recognition; {e}")

    def load_history(self):
        try:
            with open(self.history_file, "r") as file:
                self.history = json.load(file)
        except FileNotFoundError:
            self.history = []
        self.history_index = len(self.history)

    def save_history(self):
        with open(self.history_file, "w") as json_file:
            json.dump(self.history, json_file)

        with open("history-special.txt", "w") as txt_file:
            for item in self.history:
                txt_file.write("%s\n" % item)

    def add_to_history(self, text):
        self.history.append(text)
        self.save_history()

    def retrieve_from_history(self, forward=True):
        if forward:
            if self.history_index < len(self.history) - 1:
                self.history_index += 1
        else:
            if self.history_index > 0:
                self.history_index -= 1

        if 0 <= self.history_index < len(self.history):
            self.text_input.setPlainText(self.history[self.history_index])

    def eventFilter(self, obj, event):
        if obj is self.text_input and event.type() == event.KeyPress:
            if event.key() == Qt.Key_Up:
                self.retrieve_from_history(forward=False)
                return False
            elif event.key() == Qt.Key_Down:
                self.retrieve_from_history(forward=True)
                return False
        return super().eventFilter(obj, event)

    def send_sms(self):
        contact_item = self.contacts_list.currentItem()
        if contact_item:
            number = contact_item.data(Qt.UserRole)
            message = self.text_input.toPlainText()
            command = f"kdeconnect-cli -n 'Redmi Note 8 Pro' --send-sms '{message}' --destination '{number}'"
            os.system("Tο μήνυμα εστάλη με επιτυχώς!'")
            print("Tο μήνυμα εστάλη με επιτυχώς.")

    def setup_ui(self):
        self.contacts_list.itemClicked.connect(self.select_contact)
        self.load_contacts()

        self.send_button.clicked.connect(self.send_sms)
        self.send_button.move(250, 100)

    def load_contacts(self):
        try:
            with open("contacts.txt", "r") as contacts_file:
                contacts = contacts_file.readlines()
                for contact in contacts:
                    name, number = contact.strip().split()
                    item = QListWidgetItem(name)
                    item.setData(Qt.UserRole, number)
                    self.contacts_list.addItem(item)
        except FileNotFoundError:
            os.system("notify-send 'Σφάλμα' 'Το αρχείο επαφών δεν βρέθηκε.'")
            print("Το αρχείο επαφών δεν βρέθηκε.")

    def select_contact(self, item):
        number = item.data(Qt.UserRole)
        self.text_input.setText(f"{item.text()}, {number}")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = VasikoWindow()
    window.show()
    sys.exit(app.exec_())


Η γραμμή 160
command = f"kdeconnect-cli -n 'Redmi Note 8 Pro' --send-sms '{message}' --destination '{number}'"
είναι αυτή που στέλνει το sms. Δηλαδή αν απλά δώσετε στο τερματικό μόνο αυτή τη γραμμή και πατήσετε enter θα φύγει το sms.
Φυσικά θα πρέπει να αντικατασταθεί:
1. Η συσκευή που βλέπετε τώρα γραμμένη με τη δική σας συσκευή. Για να την βρείτε, πως λέγεται δώστε στο τερματικό την εντολή
Κώδικας: Επιλογή όλων
kdeconnect-cli -l
και το όνομα που θα σας επιστρέψει είναι αυτό που τοποθετήσετε μέσα στα εισαγωγικά μετά από το kdeconnect-cli -n.

2. To {message} είναι το μύνμημά σας. Θα το βάλετε μέσα στα μονά εισαγωγικά ' ' , όχι όμως στις αγκύλες όπως το βλέπετε εδώ.

3.
Το {number} είναι ο αριθμός τηλεφώνου που θα στείλετε το μύνημα.
Δηλαδή ένα παράδειγμα για το πως μπορείτε να στείλετε sms από το τερματικό, είναι αυτή η εντολή
Κώδικας: Επιλογή όλων
kdeconnect-cli -n 'Redmi Note 8 Pro' --send-sms 'Καλημέρα. Κερνάς καφέ;' --destination '6852121211'"


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

Τώρα καθώς είστε μέσα στο φάκελο /home/user/sms φτιάξτε ακόμα έναν. (Εγώ έφτιαξα δύο. Τον έναν τον ονόμασα png και τον άλλον gifs. Στον έναν έχω εικονίδια με διάφορα σχέδια μικροφώνων σε png. Στον άλλον έχω κατεβάσει διάφορα gif animations και τα έχω κάνει σε μέγεθος τέτοιο ώστε να ανταποκρίνεται στο widget μου.
Αυτά που είπα τα βλέπουμε στις γραμμές
Κώδικας: Επιλογή όλων
       
self.movie = QMovie("gifs/planet.gif")

και

pixmap = QPixmap("png/mic4.png")


Αν θέλετε κατεβάστε τα επί τόπου από δω και αποθηκεύστε τα στυους αντίστοιχους φακέλους
(ή φτιάξτε έναν μόνο φάκελο πχ images, αλλά θα πρέπει να το γ´ραψετε αντίστοιχα στον κώδικα

Κώδικας: Επιλογή όλων
       
self.movie = QMovie("images/planet.gif")

και

pixmap = QPixmap("images/mic4.png")


Εικόνα


Εικόνα
Επεξεργαστής: AMD Ryzen 9 5900x
Μνήμη Gskill 16gb (2X8gb), 3200 mh, CL 14
Μητρική: Asrock X570 phantom gaming X
Τροφοδοτικό: Corsair 850 platinum
Δίσκος: SSD Corsair MP600 (1 TB)
Άβαταρ μέλους
malos
saintTUX
saintTUX
 
Δημοσιεύσεις: 1239
Εγγραφή: 02 Νοέμ 2008, 12:00
Εκτύπωση

Re: Αποστολή sms με φωνητική εντολή

Δημοσίευσηαπό Th P » 30 Μαρ 2024, 16:54

Ωραίος!
Μία ένσταση μόνο (ως οφθαλμίατρος :) )
malos έγραψε:Αν δεν βλέπετε καλά, αν ζορίζεστε με τα δάχτυλά σας να πληκτρολογείτε στο κινητό (εγώ πολύ)
κι αν κάθεστε μπροστά στο PC σας, μπορείτε γρήγορα και πολύ πιο εύκολα να στείλετε sms μέσω του γνωστού kdeconnect.

Στην χρονική σειρά της πιο πάνω πρότασης προηγείται η επίσκεψη τον γιατρό :)
Σταθερή είναι η διανομή που προσπαθείς ανεπιτυχώς να κρασσάρεις
Linux: Low┃Προγραμματισμός: No┃Αγγλικά: Good
Είμαι αναλφάβητος, ανιστόρητος και άξιος της μοίρας μου
Άβαταρ μέλους
Th P
powerTUX
powerTUX
 
Δημοσιεύσεις: 1986
Εγγραφή: 02 Μάιος 2009, 10:46
Τοποθεσία: Θεσσαλονίκη
IRC: ThP1
Εκτύπωση

Re: Αποστολή sms με φωνητική εντολή

Δημοσίευσηαπό malos » 30 Μαρ 2024, 17:47

Th P έγραψε:Ωραίος!
Μία ένσταση μόνο (ως οφθαλμίατρος :) )
malos έγραψε:Αν δεν βλέπετε καλά, αν ζορίζεστε με τα δάχτυλά σας να πληκτρολογείτε στο κινητό (εγώ πολύ)
κι αν κάθεστε μπροστά στο PC σας, μπορείτε γρήγορα και πολύ πιο εύκολα να στείλετε sms μέσω του γνωστού kdeconnect.

Στην χρονική σειρά της πιο πάνω πρότασης προηγείται η επίσκεψη τον γιατρό :)


Για τους κανονικους ανθρώπους. Όχι για σούργελα σαν κι εμένα :shifty:

(με βλέπω να σου έρχομαι :thumbup: )
Επεξεργαστής: AMD Ryzen 9 5900x
Μνήμη Gskill 16gb (2X8gb), 3200 mh, CL 14
Μητρική: Asrock X570 phantom gaming X
Τροφοδοτικό: Corsair 850 platinum
Δίσκος: SSD Corsair MP600 (1 TB)
Άβαταρ μέλους
malos
saintTUX
saintTUX
 
Δημοσιεύσεις: 1239
Εγγραφή: 02 Νοέμ 2008, 12:00
Εκτύπωση

Re: Αποστολή sms με φωνητική εντολή

Δημοσίευσηαπό Th P » 30 Μαρ 2024, 18:12

malos έγραψε:(με βλέπω να σου έρχομαι :thumbup: )

Για τους συμφορουμίτες (όπως και για όλους - γιατρός ΕΣΥ)
η πόρτα του ιατρείου είναι πάντα ανοιχτή!
(αν σε βγάλει ο δρόμος Βόρεια Ελλάδα θα περάσεις και τον κώδικα για φωνητικές εντολές στον υπολογιστή του ιατρείου μετά την εξέταση :) )
Σταθερή είναι η διανομή που προσπαθείς ανεπιτυχώς να κρασσάρεις
Linux: Low┃Προγραμματισμός: No┃Αγγλικά: Good
Είμαι αναλφάβητος, ανιστόρητος και άξιος της μοίρας μου
Άβαταρ μέλους
Th P
powerTUX
powerTUX
 
Δημοσιεύσεις: 1986
Εγγραφή: 02 Μάιος 2009, 10:46
Τοποθεσία: Θεσσαλονίκη
IRC: ThP1
Εκτύπωση


  • ΣΧΕΤΙΚΑ ΘΕΜΑΤΑ
    ΑΠΑΝΤΗΣΕΙΣ
    ΠΡΟΒΟΛΕΣ
    ΣΥΓΓΡΑΦΕΑΣ

Επιστροφή στο Gadgets με Λογισμικό Ανοιχτού Κώδικα