質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

0回答

1024閲覧

pyaudioでオーディオ入力し波形を表示して、NNによる予測も行いたい

Fauntleroy

総合スコア4

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/01/10 14:07

編集2020/01/11 15:31

実現したいこと

1.pythonでオーディオ入力をして、手前5秒間の波形を表示させる
2.その5秒間の波形をlibrosaを用いて解析する
3.解析した値を自作のNNモデルの入力として用いて、その5秒間の音声をクラス分類する。
4.結果をOSCで送信する。

となっています。
1,2はそれぞれ別のサイトから引用したコードになります。

オーディオ入力をマイク入力で行なっているときは、1分程度処理を行ってから以下のエラーがでます。
入力を別ソフトウェア(MAX)からsoundflowerを用いて行うと、2~3秒で同様のエラーが出てしまいます。

最終的には、soundflower経由で音を入力して、PCのスピーカーからそのまま音声を出力したいです。

説明不足等ありましたら、ご指摘いただきたいです。
初心者で恐縮ですが、よろしくお願いします。

発生している問題・エラーメッセージ

以下、エラーメッセージです。

Traceback (most recent call last): File "audioplot-pred.py", line 195, in update self.data=np.append(self.data, self.AudioInput()) File "audioplot-pred.py", line 208, in AudioInput ret=self.stream.read(self.CHUNK) File "/anaconda3/lib/python3.7/site-packages/pyaudio.py", line 608, in read return pa.read_stream(self._stream, num_frames, exception_on_overflow) OSError: [Errno -9981] Input overflowed Abort trap: 6

このエラー文で検索すると、入力のときのCHUNKの値を大きくしましょう、というアドバイスを多数見かけました。
しかし、chunkを大きくしても(1024 * 2 ~ 1024 * 8まで)同様のエラーで出てしまい、他に原因があるように考えられます。

入力をマイク入力にしたり、無音の状態が多い音をsoundflowerで入力するとエラーは出ませんでした。

該当のソースコード

python

1#プロット関係のライブラリ 2import pyqtgraph as pg 3from pyqtgraph.Qt import QtCore, QtGui 4import numpy as np 5import sys 6 7#音声関係のライブラリ 8import pyaudio 9import struct 10 11import tensorflow 12import librosa 13import pandas as pd 14import os 15import pathlib 16import csv 17import glob 18import matplotlib.pyplot as plt 19 20from pydub import AudioSegment 21import math 22 23# Preprocessing 24from sklearn.model_selection import train_test_split 25from keras.models import Sequential, Model , load_model 26from sklearn.preprocessing import LabelEncoder, StandardScaler 27 28from keras import models 29from keras import layers 30 31from pythonosc import udp_client 32from pythonosc.osc_message_builder import OscMessageBuilder 33 34IP = '127.0.0.1' 35PORT = 1192 36 37 38client = udp_client.UDPClient(IP, PORT) 39 40import warnings 41 42warnings.filterwarnings('ignore') 43 44model=load_model('/Users/Desktop/test.h5') 45# model.summary() 46 47label = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19'] 48 49 50cmap = plt.get_cmap('inferno') 51plt.figure(figsize=(20, 20)) 52 53 54sr = 44100 55 56data = pd.DataFrame({ 57 'chroma_stft' : [], 58 'rmse' : [], 59 'spectral_centroid' : [], 60 'spectral_bandwidth' : [], 61 'rolloff' : [], 62 'zero_crossing_rate' : [], 63 'mfcc1' : [], 64 'mfcc2' : [], 65 'mfcc3' : [], 66 'mfcc4' : [], 67 'mfcc5' : [], 68 'mfcc6' : [], 69 'mfcc7' : [], 70 'mfcc8' : [], 71 'mfcc9' : [], 72 'mfcc10' : [], 73 'mfcc11' : [], 74 'mfcc12' : [], 75 'mfcc13' : [], 76 'mfcc14' : [], 77 'mfcc15' : [], 78 'mfcc16' : [], 79 'mfcc17' : [], 80 'mfcc18' : [], 81 'mfcc19' : [], 82 'mfcc20' : []} 83 84mp3 = "/Users/Downloads/1-24.mp3" 85songname = f'{mp3}' 86 87 88 89def pred(y): 90 91 # songname = f'{mp3}' 92 # y, sr = librosa.load(songname, mono=True, duration=5) 93 chroma_stft = librosa.feature.chroma_stft(y=y, sr=sr) 94 spec_cent = librosa.feature.spectral_centroid(y=y, sr=sr) 95 spec_bw = librosa.feature.spectral_bandwidth(y=y, sr=sr) 96 rolloff = librosa.feature.spectral_rolloff(y=y, sr=sr) 97 zcr = librosa.feature.zero_crossing_rate(y) 98 mfcc = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=20) 99 rmse = librosa.feature.rmse(y=y) 100 to_append = f'{np.mean(chroma_stft)} {np.mean(rmse)} {np.mean(spec_cent)} {np.mean(spec_bw)} {np.mean(rolloff)} {np.mean(zcr)}' 101 102 for e in mfcc: 103 to_append += f' {np.mean(e)}' 104 105 106 f_data = to_append.split() 107 108 # print("feature") 109 # print(f_data) 110 111 112 data.loc['1'] = f_data 113 114 115 116 genre_list = data.iloc[:, -1] 117 encoder = LabelEncoder() 118 y = encoder.fit_transform(genre_list) 119 120 scaler = StandardScaler() 121 X = scaler.fit_transform(np.array(data.iloc[:, :-1], dtype = float)) 122 123 124 # print(data) 125 126 127 pred = model.predict(data, batch_size=1, verbose=0) 128 score = np.max(pred) 129 pred_label = label[np.argmax(pred[0])] 130 131 print('name : ', pred_label) 132 print('score : ', score) 133 print(pred) 134 135 ''' 136 msg = OscMessageBuilder(address='/furi') 137 msg.add_arg(pred_label) 138 m = msg.build() 139 140 client.send(m) 141 ''' 142 143 144 145class PlotWindow: 146 def __init__(self): 147 #プロット初期設定 148 self.win=pg.GraphicsWindow() 149 self.win.setWindowTitle(u"リアルタイムプロット") 150 self.plt=self.win.addPlot() 151 self.plt.setYRange(-1,1) 152 self.curve=self.plt.plot() 153 154 #マイクインプット設定 155 self.CHUNK=1024 * 5 156 self.p_num = 44100 * 2 157 self.RATE=44100 158 self.audio=pyaudio.PyAudio() 159 self.stream=self.audio.open(format=pyaudio.paInt16, 160 channels=2, 161 rate=self.RATE, 162 input_device_index=2,#2 = sound flower 163 input=True, 164 frames_per_buffer=self.CHUNK, 165 output=True) 166 167 #アップデート時間設定 168 self.timer=QtCore.QTimer() 169 self.timer.timeout.connect(self.update) 170 self.timer.start(10) 171 172 self.data=np.zeros(self.CHUNK) 173 self.count = 0 174 175 def update(self): 176 self.count += 1 177 self.data=np.append(self.data, self.AudioInput()) 178 if len(self.data)/ 1 > self.p_num * 2: 179 self.data=self.data[self.CHUNK * 2:] 180 self.curve.setData(self.data) 181 if self.count == 10: 182 pred(self.data) 183 self.count = 0 184 185 def AudioInput(self): 186 ret=self.stream.read(self.CHUNK) 187 # output = self.stream.write(ret) 188 ret=np.frombuffer(ret, dtype="int16")/32768.0 189 return ret 190 191 192if __name__=="__main__": 193 plotwin=PlotWindow() 194 if (sys.flags.interactive!=1) or not hasattr(QtCore, 'PYQT_VERSION'): 195 print("in") 196 QtGui.QApplication.instance().exec_() 197 198 print("out") 199

試したこと

上記のようにCHUNKの値は変えました。
また、update内のself.dataが5秒を超えた時の古い波形データの消去の数等はいろいろと試してみました。

いろいろ試しているうちに、5秒間の波形を表示することすらできなくなってしまいました。

補足情報(FW/ツールのバージョンなど)

macbook pro 2016
python3.7

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問