[英]How to change string in setTitle for a generated text from outside class
When I try updating a string variable in self.graphWidget.setTitle(phrase, ...)
the variable doesn't update.当我尝试更新
self.graphWidget.setTitle(phrase, ...)
中的字符串变量时,该变量不会更新。 I'm plotting a real time waveform graph while recording from mic using pyaudio and PyQT , what I want to do is instead of printing in terminal I want the speech to text phrase to be shown in MainWindow after recognition is done我正在使用pyaudio和PyQT从麦克风录制时绘制实时波形图,我想要做的不是在终端中打印,而是希望语音到文本短语在识别完成后显示在 MainWindow 中
'''GUI'''
import struct
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication
import sys
'''Graph'''
import pyqtgraph as pg
from PyQt5 import QtCore
import numpy as np
'''Audio Processing'''
import pyaudio
import wave
import speech_recognition as sr
import multiprocessing as mlti
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
CHUNK = 1024 * 2
p = pyaudio.PyAudio()
stream = p.open(
format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
output=True,
frames_per_buffer=CHUNK,
)
frames = []
seconds = 6
phrase = "..."
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
pg.setConfigOptions(antialias=True)
self.traces = dict()
'''Display'''
self.graphWidget = pg.PlotWidget()
self.setCentralWidget(self.graphWidget)
self.setWindowTitle("Waveform")
self.setGeometry(55, 115, 970, 449)
'''Data'''
self.x = np.arange(0, 2 * CHUNK, 2)
self.f = np.linspace(0, RATE // 2, CHUNK // 2)
'''Animate'''
self.timer = QtCore.QTimer()
self.timer.setInterval(50)
self.timer.timeout.connect(self.update)
self.timer.start()
def set_plotdata(self, name, data_x, data_y):
if name in self.traces:
self.traces[name].setData(data_x, data_y)
else:
if name == 'waveform':
self.traces[name] = self.graphWidget.plot(pen='c', width=3)
self.graphWidget.setYRange(0, 255, padding=0)
self.graphWidget.setXRange(0, 2 * CHUNK, padding=0.005)
def update(self):
self.wf_data = stream.read(CHUNK)
self.wf_data = struct.unpack(str(2 * CHUNK) + 'B', self.wf_data)
self.wf_data = np.array(self.wf_data, dtype='b')[::2] + 128
self.set_plotdata(name='waveform', data_x=self.x, data_y=self.wf_data)
self.graphWidget.setTitle(phrase, color="w", size="30pt") #### Change it
def main():
app = QtWidgets.QApplication(sys.argv)
win = MainWindow()
win.show()
sys.exit(app.exec_())
def Record():
for i in range(0, int(RATE/CHUNK*seconds)):
data = stream.read(CHUNK)
frames.append(data)
print(i)
def Refine_Stream():
stream.stop_stream()
stream.close()
p.terminate()
obj = wave.open("output.wav", "wb")
obj.setnchannels(CHANNELS)
obj.setsampwidth(p.get_sample_size(FORMAT))
obj.setframerate(RATE)
obj.writeframes(b"".join(frames))
obj.close()
def Speech_Recog():
print("Function Started")
r = sr.Recognizer()
#usando o microfone
with sr.AudioFile("output.wav") as source:
r.adjust_for_ambient_noise(source, duration=1)
#Armazena o que foi dito numa variavel
audio = r.listen(source)
phrase = ""
try:
#Into recog
phrase = r.recognize_google(audio,language='pt-BR') #### To it
print(phrase)
#Couldn't make it
except sr.UnknownValueError:
phrase = "Not understood"
print(phrase)
if __name__ == '__main__':
p1 = mlti.Process(target=main)
p1.start()
Record()
Refine_Stream()
Speech_Recog()
Hope it was clean code enough希望它是足够干净的代码
I studied quite a lot and I figured out how to do exactly what I wanted我学习了很多,我想出了如何做我想做的事
I'm using a signal and slot system as my_signal = QtCore.pyqtSignal(str)
to send my string-variable as a signal to setTitle
that is activated using QTimer
after some time我正在使用信号和插槽系统作为
my_signal = QtCore.pyqtSignal(str)
将我的字符串变量作为信号发送到setTitle
一段时间后使用QTimer
激活
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
'''Display'''
self.graphWidget = pg.PlotWidget()
self.setCentralWidget(self.graphWidget)
self.setWindowTitle("Waveform")
self.setGeometry(55, 115, 970, 449)
self.graphWidget.setTitle(phrase, color="w", size="30pt")
'''Animate Title'''
self.picktimer = QTimer()
self.picktimer.setInterval(7000) ###seconds needs to be more than seconds recording
self.picktimer.timeout.connect(self.Transitioning)
self.picktimer.start()
def Transitioning(self):
self.example_class = Speech_Recognition(self)
self.example_class.my_signal.connect(self.Update_Title)
self.example_class.Speech_Recog() ###init SpeechRecog
def Update_Title(self, my_title_phrase):
self.graphWidget.setTitle(my_title_phrase, color="w", size="30pt")
QtWidgets.qApp.processEvents()
def main():
app = QtWidgets.QApplication(sys.argv)
win = MainWindow()
win.show()
sys.exit(app.exec_())
def Record():
for i in range(0, int(RATE/CHUNK*seconds)):
data = stream.read(CHUNK)
frames.append(data)
print(i)
def Refine_Stream():
stream.stop_stream()
stream.close()
p.terminate()
obj = wave.open("output.wav", "wb")
obj.setnchannels(CHANNELS)
obj.setsampwidth(p.get_sample_size(FORMAT))
obj.setframerate(RATE)
obj.writeframes(b"".join(frames))
obj.close()
class Speech_Recognition(QtWidgets.QWidget):
my_signal = QtCore.pyqtSignal(str)
def Speech_Recog(self):
r = sr.Recognizer()
recorded_phrase = ""
#usando o microfone
with sr.AudioFile("output.wav") as source:
r.adjust_for_ambient_noise(source, duration=1)
#Armazena o que foi dito numa variavel
audio = r.listen(source)
try:
recorded_phrase = r.recognize_google(audio,language='pt-BR')
except sr.UnknownValueError:
recorded_phrase = "Not understood"
self.my_signal.emit(recorded_phrase)
if __name__ == '__main__':
p2 = mlti.Process(target=main)
p2.start()
Record()
Refine_Stream()
Still needs to be clean code though仍然需要干净的代码
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.