Φωνητική πληκλτρολόγηση

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

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

Φωνητική πληκλτρολόγηση

Δημοσίευσηαπό malos » 22 Μαρ 2024, 15:36

Με βολεύει πολύ η φωνητική πληκτρολόγηση. Πρώτον γιατί είμαι ψιλογκαβάδι. Δεύτερον γιατί μου σπάει τα νεύρα που με τα δάχτυλα πατιούνται 5-6 άλλα γράμματα.
Τρίτον γιατί απλά γουστάρω ρε παιδί μου! :wtf:
Ήμουν σε windows και έγραφα κάτι στο office τους και είδα ότι είχε μικρόφωνο. Το χρησιμοποίησα κι έκανα την εργασία μου μια χαρά. Ακόμη και τώρα που γράφω αυτό το post χρησιμοποιώ κάποιο μικρόφωνο


Εικόνα


Επεξεργάζομαι μόνο το πρώτο γράμμα που βγαίνει πάντα μικρό.

Ζήλεψα που λέτε που έχει το android τέτοια φάση και το office. Πήγα να ξαναγράψω μια εργασία κι μπήκα σε windows γι αυτό το λόγο. Έλα όμως που δεν έβρισκα το μικρόφωνο. Μετά άρχισα να αναρωτιέμαι αν ήταν το πρόγραμμα office τότε που είχα δει το μικρόφωνο ή αν ήταν κάποιοο ιντερνετικό εργαλείο στο site της MS,
Τέλος πάντων δεν το έβρισκα. Έτσι είσαι ρε; (λέω) τώρα θα δεις. Και από τότε κατα 80% περνάω πλέον το κείμενό μου φωνητικά.

Ο κώδικας

Κώδικας: Επιλογή όλων
#!/usr/bin/env python3
import sys
import os
import json
import sounddevice
import speech_recognition as sr
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QTextEdit, QPushButton, QGraphicsOpacityEffect
from PyQt5.QtCore import Qt, QTimer, QEvent
from PyQt5.QtGui import QIcon, QPixmap, QKeyEvent, QMovie, QPainter, QFont

class VasikoWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowFlag(Qt.FramelessWindowHint)
        self.setGeometry(1493, 816, 410, 170)
        self.setFixedSize(410, 170)
        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, 170)
        self.movie = QMovie("gifs/planet.gif")               #μου αρέσει
        self.label_animation.setMovie(self.movie)        #να έχει
        self.movie.start()                                            #για background gif animation.
        self.text_input = QTextEdit(self)
        #font = QFont("GFS Solomos", 16, QFont.Bold) #έβαλα εδώ μία γραμματοσειρά για ομορφιά. δεν χρειάζεται να βάλεις αυτή τη γραμμή άστο έτσι.
        self.text_input.setFont(font)
        self.text_input.setStyleSheet("border: 3px double #000000; background-color: #040102; color: white; font-weight: bold;")
        self.text_input.setFixedHeight(200)
        self.text_input.setAlignment(Qt.AlignTop | Qt.AlignLeft)
        vbox.addWidget(self.text_input, stretch=5)
        self.start_recognition_button = QPushButton(self)
        pixmap = QPixmap("png/mic4.png")                       #στον φάκελο που έχω τον κώδικα έχω τον υποφάκελο gif. Εκεί έχω ένα εικονίδιο 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.move(self.start_recognition_button.x() - 5, self.start_recognition_button.y() - 5)
        self.start_recognition_button.clicked.connect(self.start_recognition)

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

        self.timer = QTimer(self)
        self.timer.timeout.connect(self.update_animation)
        self.timer.start(50)
        self.start_recognition_button.move(360, 130)
        self.opacity_effect = QGraphicsOpacityEffect(self.text_input)
        self.text_input.setGraphicsEffect(self.opacity_effect)
        self.opacity_effect.setOpacity(0.7)
        # Προσθήκη σελίδας στο σύστημα για να ελέγχει τα πλήκτρα που πατούνται
        self.text_input.installEventFilter(self)

    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("Google Speech Recognition could not understand audio")
        except sr.RequestError as e:
            print(f"Could not request results from Google Speech Recognition service; {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)

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




Για να μην ανοίγω τερματικό και πληκτρολογώ
Κώδικας: Επιλογή όλων
python3 /το_αρχείο_μου.py

Έκανα και ένα αρχειάκι toggle για άνοιγμα και κλείσιμο της εφαρμογής κι έτσι απλά πατάω ένα εικονιδιάκι στην κάτω μπάρα του desktop.
(κάνε κλικ στο gif που είναι από κάτω για να το δεις)


Εικόνα

Το αρχείο αυτό είναι κώδικας bash. Δημιουργεί ένα αρχείο pid που περιέχει το id της διεργασίας. Το δημιουργεί αν δεν υπάρχει. κι αν υπάρχει το διαγράδει. Με αυτόν τον τρόπο ανοίγει ή κλείνει το προγραμματάκι.


Κώδικας: Επιλογή όλων
#!/bin/bash
# Το όνομα του αρχείου pid (αλλάξτε το ανάλογα)
pid_file="/home/left/scripts/speech-type/speech2.pid"
if [ -e "$pid_file" ]; then
    # Υπάρχει ήδη αρχείο pid, να κλείσουμε τη διεργασία
    pid=$(cat "$pid_file")
    kill "$pid"
    rm "$pid_file"
else
    # Δεν υπάρχει αρχείο pid, να ξεκινήσουμε τη διεργασία
    cd /home/left/scripts/speech-type/
    source speaktype-venv/bin/activate
    python3 speak2.py &
    echo "$!" > "$pid_file"
fi



Αυτά :oops:
Επεξεργαστής: 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
 
Δημοσιεύσεις: 1234
Εγγραφή: 02 Νοέμ 2008, 12:00
Εκτύπωση

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

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