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

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

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

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

Q&A

解決済

1回答

960閲覧

wavファイルの出力に関係する質問

ARATAKU

総合スコア16

Python 3.x

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

0グッド

1クリップ

投稿2019/04/18 13:06

編集2019/04/18 13:58

したいこと

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には、編集済みの波形のデータが入っています。

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

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

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

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

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

can110

2019/04/18 13:27

「binwave = struct.pack("h" * len(data2), *data2)」は具体的にどのような処理を意図していますか? 例えば、data2=[123,456]の場合、binwave変数の型は何で、どんな値を採ると意図しているのか追記ください。
ARATAKU

2019/04/18 13:56

回答を試みてくださり、ありがとうございます。僕は、全くの初心者なので、書いてあったからそう書いたと言うのが多いです。 「binwave = struct.pack("h" * len(data2), *data2)」は、wavファイルに読み込めるように、byteに変換しているのだと勝手に思っています。data2には、編集済みの波形のデータが入っています。(はずです。)申し訳ないです・・・。
t_obara

2019/04/19 01:04

プログラムは意図を具現化するツールですので、意図通りにしか動きません。初心者であれば尚更意図を明確にするように訓練することをお勧め致します。 また、エラーについても情報が多く含まれている場合が多いので、その意図を読み取れるようにすると良いかと思います。
ARATAKU

2019/04/19 09:29

分かりました。ご親切にありがとうございます。
guest

回答1

0

ベストアンサー

以下のようなコードで任意の個数の整数リストをバイナリデータに変換できます。
参考:7.1. struct --- バイト列をパックされたバイナリデータとして解釈する

なお、コードを書く際は、各変数がどのような型、値をとるのかを意識しましょう。
また、struct.pack(のような自分にとってよくわからない関数、処理があった場合は、必ずマニュアルを読み、与えるべき引数や使い方を調べるくせをつけましょう。

Python

1import struct 2 3data2 = [1,2,3,4] 4 5fmt = '{}h'.format(len(data2)) # 4h = 4つのデータをパックする 6 7binwave = struct.pack(fmt, *data2) # *data2 で 引数展開する 8# ↑は↓と同じ 9# binwave = struct.pack(fmt, data2[0], data2[1], ...) 10 11print(binwave) # b'\x01\x00\x02\x00\x03\x00\x04\x00'

投稿2019/04/19 02:45

編集2019/04/19 02:51
can110

総合スコア38266

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

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

ARATAKU

2019/04/19 09:32

ありがとうございます。アドバイスもありがとうございます。マニュアルなどに書いてあることは、知らない単語が多すぎて読み始めてもあきらめてしまうことが多かったですが、知らない単語も調べながら、マニュアルをちゃんと理解しようとするようにしたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問