web-dev-qa-db-ja.com

Pythonでwavファイルデータを操作する方法は?

私はwavファイルを読み、その内容をサンプルごとに操作しようとしています

これが私がこれまでに持っているものです:

import scipy.io.wavfile
import math

rate, data = scipy.io.wavfile.read('xenencounter_23.wav')

for i in range(len(data)):
    data[i][0] = math.sin(data[i][0])
    print data[i][0]

私が得る結果は次のとおりです。

0
0
0
0
0
0

代わりにprint data[i]を書き込むと、通常、サイズ2のゼロ以外の配列が取得されるため、正しく読み取られています。

9
JVE999

wavfile.readによって返される配列dataは、integerデータ型のnumpy配列です。 numpy配列のデータ型はその場で変更できないため、次の行になります。

data[i][0] = math.sin(data[i][0])

math.sinの結果を整数にキャストします。整数は常に0になります。

その線の代わりに、計算結果を格納するための新しい浮動小数点配列を作成します。

または、numpy.sinを使用して、配列内のすべての要素の正弦を一度に計算します。

import numpy as np
import scipy.io.wavfile

rate, data = scipy.io.wavfile.read('xenencounter_23.wav')

sin_data = np.sin(data)

print sin_data

追加のコメントから、各値のサインを取得して、結果を新しいwavファイルとして書き出す必要があるようです。

これは(私が思うに)あなたが望むことをする例です。ここからファイル「M1F1-int16-AFsp.wav」を使用します: http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/Samples.html 。関数show_infoは、各ステップの結果を説明するための便利な方法です。対話型シェルを使用している場合は、それを使用して変数とその属性を検査できます。

import numpy as np
from scipy.io import wavfile

def show_info(aname, a):
    print "Array", aname
    print "shape:", a.shape
    print "dtype:", a.dtype
    print "min, max:", a.min(), a.max()
    print

rate, data = wavfile.read('M1F1-int16-AFsp.wav')

show_info("data", data)

# Take the sine of each element in `data`.
# The np.sin function is "vectorized", so there is no need
# for a Python loop here.
sindata = np.sin(data)

show_info("sindata", sindata)

# Scale up the values to 16 bit integer range and round
# the value.
scaled = np.round(32767*sindata)

show_info("scaled", scaled)

# Cast `scaled` to an array with a 16 bit signed integer data type.
newdata = scaled.astype(np.int16)

show_info("newdata", newdata)

# Write the data to 'newname.wav'
wavfile.write('newname.wav', rate, newdata)

これが出力です。 (最初の警告は、ファイルにscipy.io.wavfile.readが理解できないメタデータが含まれている可能性があることを意味します。)

<snip>/scipy/io/wavfile.py:147: WavFileWarning: Chunk (non-data) not understood, skipping it.
  WavFileWarning)
Array 'data'
shape: (23493, 2)
dtype: int16
min, max: -7125 14325

Array 'sindata'
shape: (23493, 2)
dtype: float32
min, max: -0.999992 0.999991

Array 'scaled'
shape: (23493, 2)
dtype: float32
min, max: -32767.0 32767.0

Array 'newdata'
shape: (23493, 2)
dtype: int16
min, max: -32767 32767

新しいファイル「newname.wav」には、符号付き16ビット値の2つのチャネルが含まれています。

14