我正在使用PyQt5,我想使用Python,QT和PyAudio进行实时音频绘图
我在这篇文章中获得了代码:SWHRecorder
运行时,出现以下错误:AttributeError:'QMainWindow'对象没有属性'connect'
这是我的代码:
RealTimeAudio.py
import ui_plot
import sys
import numpy
import PyQt5.QtCore as QtCore
import PyQt5.QtGui as QtGui
from PyQt5.QtWidgets import *
import qwt as Qwt
from recorder import *
def plotSomething():
if SR.newAudio==False:
return
xs,ys=SR.fft()
c.setData(xs,ys)
uiplot.qwtPlot.replot()
SR.newAudio=False
if __name__ == "__main__":
app = QApplication(sys.argv)
win_plot = ui_plot.QMainWindow()
uiplot = ui_plot.Ui_win_plot()
uiplot.setupUi(win_plot)
uiplot.btnA.clicked.connect(plotSomething)
#uiplot.btnB.clicked.connect(lambda: uiplot.timer.setInterval(100.0))
#uiplot.btnC.clicked.connect(lambda: uiplot.timer.setInterval(10.0))
#uiplot.btnD.clicked.connect(lambda: uiplot.timer.setInterval(1.0))
c=Qwt.QwtPlotCurve()
c.attach(uiplot.qwtPlot)
uiplot.qwtPlot.setAxisScale(uiplot.qwtPlot.yLeft, 0, 1000)
uiplot.timer = QtCore.QTimer()
uiplot.timer.start(1.0)
win_plot.connect(uiplot.timer, QtCore.SIGNAL('timeout()'), plotSomething)
SR=SwhRecorder()
SR.setup()
SR.continuousStart()
### DISPLAY WINDOWS
win_plot.show()
code=app.exec_()
SR.close()
sys.exit(code)
Ui_plot.py
import PyQt5.QtCore as QtCore
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
_fromUtf8 = lambda s: s
class Ui_win_plot(object):
def setupUi(self, win_plot):
win_plot.setObjectName(_fromUtf8("win_plot"))
win_plot.resize(800, 600)
self.centralwidget = QWidget(win_plot)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.verticalLayout = QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
self.qwtPlot = Qwt5.QwtPlot(self.centralwidget)
self.qwtPlot.setObjectName(_fromUtf8("qwtPlot"))
self.verticalLayout.addWidget(self.qwtPlot)
self.horizontalLayout = QHBoxLayout()
self.horizontalLayout.setContentsMargins(6, 0, 6, 0)
self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
self.btnA = QPushButton(self.centralwidget)
self.btnA.setObjectName(_fromUtf8("btnA"))
self.horizontalLayout.addWidget(self.btnA)
self.btnB = QPushButton(self.centralwidget)
self.btnB.setObjectName(_fromUtf8("btnB"))
self.horizontalLayout.addWidget(self.btnB)
self.btnC = QPushButton(self.centralwidget)
self.btnC.setObjectName(_fromUtf8("btnC"))
self.horizontalLayout.addWidget(self.btnC)
self.btnD = QPushButton(self.centralwidget)
self.btnD.setObjectName(_fromUtf8("btnD"))
self.horizontalLayout.addWidget(self.btnD)
self.verticalLayout.addLayout(self.horizontalLayout)
win_plot.setCentralWidget(self.centralwidget)
self.retranslateUi(win_plot)
QtCore.QMetaObject.connectSlotsByName(win_plot)
def retranslateUi(self, win_plot):
win_plot.setWindowTitle(QApplication.translate("win_plot", "MainWindow", None))
self.btnA.setText(QApplication.translate("win_plot", "A", None))
self.btnB.setText(QApplication.translate("win_plot", "B", None))
self.btnC.setText(QApplication.translate("win_plot", "C", None))
self.btnD.setText(QApplication.translate("win_plot", "D", None))
import qwt as Qwt5
from PyQt5.QtWidgets import *
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
win_plot = QMainWindow()
ui = Ui_win_plot()
ui.setupUi(win_plot)
win_plot.show()
sys.exit(app.exec_())
Recorder.py
import matplotlib
matplotlib.use('TkAgg') # THIS MAKES IT FAST!
import numpy
import scipy
import struct
import pyaudio
import threading
import pylab
import struct
class SwhRecorder:
"""Simple, cross-platform class to record from the microphone."""
def __init__(self):
"""minimal garb is executed when class is loaded."""
self.RATE=48100
self.BUFFERSIZE=2**12 #1024 is a good buffer size
self.secToRecord=.1
self.threadsDieNow=False
self.newAudio=False
def setup(self):
"""initialize sound card."""
#TODO - windows detection vs. alsa or something for linux
#TODO - try/except for sound card selection/initiation
self.buffersToRecord=int(self.RATE*self.secToRecord/self.BUFFERSIZE)
if self.buffersToRecord==0: self.buffersToRecord=1
self.samplesToRecord=int(self.BUFFERSIZE*self.buffersToRecord)
self.chunksToRecord=int(self.samplesToRecord/self.BUFFERSIZE)
self.secPerPoint=1.0/self.RATE
self.p = pyaudio.PyAudio()
self.inStream = self.p.open(format=pyaudio.paInt16,channels=1,
rate=self.RATE,input=True,frames_per_buffer=self.BUFFERSIZE)
self.xsBuffer=numpy.arange(self.BUFFERSIZE)*self.secPerPoint
self.xs=numpy.arange(self.chunksToRecord*self.BUFFERSIZE)*self.secPerPoint
self.audio=numpy.empty((self.chunksToRecord*self.BUFFERSIZE),dtype=numpy.int16)
def close(self):
"""cleanly back out and release sound card."""
self.p.close(self.inStream)
### RECORDING AUDIO ###
def getAudio(self):
"""get a single buffer size worth of audio."""
audioString=self.inStream.read(self.BUFFERSIZE)
return numpy.fromstring(audioString,dtype=numpy.int16)
def record(self,forever=True):
"""record secToRecord seconds of audio."""
while True:
if self.threadsDieNow: break
for i in range(self.chunksToRecord):
self.audio[i*self.BUFFERSIZE:(i+1)*self.BUFFERSIZE]=self.getAudio()
self.newAudio=True
if forever==False: break
def continuousStart(self):
"""CALL THIS to start running forever."""
self.t = threading.Thread(target=self.record)
self.t.start()
def continuousEnd(self):
"""shut down continuous recording."""
self.threadsDieNow=True
### MATH ###
def downsample(self,data,mult):
"""Given 1D data, return the binned average."""
overhang=len(data)%mult
if overhang: data=data[:-overhang]
data=numpy.reshape(data,(len(data)/mult,mult))
data=numpy.average(data,1)
return data
def fft(self,data=None,trimBy=10,logScale=False,divBy=100):
if data==None:
data=self.audio.flatten()
left,right=numpy.split(numpy.abs(numpy.fft.fft(data)),2)
ys=numpy.add(left,right[::-1])
if logScale:
ys=numpy.multiply(20,numpy.log10(ys))
xs=numpy.arange(self.BUFFERSIZE/2,dtype=float)
if trimBy:
i=int((self.BUFFERSIZE/2)/trimBy)
ys=ys[:i]
xs=xs[:i]*self.RATE/self.BUFFERSIZE
if divBy:
ys=ys/float(divBy)
return xs,ys
### VISUALIZATION ###
def plotAudio(self):
"""open a matplotlib popup window showing audio data."""
pylab.plot(self.audio.flatten())
pylab.show()
我想要一些帮助,我一直在做很多研究,但不知道如何解决。 谢谢