- Κώδικας: Επιλογή όλων
#!/usr/bin/env python3
import sys
import speech_recognition as sr
import pyttsx3
import sounddevice
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QLineEdit, QTextEdit
from PyQt5.QtCore import Qt
from google.cloud import translate_v2 as translate
from google.oauth2 import service_account
from google.cloud import speech_v1p1beta1 as speech
from PyQt5.QtGui import QIcon, QPixmap
class TranslucentTranslationWindow(QWidget):
def __init__(self):
super().__init__()
self.setWindowFlag(Qt.FramelessWindowHint)
self.setGeometry(1220, 460, 450, 310)
self.setFixedSize(450, 310)
self.setWindowFlag(Qt.WindowStaysOnBottomHint)
self.setAcceptDrops(True)
self.setStyleSheet("background-color: #ffdad3;")
credentials = service_account.Credentials.from_service_account_file('/home/left/scripts/translate/token.json', scopes=['https://www.googleapis.com/auth/cloud-translation'])
self.translator = translate.Client(credentials=credentials)
vbox = QVBoxLayout(self)
vbox.setContentsMargins(0, 0, 0, 0) # Ορίζει το περιθώριο για το vbox
self.text_input = QLineEdit(self)
self.text_input.setPlaceholderText("Γράψε εδώ το κείμενο να μεταφράσω")
self.text_input.setStyleSheet("border: 1px dashed #00FF00; background-color: #d0aa7c;")
self.text_input.setFixedHeight(40) # Ορίζει το ύψος του πεδίου εισαγωγής σε 40 pixels
self.text_output = QTextEdit(self)
self.text_output.setStyleSheet("color: white; background-color: rgba(0, 0, 0, 255); font-weight: bold;")
vbox.addWidget(self.text_input, stretch=5)
vbox.addWidget(self.text_output, stretch=5) # Αλλαγή εδώ σε stretch=5
vbox_input = QVBoxLayout()
vbox_input.setContentsMargins(0, 0, 0, 2)
self.translate_button = QPushButton("Μετάφραση", self)
self.translate_button.setStyleSheet("background-color: #aed08b;") # Κίτρινο
self.translate_button.clicked.connect(self.translate_text)
self.start_recognition_button = QPushButton(self)
pixmap = QPixmap("microphone.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) # Ορίζει το μέγιστο πλάτος και ύψος
vbox_input.addWidget(self.translate_button)
vbox_input.addWidget(self.start_recognition_button, alignment=Qt.AlignRight | Qt.AlignBottom)
# Ορίζει το περιθώριο για την περιοχή του vbox_input
vbox_input.setContentsMargins(0, 0, 0, 0)
self.start_recognition_button.clicked.connect(self.start_recognition)
vbox.addLayout(vbox_input)
self.text_input.returnPressed.connect(self.translate_text)
self.text_input.installEventFilter(self)
# Όνομα αρχείου ιστορικού
self.history_file = "history.txt"
# Αρχικοποίηση ιστορικού
self.load_history()
def translate_text(self):
text = self.text_input.text()
translation = self.translator.translate(text, target_language='en' if self.is_greek(text) else 'el')
self.text_output.setPlainText(translation['translatedText'])
self.text_input.clear()
self.text_input.setSelection(0, len(translation['translatedText']))
# Προσθήκη στο ιστορικό
self.add_to_history(text)
def is_greek(self, text):
for char in text:
if 'α' <= char <= 'ω' or 'Α' <= char <= 'Ω':
return True
return False
def dragEnterEvent(self, event):
if event.mimeData().hasUrls():
event.accept()
else:
event.ignore()
def dropEvent(self, event):
if event.mimeData().hasUrls():
url = event.mimeData().urls()[0]
with open(url.toLocalFile(), "r") as f:
self.text_input.setText(f.read())
event.accept()
else:
event.ignore()
def add_to_history(self, text):
# Προσθήκη κειμένου στο τέλος του ιστορικού
self.history_list.append(text)
# Ενημέρωση του αρχείου ιστορικού
with open(self.history_file, "a") as file:
file.write(text + "\n")
def load_history(self):
# Φόρτωση ιστορικού από το αρχείο
try:
with open(self.history_file, "r") as file:
self.history_list = file.read().splitlines()
self.history_index = len(self.history_list)
except FileNotFoundError:
# Το αρχείο δεν υπάρχει ακόμα
self.history_list = []
self.history_index = 0
def retrieve_from_history(self, forward=True):
# Ανάκτηση κειμένου από το ιστορικό
if forward:
# Προς τα εμπρός
if self.history_index < len(self.history_list) - 1:
self.history_index += 1
else:
# Προς τα πίσω
if self.history_index > 0:
self.history_index -= 1
if 0 <= self.history_index < len(self.history_list):
self.text_input.setText(self.history_list[self.history_index])
else:
self.text_input.clear()
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 # Επιστροφή False για την αποφυγή περαιτέρω επεξεργασίας του event
elif event.key() == Qt.Key_Down:
self.retrieve_from_history(forward=True)
return False # Επιστροφή False για την αποφυγή περαιτέρω επεξεργασίας του event
return super().eventFilter(obj, event)
# Προσθήκη συνάρτησης για έναρξη φωνητικής αναγνώρισης
def start_recognition(self):
#r = sr.Recognizer()
recognizer = sr.Recognizer()
# ΑΦΗΝΟΥΜΕ ΑΥΤΕΣ ΤΙΣ ΓΡΑΜΜΕΣ ΤΙΜΗΤΙΚΑ ΓΙΑ ΤΟΝ ΗΜΙΘΕΟ Maras
#with sr.Microphone() as source2:
#r.adjust_for_ambient_noise(source2, duration = 0.2)
#audio2 = r.listen(source2, 5, 3)
#MyText = r.recognize_google(audio2)
#MyText = MyText.lower()
#print("Did you say " + MyText)
with sr.Microphone() as source:
recognizer.adjust_for_ambient_noise(source, duration = 0.2)
audio = recognizer.listen(source, 10, 9)
try:
text = recognizer.recognize_google(audio, language="el-GR")
self.text_input.setText(text)
self.text_input.repaint() # Ανανέωση του πεδίου εισόδου
print(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}")
if __name__ == '__main__':
app = QApplication(sys.argv)
window = TranslucentTranslationWindow()
window.show()
sys.exit(app.exec_())