I am trying to build an AI voice recognition app with a GUI to show the speech recognition text as well as my pre-determined outcomes as a text inside different labels in pyqt6 program. the problem is how do I set the label's text to change dynamically based on the the recognized speech (output as text) and next step of the AI's predetermined outcome(also output as text) on the pyqt app labels.
A normal import of the AI.py file into the QT6.py file doesn't dynamically change the text.
Combining both into the same file runs either the program (which has nested loops to carry outcomes based on user's speech query) or the pyqt window whichever is run earlier. the combined file doesn't run one after the other.
What I am looking to acheive: labels inside pyqt app window to change and show text dynamically based on how the text output changes in the AI app.
Here is my qt6.py child file:
from main_ui import UI_Extension
from PyQt6 import QtWidgets
import sys
class U_interface(UI_Extension):
def setupUi(self, Form):
super().setupUi(Form)
self.alerts.setText("Liability Warning")
self.alert_description.setText("Liability description")
self.ai_response.setText(Dynamic_text) # from AI.py file
self.mic_recording_state.setText("Listening...(test)")
self.speech_recognition.setText(Dynamic_speech_recognition_text) # from AI.py file
self.management_plan.setText("EKG scheduled for the 24th of November 2022")
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
ui = U_interface()
ui.setupUi(Form)
Form.show()
sys.exit(app.exec())
Here is my qt6.py parent file converted from qt_designer .ui file
from PyQt6 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(1280, 800)
Form.setAutoFillBackground(False)
Form.setStyleSheet("")
self.combined_layout = QtWidgets.QWidget(Form)
self.combined_layout.setGeometry(QtCore.QRect(0, 0, 1280, 800))
self.combined_layout.setStyleSheet("QPushButton#ReviewCase{\n"
" background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:1, stop:0 rgba(33, 124, 173, 255), stop:1 rgba(31, 118, 165, 142));\n"
" color:rgba(255,255,255,210);\n"
" border-radius: 5px;\n"
"}\n"
"\n"
"QPushButton#ReviewCase:hover{\n"
" background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:1, stop:0 rgba(14, 208, 75, 255), stop:1 rgba(26, 255, 0, 213));\n"
" color:rgba(255,255,255,210);\n"
" color:rgba(0,0,0,210);\n"
"}\n"
"\n"
"QPushButton#ReviewCase:pressed{\n"
" padding-left:5px;\n"
" padding-right:5px;\n"
" color:rgba(255,255,255,210);\n"
" background-color: rgba(105,118,132,200);\n"
"}\n"
"\n"
"QPushButton#ExitProgram{\n"
" background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:1, stop:0 rgba(33, 124, 173, 255), stop:1 rgba(31, 118, 165, 142));\n"
" color:rgba(255,255,255,210);\n"
" border-radius: 5px;\n"
"}\n"
"\n"
"QPushButton#ExitProgram:hover{\n"
" background-color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:1, stop:0 rgba(255, 0, 4, 255), stop:1 rgba(255, 0, 0, 111));\n"
" color:rgba(255,255,255,210);\n"
"}\n"
"\n"
"QPushButton#ExitProgram:pressed{\n"
" padding-left:5px;\n"
" padding-right:5px;\n"
" background-color: rgba(105,118,132,200);\n"
"}\n"
"")
self.combined_layout.setObjectName("combined_layout")
self.background_image = QtWidgets.QLabel(self.combined_layout)
self.background_image.setGeometry(QtCore.QRect(0, 0, 1280, 800))
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Ignored, QtWidgets.QSizePolicy.Policy.Ignored)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.background_image.sizePolicy().hasHeightForWidth())
self.background_image.setSizePolicy(sizePolicy)
font = QtGui.QFont()
font.setPointSize(10)
self.background_image.setFont(font)
self.background_image.setContextMenuPolicy(QtCore.Qt.ContextMenuPolicy.DefaultContextMenu)
self.background_image.setStyleSheet("border-image: url(:/images/background);")
self.background_image.setText("")
self.background_image.setScaledContents(True)
self.background_image.setObjectName("background_image")
self.doc_logo = QtWidgets.QLabel(self.combined_layout)
self.doc_logo.setGeometry(QtCore.QRect(15, 16, 41, 41))
self.doc_logo.setStyleSheet("border-image: url(:/images/doctor);")
self.doc_logo.setText("")
self.doc_logo.setObjectName("doc_logo")
self.horizontalLayoutWidget = QtWidgets.QWidget(self.combined_layout)
self.horizontalLayoutWidget.setGeometry(QtCore.QRect(10, 743, 1261, 51))
self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
self.horizontalLayout.setSizeConstraint(QtWidgets.QLayout.SizeConstraint.SetDefaultConstraint)
self.horizontalLayout.setContentsMargins(5, 0, 5, 0)
self.horizontalLayout.setSpacing(10)
self.horizontalLayout.setObjectName("horizontalLayout")
self.ExitProgram = QtWidgets.QPushButton(self.horizontalLayoutWidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Maximum, QtWidgets.QSizePolicy.Policy.Maximum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.ExitProgram.sizePolicy().hasHeightForWidth())
self.ExitProgram.setSizePolicy(sizePolicy)
self.ExitProgram.setMinimumSize(QtCore.QSize(200, 35))
self.ExitProgram.setBaseSize(QtCore.QSize(0, 0))
font = QtGui.QFont()
font.setPointSize(13)
font.setBold(True)
font.setKerning(True)
self.ExitProgram.setFont(font)
self.ExitProgram.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.PointingHandCursor))
self.ExitProgram.setStyleSheet("")
self.ExitProgram.setObjectName("ExitProgram")
self.horizontalLayout.addWidget(self.ExitProgram)
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
self.horizontalLayout.addItem(spacerItem)
self.mic_recording_state = QtWidgets.QLabel(self.horizontalLayoutWidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.mic_recording_state.sizePolicy().hasHeightForWidth())
self.mic_recording_state.setSizePolicy(sizePolicy)
self.mic_recording_state.setMinimumSize(QtCore.QSize(770, 25))
font = QtGui.QFont()
font.setPointSize(20)
font.setBold(False)
self.mic_recording_state.setFont(font)
self.mic_recording_state.setStyleSheet("color: #c6d4e2;")
self.mic_recording_state.setText("")
self.mic_recording_state.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
self.mic_recording_state.setIndent(0)
self.mic_recording_state.setObjectName("mic_recording_state")
self.horizontalLayout.addWidget(self.mic_recording_state)
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
self.horizontalLayout.addItem(spacerItem1)
self.ReviewCase = QtWidgets.QPushButton(self.horizontalLayoutWidget)
self.ReviewCase.setEnabled(True)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Maximum, QtWidgets.QSizePolicy.Policy.Maximum)
sizePolicy.setHorizontalStretch(60)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.ReviewCase.sizePolicy().hasHeightForWidth())
self.ReviewCase.setSizePolicy(sizePolicy)
self.ReviewCase.setMinimumSize(QtCore.QSize(200, 35))
font = QtGui.QFont()
font.setPointSize(13)
font.setBold(True)
self.ReviewCase.setFont(font)
self.ReviewCase.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.PointingHandCursor))
self.ReviewCase.setAutoFillBackground(False)
self.ReviewCase.setStyleSheet("")
self.ReviewCase.setObjectName("ReviewCase")
self.horizontalLayout.addWidget(self.ReviewCase)
self.layoutWidget = QtWidgets.QWidget(self.combined_layout)
self.layoutWidget.setGeometry(QtCore.QRect(100, 40, 661, 681))
self.layoutWidget.setObjectName("layoutWidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.layoutWidget)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setSpacing(20)
self.verticalLayout.setObjectName("verticalLayout")
self.alerts = QtWidgets.QLabel(self.layoutWidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.alerts.sizePolicy().hasHeightForWidth())
self.alerts.setSizePolicy(sizePolicy)
self.alerts.setMinimumSize(QtCore.QSize(0, 50))
font = QtGui.QFont()
font.setFamily("Cambria")
font.setPointSize(22)
font.setBold(True)
self.alerts.setFont(font)
self.alerts.setToolTip("")
self.alerts.setStyleSheet("color: rgb(255, 116, 69);")
self.alerts.setText("")
self.alerts.setAlignment(QtCore.Qt.AlignmentFlag.AlignHCenter|QtCore.Qt.AlignmentFlag.AlignTop)
self.alerts.setIndent(0)
self.alerts.setObjectName("alerts")
self.verticalLayout.addWidget(self.alerts)
self.alert_description = QtWidgets.QLabel(self.layoutWidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.alert_description.sizePolicy().hasHeightForWidth())
self.alert_description.setSizePolicy(sizePolicy)
self.alert_description.setMinimumSize(QtCore.QSize(0, 50))
font = QtGui.QFont()
font.setPointSize(22)
font.setBold(True)
self.alert_description.setFont(font)
self.alert_description.setStyleSheet("color: rgb(43, 255, 121);")
self.alert_description.setText("")
self.alert_description.setAlignment(QtCore.Qt.AlignmentFlag.AlignHCenter|QtCore.Qt.AlignmentFlag.AlignTop)
self.alert_description.setIndent(0)
self.alert_description.setObjectName("alert_description")
self.verticalLayout.addWidget(self.alert_description)
self.ai_response = QtWidgets.QLabel(self.layoutWidget)
font = QtGui.QFont()
font.setFamily("Cambria")
font.setPointSize(22)
font.setBold(False)
self.ai_response.setFont(font)
self.ai_response.setStyleSheet("padding: 23 33 23;\n"
"color: #c6d4e2;\n"
"\n"
"")
self.ai_response.setFrameShape(QtWidgets.QFrame.Shape.NoFrame)
self.ai_response.setLineWidth(1)
self.ai_response.setText("")
self.ai_response.setScaledContents(False)
self.ai_response.setAlignment(QtCore.Qt.AlignmentFlag.AlignJustify|QtCore.Qt.AlignmentFlag.AlignVCenter)
self.ai_response.setWordWrap(True)
self.ai_response.setIndent(0)
self.ai_response.setObjectName("ai_response")
self.verticalLayout.addWidget(self.ai_response)
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setSpacing(0)
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.gif = QtWidgets.QLabel(self.layoutWidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Ignored, QtWidgets.QSizePolicy.Policy.Ignored)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.gif.sizePolicy().hasHeightForWidth())
self.gif.setSizePolicy(sizePolicy)
self.gif.setMinimumSize(QtCore.QSize(240, 180))
self.gif.setStyleSheet("")
self.gif.setText("")
self.gif.setScaledContents(True)
self.gif.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
self.gif.setIndent(0)
self.gif.setObjectName("gif")
self.horizontalLayout_2.addWidget(self.gif)
self.speech_recognition = QtWidgets.QLabel(self.layoutWidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(170)
sizePolicy.setHeightForWidth(self.speech_recognition.sizePolicy().hasHeightForWidth())
self.speech_recognition.setSizePolicy(sizePolicy)
self.speech_recognition.setMinimumSize(QtCore.QSize(0, 170))
font = QtGui.QFont()
font.setPointSize(16)
self.speech_recognition.setFont(font)
self.speech_recognition.setStyleSheet("padding: 29 33 29;\n"
"color: #c6d4e2;")
self.speech_recognition.setText("")
self.speech_recognition.setAlignment(QtCore.Qt.AlignmentFlag.AlignJustify|QtCore.Qt.AlignmentFlag.AlignVCenter)
self.speech_recognition.setWordWrap(True)
self.speech_recognition.setIndent(0)
self.speech_recognition.setTextInteractionFlags(QtCore.Qt.TextInteractionFlag.NoTextInteraction)
self.speech_recognition.setObjectName("speech_recognition")
self.horizontalLayout_2.addWidget(self.speech_recognition)
self.horizontalLayout_2.setStretch(0, 3)
self.horizontalLayout_2.setStretch(1, 6)
self.verticalLayout.addLayout(self.horizontalLayout_2)
self.verticalLayout.setStretch(0, 1)
self.verticalLayout.setStretch(2, 6)
self.verticalLayout.setStretch(3, 4)
self.layoutWidget1 = QtWidgets.QWidget(self.combined_layout)
self.layoutWidget1.setGeometry(QtCore.QRect(850, 40, 411, 681))
self.layoutWidget1.setObjectName("layoutWidget1")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.layoutWidget1)
self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_2.setSpacing(15)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.management = QtWidgets.QLabel(self.layoutWidget1)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Minimum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.management.sizePolicy().hasHeightForWidth())
self.management.setSizePolicy(sizePolicy)
self.management.setMinimumSize(QtCore.QSize(0, 50))
self.management.setStyleSheet("font: 700 22pt \"Segoe UI Variable Text\";\n"
"color: rgb(153, 255, 199);")
self.management.setAlignment(QtCore.Qt.AlignmentFlag.AlignHCenter|QtCore.Qt.AlignmentFlag.AlignTop)
self.management.setIndent(0)
self.management.setObjectName("management")
self.verticalLayout_2.addWidget(self.management)
self.management_plan = QtWidgets.QTextBrowser(self.layoutWidget1)
font = QtGui.QFont()
font.setPointSize(18)
font.setBold(True)
self.management_plan.setFont(font)
self.management_plan.viewport().setProperty("cursor", QtGui.QCursor(QtCore.Qt.CursorShape.ArrowCursor))
self.management_plan.setStyleSheet("background-color: rgb(7, 18, 40);\n"
"border-radius: 10px;\n"
"padding: 25 25 25 25;\n"
"color: #c6d4e2;")
self.management_plan.setInputMethodHints(QtCore.Qt.InputMethodHint.ImhMultiLine)
self.management_plan.setTextInteractionFlags(QtCore.Qt.TextInteractionFlag.LinksAccessibleByKeyboard|QtCore.Qt.TextInteractionFlag.LinksAccessibleByMouse|QtCore.Qt.TextInteractionFlag.TextBrowserInteraction|QtCore.Qt.TextInteractionFlag.TextSelectableByKeyboard|QtCore.Qt.TextInteractionFlag.TextSelectableByMouse)
self.management_plan.setOpenExternalLinks(True)
self.management_plan.setObjectName("management_plan")
self.verticalLayout_2.addWidget(self.management_plan)
self.verticalLayout_2.setStretch(0, 1)
self.verticalLayout_2.setStretch(1, 12)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.ExitProgram.setText(_translate("Form", "Exit Program"))
self.ReviewCase.setText(_translate("Form", "Review Case"))
self.management.setText(_translate("Form", "Management"))
self.management_plan.setHtml(_translate("Form", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><meta charset=\"utf-8\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"hr { height: 1px; border-width: 0; }\n"
"</style></head><body style=\" font-family:\'Segoe UI Variable Text\'; font-size:18pt; font-weight:700; font-style:normal;\">\n"
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:14pt;\"><br /></p></body></html>"))
Here is my AI.py file:
from playsound import playsound
import sounddevice as sd
from gtts import gTTS
import argparse
import random
import queue
import vosk
import json
import sys
import os
q = queue.Queue()
model = vosk.Model("c:......Model (EN-US)")
def greeting():
..........
def microphone():
..........
speech_recognition_text = "xyz........" # to be printed inside the label in qt6.py file
def recorded_audio():
............
def speak(transcription):
............
try:
............
stream = sd.RawInputStream(samplerate=args.samplerate, blocksize = 8000, device=args.device, dtype='int16', channels=1, callback=callback)
with stream:
greeting()
while True:
audio = recorded_audio()
if ('hello' in audio):
Dynamic_text = "abc...." # to be printed inside the label in qt6.py file
elif ('all right' in audio):
DynamicText = "def......" # to be printed inside the label in qt6.py file
except KeyboardInterrupt:
print('\nShutting Down')
parser.exit(0)
except Exception as e:
parser.exit(type(e).__name__ + ': ' + str(e))
I am under the impression that QThread is to be used somehow. Dont know how and where. Any help is greatly appreciated.