前提・実現したいこと
Python3でのリアルタイム音声プロット
ネットに落ちているコードを参考にし、pyqtgraph+PyAudioを使い実現しようとしています
しかし、以下のエラーに悩まされています。
発生している問題・エラーメッセージ
エラーメッセージ Expression 'alsa_snd_pcm_hw_params_set_period_size_near( pcm, hwParams, &alsaPeriodFrames, &dir )' failed in 'src/hostapi/alsa/pa_linux_alsa.c', line: 924 ALSA lib pcm_dmix.c:1108:(snd_pcm_dmix_open) unable to open slave ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.hdmi ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.hdmi ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.modem ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.modem ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.phoneline ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.phoneline ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'defaults.bluealsa.device' ALSA lib conf.c:4568:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory ALSA lib conf.c:5036:(snd_config_expand) Args evaluate error: No such file or directory ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM bluealsa ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'defaults.bluealsa.device' ALSA lib conf.c:4568:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory ALSA lib conf.c:5036:(snd_config_expand) Args evaluate error: No such file or directory ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM bluealsa ALSA lib pcm_dmix.c:1108:(snd_pcm_dmix_open) unable to open slave ALSA lib pcm_dmix.c:1108:(snd_pcm_dmix_open) unable to open slave Cannot connect to server socket err = No such file or directory Cannot connect to server request channel jack server is not running or cannot be started JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock qt5ct: using qt5ct plugin Segmentation fault
該当のソースコード
Python3
1#プロット関係のライブラリ 2import pyqtgraph as pg 3from pyqtgraph.Qt import QtCore, QtGui 4import numpy as np 5import sys 6 7#音声関係のライブラリ 8import pyaudio 9import struct 10 11class PlotWindow: 12 def __init__(self): 13 #マイクインプット設定 14 self.CHUNK =1024*4 # 1度に読み取る音声のデータ幅 15 self.RATE = 48000 # サンプリング周波数 16 self.update_seconds = 50 # 更新時間[ms] 17 self.audio = pyaudio.PyAudio() 18 self.stream = self.audio.open(format=pyaudio.paInt16, 19 channels=1, 20 rate=self.RATE, 21 input=True, 22 frames_per_buffer=self.CHUNK) 23 24 #音声データの格納場所(プロットデータ) 25 self.data = np.zeros(self.CHUNK) 26 self.axis = np.fft.fftfreq(len(self.data), d=1.0/self.RATE) 27 28 #プロット初期設定 29 self.win = pg.GraphicsWindow() 30 self.win.setWindowTitle("SpectrumAnalyzer") 31 self.plt = self.win.addPlot() # プロットのビジュアル関係 32 self.plt.setYRange(0, 30) # y軸の制限 33 34 #アップデート時間設定 35 self.timer = QtCore.QTimer() 36 self.timer.timeout.connect(self.update) 37 self.timer.start(self.update_seconds) # 10msごとにupdateを呼び出し 38 39 def update(self): 40 self.data = np.append(self.data, self.AudioInput()) 41 if len(self.data)/1024 > 10: 42 self.data = self.data[1024:] 43 self.fft_data = self.FFT_AMP(self.data) 44 self.axis = np.fft.fftfreq(len(self.data), d=1.0/self.RATE) 45 # symbol="o", symbolPen="y", symbolBrush="b") 46 self.plt.plot(x=self.axis, y=self.fft_data, clear=True, pen="y") 47 48 def AudioInput(self): 49 ret = self.stream.read(self.CHUNK) # 音声の読み取り(バイナリ) CHUNKが大きいとここで時間かかる 50 #バイナリ → 数値(int16)に変換 51 #32768.0=2^16で割ってるのは正規化(絶対値を1以下にすること) 52 ret = np.frombuffer(ret, dtype="int16")/32768.0 53 return ret 54 55 def FFT_AMP(self, data): 56 data = np.hamming(len(data))*data 57 data = np.fft.fft(data) 58 data = np.abs(data) 59 return data 60 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 67
試したこと
プログラムを実行するには、sudo権限が必要とのことでしたので、実行時sudoをつけて実行しています
1)https://www.raspberrypi.org/forums/viewtopic.php?p=1166213
補足情報(FW/ツールのバージョンなど)
プログラミング初心者ですので、根本的に間違っている箇所があるかもしれません。
Raspberry Pi 3 で開発を行っています
よろしくお願いします
あなたの回答
tips
プレビュー