###前提・実現したいこと
pyaudioでリアルタイムでマイク入力を読み込み,pyqt5上でウィンドウを作ってそこに何秒か毎にlibrosa.display.specshow()(https://librosa.github.io/librosa/display.html)でスペクトログラムを表示・保存したいと考えています.
そこでpyqt5のウィンドウ上でlibrosa.display.specshow()を出すにはどうすればよいでしょうか.
scipyでスペクトログラムを表示させることは(多分)できました.
###該当のソースコード
Python
1import sys 2import numpy as np 3import pyaudio 4from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas 5from matplotlib.figure import Figure 6import librosa 7import librosa.display 8from scipy import signal 9 10from PyQt5.QtCore import (QLineF, QPointF, QRectF, Qt, QTimer) 11from PyQt5.QtGui import (QBrush, QColor, QPainter) 12from PyQt5.QtWidgets import (QApplication, QGraphicsView, QGraphicsScene, QGraphicsItem, 13 QGridLayout, QVBoxLayout, QHBoxLayout, QSizePolicy, 14 QLabel, QLineEdit, QPushButton) 15 16 17class MainWindow(FigureCanvas): 18 def __init__(self, parent=None, width=4, height=3, dpi=200): 19 # マイクインプット設定 20 self.FORMAT = pyaudio.paFloat32 21 self.CHANNELS = 1 # モノラル 22 self.RATE = 44100 # サンプリング周波数 23 self.CHUNK = 1024 # 1度に読み取る音声のデータ幅 24 self.UPDATE_SECOND = 100 # 更新時間[ms] 25 26 self.audio = pyaudio.PyAudio() 27 self.stream = self.audio.open(format=self.FORMAT, 28 channels=self.CHANNELS, 29 rate=self.RATE, 30 input=True, 31 output=False, 32 frames_per_buffer=self.CHUNK) 33 34 fig = Figure(figsize=(width, height), dpi=dpi) 35 self.axes = fig.add_subplot(111) 36 self.axes.hold(False) 37 super(MainWindow, self).__init__(fig) 38 self.setParent(parent) 39 40 FigureCanvas.setSizePolicy(self, 41 QSizePolicy.Expanding, 42 QSizePolicy.Expanding) 43 FigureCanvas.updateGeometry(self) 44 45 # アップデート時間設定 46 timer = QTimer(self) 47 timer.timeout.connect(self.update_figure) 48 timer.start(self.UPDATE_SECOND) 49 50 def update_figure(self): 51 # マイク入力読み込み 52 data = self.audioinput() 53 54 # fft_data = librosa.stft(data) 55 # librosa.display.specshow(librosa.logamplitude(np.abs(fft_data) ** 2, ref_power=np.max), y_axis='log', 56 # x_axis='time') 57 58 # scipyで無理やり 59 f, t, Sxx = signal.spectrogram(data, fs=self.RATE, nperseg=512) 60 self.axes.pcolormesh(t, f, Sxx, vmax=1e-9, cmap='jet') 61 62 self.draw() 63 64 def audioinput(self): 65 ret = self.stream.read(self.CHUNK) 66 ret = np.fromstring(ret, np.float32) 67 68 return ret 69 70 71if __name__ == '__main__': 72 app = QApplication(sys.argv) 73 mainWindow = MainWindow() 74 mainWindow.show() 75 sys.exit(app.exec_())
###試したこと
http://takeshid.hatenadiary.jp/entry/2015/11/27/045123
http://d.hatena.ne.jp/mFumi/20141112/1415806010
こちらのサイトのプログラムでpyaudioでリアルタイムでマイク入力の読み込みや,pyqt5上でのmatplotlibの連携をすることができました.
librosa.displayだと単体で表示できてしまうため,埋め込むことは難しいのでしょうか
あなたの回答
tips
プレビュー