前提・実現したいこと
Pythonを使用した音声解析としてウェーブレット変換をしたいです。
一つ目の表示である音声波形はうまく出るのですが、Fs=1/0.0001の行からエラーが出てしまいます。
解決方法を教えていただきたいです。
発生している問題・エラーメッセージ
Using memory-mapped arrays... Traceback (most recent call last): File "C:\Users\hiro2\Desktop\sound\wavelet.py", line 45, in <module> r=pycwt.cwt_f(y,freqs,Fs,pycwt.Morlet(omega0)) File "C:\Users\hiro2\AppData\Local\Programs\Python\Python39\lib\site-packages\swan\pycwt.py", line 234, in cwt_f return cwt_a(signal, scales, dt, wavelet, ppd, verbose=verbose) File "C:\Users\hiro2\AppData\Local\Programs\Python\Python39\lib\site-packages\swan\pycwt.py", line 219, in cwt_a W = memsafe_arr((len(scales), siglen), 'complex') File "C:\Users\hiro2\AppData\Local\Programs\Python\Python39\lib\site-packages\swan\pycwt.py", line 34, in memsafe_arr return np.memmap(_tmpfile, dtype=dtype, shape=shape) File "C:\Users\hiro2\AppData\Local\Programs\Python\Python39\lib\site-packages\numpy\core\memmap.py", line 254, in __new__ fid.write(b'\0') File "C:\Users\hiro2\AppData\Local\Programs\Python\Python39\lib\tempfile.py", line 474, in func_wrapper return func(*args, **kwargs) TypeError: write() argument must be str, not bytes
該当のソースコード
Python
1from swan import pycwt 2import numpy as np 3import matplotlib.pyplot as plt 4import wave 5#import struct 6from scipy import fromstring, int16 7#from pylab import * 8#from scipy import signal 9 10 11wavfile = '04-agarikata-kara-01-p6TAskMJUgg.wav' 12wr = wave.open(wavfile, "rb") 13ch = wr.getnchannels() 14width = wr.getsampwidth() 15fr = wr.getframerate() 16fn = wr.getnframes() 17fs = fn / fr 18 19print("オーディオチャンネル数(モノラル: 1 ステレオ:2 ) : ", ch) 20print("オーディオフレーム数 : ", fn) 21print("サンプリングレート : ",fr) 22print("記録時間(Sec) : ", fs, 'sec') 23print("サンプルサイズ(バイト数) : ", width) 24origin = wr.readframes(wr.getnframes()) 25data = origin[:fn] 26wr.close() 27amp = max(data) 28print(amp) 29 30print('len of origin', len(origin)) 31print('len of sampling: ', len(data)) 32 33# ステレオ前提 > monoral 34y = np.frombuffer(data, dtype="int16") /32768.0 35x = np.linspace(0,fs, int(fn/2), endpoint=False) 36plt.plot(x, y) 37plt.show() 38 39print(len(y)) 40 41Fs = 1/0.0001 42omega0 = 5 #0.2 #1 #2 #8 43# (1) Freqを指定してcwt 44freqs=np.arange(10,2000,2.5) 45r=pycwt.cwt_f(y,freqs,Fs,pycwt.Morlet(omega0)) 46rr=np.abs(r) 47 48plt.rcParams['figure.figsize'] = (10, 6) 49fig = plt.figure() 50ax1 = fig.add_axes([0.1, 0.75, 0.7, 0.2]) 51ax2 = fig.add_axes([0.1, 0.1, 0.7, 0.60], sharex=ax1) 52ax3 = fig.add_axes([0.83, 0.1, 0.03, 0.6]) 53 54ax1.plot(x, y, 'k') 55 56img = ax2.imshow(np.flipud(rr), extent=[0, 3,10, 2000], aspect='auto') #, interpolation='nearest') 57twin_ax = ax2 58twin_ax.set_yscale('log') 59twin_ax.set_xlim(0, 3) 60twin_ax.set_ylim(10, 2000) 61ax2.tick_params(which='both', labelleft=False, left=False) 62twin_ax.tick_params(which='both', labelleft=True, left=True, labelright=False) 63fig.colorbar(img, cax=ax3) 64plt.show() 65 66plt.plot(freqs,rr) 67plt.xscale('log') 68plt.show()
試したこと
他のサイトを訪れた結果コードがステレオではなくモノラル対応なのではないかという疑惑があります。
使用したサイト(FW/ツールのバージョンなど)
回答1件
あなたの回答
tips
プレビュー