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

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

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

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

Q&A

解決済

1回答

693閲覧

自前の音声データでウェーブレット解析ができない

kamui-sipe

総合スコア21

Python 3.x

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

0グッド

0クリップ

投稿2022/11/02 21:29

前提

Pythonでウェーブレット解析をしたく、自前のデータを読み込ませたところ
実装中に以下のエラーメッセージが発生しました。

実現したいこと

  • 参考サイトと同じように実行したい

https://heartstat.net/2021/05/08/python_wavelet/

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

ValueError Traceback (most recent call last) Input In [3], in <cell line: 1>() ----> 1 plt.pcolormesh(t, frq, 10*np.log(np.abs(coef)), cmap='jet') 2 plt.colorbar() 3 plt.show() File D:\anaconda\envs\midi\lib\site-packages\matplotlib\pyplot.py:2691, in pcolormesh(alpha, norm, cmap, vmin, vmax, shading, antialiased, data, args, *kwargs) 2686 @_copy_docstring_and_deprecators(Axes.pcolormesh) 2687 def pcolormesh( 2688 args, alpha=None, norm=None, cmap=None, vmin=None, 2689 vmax=None, shading=None, antialiased=False, data=None, 2690 *kwargs): -> 2691 ret = gca().pcolormesh( 2692 args, alpha=alpha, norm=norm, cmap=cmap, vmin=vmin, 2693 vmax=vmax, shading=shading, antialiased=antialiased, 2694 *({"data": data} if data is not None else {}), **kwargs) 2695 sci(ret) 2696 return __ret File D:\anaconda\envs\midi\lib\site-packages\matplotlib_init_.py:1423, in _preprocess_data..inner(ax, data, args, *kwargs) 1420 @functools.wraps(func) 1421 def inner(ax, args, data=None, *kwargs): 1422 if data is None: -> 1423 return func(ax, map(sanitize_sequence, args), *kwargs) 1425 bound = new_sig.bind(ax, args, *kwargs) 1426 auto_label = (bound.arguments.get(label_namer) 1427 or bound.kwargs.get(label_namer)) File D:\anaconda\envs\midi\lib\site-packages\matplotlib\axes_axes.py:6133, in Axes.pcolormesh(self, alpha, norm, cmap, vmin, vmax, shading, antialiased, args, *kwargs) 6130 shading = shading.lower() 6131 kwargs.setdefault('edgecolors', 'none') -> 6133 X, Y, C, shading = self._pcolorargs('pcolormesh', *args, 6134 shading=shading, kwargs=kwargs) 6135 coords = np.stack([X, Y], axis=-1) 6136 # convert to one dimensional array File D:\anaconda\envs\midi\lib\site-packages\matplotlib\axes_axes.py:5636, in Axes._pcolorargs(self, funcname, shading, args, *kwargs) 5634 if isinstance(Y, np.ma.core.MaskedArray): 5635 Y = Y.data -> 5636 nrows, ncols = C.shape 5637 else: 5638 raise TypeError(f'{funcname}() takes 1 or 3 positional arguments ' 5639 f'but {len(args)} were given') ValueError: too many values to unpack (expected 2)

該当のソースコード

python

1import numpy as np 2import matplotlib.pyplot as plt 3import pywt 4import librosa 5 6if __name__ == "__main__": 7 wave, fs = librosa.load("./a2.mp3", sr=None, mono=False) 8 wavelet_type = 'cmor1.5-1.0' 9 scale = np.arange(1,257) 10 coef, _ = pywt.cwt(wave, scales=scale, wavelet=wavelet_type) 11 t = np.arange(len(wave))/fs 12 frq = pywt.scale2frequency(scale=scale, wavelet=wavelet_type)*fs 13 plt.pcolormesh(t, frq, 10*np.log(np.abs(coef)), cmap='jet') 14 plt.colorbar() 15 plt.show() 16 plt.close()

試したこと

エラーからarray配列のサイズがあってないような感じだったので、確認しました。

python

1wave, fs = librosa.load("./a.wav", sr=None, mono=False) 2np.set_printoptions(threshold=np.inf) 3print(wave.shape) --> (2, 9895555) 4 5wave, fs = librosa.load("./saa.wav", sr=None, mono=False) 6np.set_printoptions(threshold=np.inf) 7print(wave.shape) --> (220500,)

これが原因のような気がするのですが、なぜ同じファイル形式なのに、サイズが違うのでしょうか?(片方は自前でもう一つは参考サイトのものです。)

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

anaconda(python=3.9.12)

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

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

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

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

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

jbpb0

2022/11/02 23:09

> print(wave.shape) --> (2, 9895555) > print(wave.shape) --> (220500,) 前者はステレオ(左右の2チャンネル)で、後者はモノラルだからではないですかね
guest

回答1

0

ベストアンサー

print(wave.shape) --> (2, 9895555)

print(wave.shape) --> (220500,)

なぜ同じファイル形式なのに、サイズが違うのでしょうか?

前者はステレオ(左右の2チャンネル)で、後者はモノラルだからです

 
音声ファイルがステレオの場合は、

python

1wave, fs = librosa.load("./fanfare.wav", sr=None, mono=False)

↓ 変更

python

1wave, fs = librosa.load("./fanfare.wav", sr=None, mono=True)

としてモノラル(左右の平均)として読み込むか、

python

1wave, fs = librosa.load("./fanfare.wav", sr=None, mono=False)

↓ 変更

python

1wave2, fs = librosa.load("./fanfare.wav", sr=None, mono=False) 2 3wave = wave2[0, :] 4# または 5wave = wave2[1, :]

として左右のどちらかだけ使うようにしたら、質問のエラーは出なくなると思います

参考
librosaで音声/音楽データを読み込むlibrosa.load【Python】

投稿2022/11/03 01:36

jbpb0

総合スコア7651

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

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

kamui-sipe

2022/11/03 02:00

配列の違いはチャンネルのところだなとは思っていましたが、完全に失念しておりました。直したら無事実行できました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問