

pyaudioでリアルタイムでマイク入力を読み込み，pyqt5上でウィンドウを作ってそこに何秒か毎にlibrosa.display.specshow()でスペクトログラムを表示・保存したいと考えています．  
そこでpyqt5のウィンドウ上でlibrosa.display.specshow()を出すにはどうすればよいでしょうか.  
scipyでスペクトログラムを表示させることは（多分）できました．

[code]

    import sys
    import numpy as np
    import pyaudio
    from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
    from matplotlib.figure import Figure
    import librosa
    import librosa.display
    from scipy import signal
    
    from PyQt5.QtCore import (QLineF, QPointF, QRectF, Qt, QTimer)
    from PyQt5.QtGui import (QBrush, QColor, QPainter)
    from PyQt5.QtWidgets import (QApplication, QGraphicsView, QGraphicsScene, QGraphicsItem,
                             QGridLayout, QVBoxLayout, QHBoxLayout, QSizePolicy,
                             QLabel, QLineEdit, QPushButton)
    
    
    class MainWindow(FigureCanvas):
        def __init__(self, parent=None, width=4, height=3, dpi=200):
            # マイクインプット設定
            self.FORMAT = pyaudio.paFloat32
            self.CHANNELS = 1  # モノラル
            self.RATE = 44100  # サンプリング周波数
            self.CHUNK = 1024  # 1度に読み取る音声のデータ幅
            self.UPDATE_SECOND = 100  # 更新時間[ms]
    
            self.audio = pyaudio.PyAudio()
            self.stream = self.audio.open(format=self.FORMAT,
                                      channels=self.CHANNELS,
                                      rate=self.RATE,
                                      input=True,
                                      output=False,
                                      frames_per_buffer=self.CHUNK)
    
            fig = Figure(figsize=(width, height), dpi=dpi)
            self.axes = fig.add_subplot(111)
            self.axes.hold(False)
            super(MainWindow, self).__init__(fig)
            self.setParent(parent)
    
            FigureCanvas.setSizePolicy(self,
                                   QSizePolicy.Expanding,
                                   QSizePolicy.Expanding)
            FigureCanvas.updateGeometry(self)
    
            # アップデート時間設定
            timer = QTimer(self)
            timer.timeout.connect(self.update_figure)
            timer.start(self.UPDATE_SECOND)
    
        def update_figure(self):
            # マイク入力読み込み
            data = self.audioinput()
    
            # fft_data = librosa.stft(data)
            # librosa.display.specshow(librosa.logamplitude(np.abs(fft_data) ** 2, ref_power=np.max), y_axis='log',
            #                                 x_axis='time')
    
            # scipyで無理やり
            f, t, Sxx = signal.spectrogram(data, fs=self.RATE, nperseg=512)
            self.axes.pcolormesh(t, f, Sxx, vmax=1e-9, cmap='jet')
    
            self.draw()
    
        def audioinput(self):
            ret = self.stream.read(self.CHUNK)
            ret = np.fromstring(ret, np.float32)
    
            return ret
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        mainWindow = MainWindow()
        mainWindow.show()
        sys.exit(app.exec_())
    
[/code]

<http://takeshid.hatenadiary.jp/entry/2015/11/27/045123>  
<http://d.hatena.ne.jp/mFumi/20141112/1415806010>  
こちらのサイトのプログラムでpyaudioでリアルタイムでマイク入力の読み込みや，pyqt5上でのmatplotlibの連携をすることができました．  
librosa.displayだと単体で表示できてしまうため，埋め込むことは難しいのでしょうか


CC BY-SA 3.0
2017-08-30T12:46:45.557
37618
2017-08-30T12:46:45.557
25110
question
python
pyqt上でlibrosaのスペクトログラムを表示・保存したい