前提・実現したいこと
Python3でリアルタイムスペクトルアナライザを作ろうと思い、PyAudioを使い、ネットに落ちていた記事を参考にコードを作成しました。
PyQt5をインストールする必要があるとのことでしたので、下記の記事(※1)を参考にインストールをしていたところ、PyQt5のインストールに失敗します。
開発環境はRaspberryPi3です。
調べていても原因がわからず困っています。
どなたかアドバイスを頂けると助かります。
(※1)https://tomosoft.jp/design/?p=10991
発生している問題・エラーメッセージ
コード実行時のエラーメッセージ Traceback (most recent call last): File "web1-2.py", line 2, in <module> import pyqtgraph as pg File "/home/pi/.local/lib/python3.7/site-packages/pyqtgraph/__init__.py", line 13, in <module> from .Qt import QtGui File "/home/pi/.local/lib/python3.7/site-packages/pyqtgraph/Qt.py", line 153, in <module> from PyQt5 import QtGui, QtCore, QtWidgets, uic ImportError: cannot import name 'QtWidgets' from 'PyQt5' (unknown location) インストール時のエラーメッセージ make[1]: *** [Makefile:1740: sipQtGuiQShortcutEvent.o] エラー 1 make[1]: ディレクトリ '/home/pi/ダウンロード/PyQt5-5.13.2/QtGui' から出ます make: *** [Makefile:101: sub-QtGui-make_first-ordered] エラー 2
該当のソースコード
Python3
1#プロット関係のライブラリ 2import pyqtgraph as pg 3from pyqtgraph.Qt import QtCore, QtGui 4import numpy as np 5import sys 6from PyQt5.QtWidgets import QApplication 7 8#音声関係のライブラリ 9import pyaudio 10import struct 11 12class PlotWindow: 13 def __init__(self): 14 #マイクインプット設定 15 self.CHUNK =1024*2 # 1度に読み取る音声のデータ幅 16 self.RATE = 48000 # サンプリング周波数 17 self.update_seconds = 50 # 更新時間[ms] 18 self.audio = pyaudio.PyAudio() 19 self.stream = self.audio.open(format=pyaudio.paInt16, 20 channels=1, 21 rate=self.RATE, 22 input=True, 23 frames_per_buffer=self.CHUNK) 24 25 #音声データの格納場所(プロットデータ) 26 self.data = np.zeros(self.CHUNK) 27 self.axis = np.fft.fftfreq(len(self.data), d=1.0/self.RATE) 28 29 #プロット初期設定 30 self.win = pg.GraphicsWindow() 31 self.win.setWindowTitle("SpectrumAnalyzer") 32 self.plt = self.win.addPlot() # プロットのビジュアル関係 33 self.plt.setYRange(0, 30) # y軸の制限 34 35 #アップデート時間設定 36 self.timer = QtCore.QTimer() 37 self.timer.timeout.connect(self.update) 38 self.timer.start(self.update_seconds) # 10msごとにupdateを呼び出し 39 40 def update(self): 41 self.data = np.append(self.data, self.AudioInput()) 42 if len(self.data)/1024 > 10: 43 self.data = self.data[1024:] 44 self.fft_data = self.FFT_AMP(self.data) 45 self.axis = np.fft.fftfreq(len(self.data), d=1.0/self.RATE) 46 # symbol="o", symbolPen="y", symbolBrush="b") 47 self.plt.plot(x=self.axis, y=self.fft_data, clear=True, pen="y") 48 49 def AudioInput(self): 50 ret = self.stream.read(self.CHUNK) # 音声の読み取り(バイナリ) CHUNKが大きいとここで時間かかる 51 #バイナリ → 数値(int16)に変換 52 #32768.0=2^16で割ってるのは正規化(絶対値を1以下にすること) 53 ret = np.frombuffer(ret, dtype="int16")/32768.0 54 return ret 55 56 def FFT_AMP(self, data): 57 data = np.hamming(len(data))*data 58 data = np.fft.fft(data) 59 data = np.abs(data) 60 return data 61 62if __name__ == "__main__": 63 plotwin = PlotWindow() 64 if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): 65 QtGui.QApplication.instance().exec_() 66
試したこと
補足情報(FW/ツールのバージョンなど)
プログラミング初心者で検討違いのことをしているかもしれません。ご指摘をいただけますと幸いです。
回答1件
あなたの回答
tips
プレビュー