pyqt上でlibrosaのスペクトログラムを表示・保存したい
pyaudioでリアルタイムでマイク入力を読み込み,pyqt5上でウィンドウを作ってそこに何秒か毎にlibrosa.display.specshow()でスペクトログラムを表示・保存したいと考えています.
そこでpyqt5のウィンドウ上でlibrosa.display.specshow()を出すにはどうすればよいでしょうか.
scipyでスペクトログラムを表示させることは(多分)できました.
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_())
http://takeshid.hatenadiary.jp/entry/2015/11/27/045123
http://d.hatena.ne.jp/mFumi/20141112/1415806010
こちらのサイトのプログラムでpyaudioでリアルタイムでマイク入力の読み込みや,pyqt5上でのmatplotlibの連携をすることができました.
librosa.displayだと単体で表示できてしまうため,埋め込むことは難しいのでしょうか