したいこと
wavファイルを読み込んで、処理して、別ファイルとして出力したい。
発生しているエラー
Traceback (most recent call last):
File "C:\Users\user\Desktop\ファイル\python\高音質か\hoge.py", line 52, in <module>
wave_plot("sin800_900.wav")
File "C:\Users\user\Desktop\ファイル\python\高音質か\hoge.py", line 41, in wave_plot
binwave = struct.pack("h" * len(data2), *data2)
struct.error: required argument is not an integer
試したこと
byteに変換する方法をいくつも試した。
コード
python3
1#coding:utf-8 2import wave 3import numpy as np 4import matplotlib.pyplot as plt 5import struct 6 7def wave_plot(filename): 8 # open wave file 9 wf = wave.open(filename,'r') 10 channels = wf.getnchannels() # 追記 11 print(wf.getparams()) 12 13 # load wave data 14 chunk_size = wf.getnframes() 15 data = wf.readframes(chunk_size)# バイナリ読み込み 16 data = np.frombuffer(data,'int16') # intに変換 17 # make time axis 18 rate = wf.getframerate() 19 size = float(chunk_size) 20 x = np.arange(0, size/rate, 1.0/rate) 21 print(chunk_size) 22 23 #処理 24 rig = data[0] 25 lef = data[1] 26 data2 = [] 27 print(chunk_size) 28 print(len(data)) 29 data2.append(data[0]) 30 data2.append(data[1]) 31 for i in range(2,(chunk_size-1)*2,2): 32 data2.append(data[i]+(data[i]-rig)*0.1) 33 data2.append(data[i+1]+(data[i+1]-lef)*0.1) 34 35 data2 = data2 + [0,0] 36 print(len(data2)) 37 # plot マルチチャンネルに対応 38 for i in range(channels): 39 plt.plot(x,data2[i::channels]) 40 41 binwave = struct.pack("h" * len(data2), *data2) 42 print(binwave) 43 ch = wf.getnchannels() #チャンネル(モノラル or ステレオ 44 fs = wf.getframerate() #サンプリング周波数 45 nbits = wf.getsampwidth() #量子化ビット 46 L = wf.getnframes() #サンプル数 47 # 書き出し 48 fOut = wave.open("out.wav", "wb") 49 fOut.setparams( (ch, nbits, fs, L, "NONE", "not compressed") ) 50 fOut.writeframes(binwave) 51 fOut.close() 52wave_plot("sin800_900.wav") 53
初心者で、とんちんかんな質問をしているかもしれませんが、宜しく御願いします。
追記:「binwave = struct.pack("h" * len(data2), *data2)」は、wavファイルに読み込めるように、byteに変換しています。本当にそうかどうかはよく分かりません。data2には、編集済みの波形のデータが入っています。
「binwave = struct.pack("h" * len(data2), *data2)」は具体的にどのような処理を意図していますか?
例えば、data2=[123,456]の場合、binwave変数の型は何で、どんな値を採ると意図しているのか追記ください。
回答を試みてくださり、ありがとうございます。僕は、全くの初心者なので、書いてあったからそう書いたと言うのが多いです。
「binwave = struct.pack("h" * len(data2), *data2)」は、wavファイルに読み込めるように、byteに変換しているのだと勝手に思っています。data2には、編集済みの波形のデータが入っています。(はずです。)申し訳ないです・・・。
プログラムは意図を具現化するツールですので、意図通りにしか動きません。初心者であれば尚更意図を明確にするように訓練することをお勧め致します。
また、エラーについても情報が多く含まれている場合が多いので、その意図を読み取れるようにすると良いかと思います。
分かりました。ご親切にありがとうございます。
回答1件
あなたの回答
tips
プレビュー