κι αν κάθεστε μπροστά στο 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
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")