70の手習い

Pythonを使ってみる。
やってみたこと。
wav(音声)ファイルを読込み、
音声データを少しいたずらし、
別のwavファイルに書出す。
==
import wave
import matplotlib.pyplot as plt
import numpy as np
import struct
from scipy import signal
dt = 0.001          # サンプリング周期 [s]
wf = wave.open(“testkm.wav”, “r”)
#音声バイナリーデータの読み込み
datab= wf.readframes(wf.getnframes())
wf.close()
#バイナリを整数(-32768~32767)に変換
datai = np.frombuffer(datab, dtype=”int16″)
#整数を実数(-1~+1)に変換
dataf = frombuffer(datai, dtype=”int16″) / 32768.0
plt.plot(datai)
plt.show()
#ここで音声データを「いたずら」
#datafが元のデータ、y1がいたずら後の(実数-1~+1)データ
#整数にする
odatai= [int(v * 32767.0) for v in y1]
#バイナリにする
odatab = struct.pack(“h” * len(odatai), *odatai)
#修正済データをファイルに出力
w = wave.Wave_write(“ofile.wav”)
w.setparams(wf.getparams())
w.writeframes(odatab)
w.close()
plt.plot(odatai)
plt.show()
==
上記の「いたずら」の例
(1)ボリュームを半分にする
y1= dataf * 0.5
(2)音の前半をクリッピング
y1= dataf
for i in range(0,int(len(dataf)/2)):
if(y1[i]>0.7):
y1[i]= 0.7
if(y1[i]<-0.7):
y1[i]= -0.7
(3)ローパスフィルターをかける
filter1 = signal.firwin(numtaps=21, cutoff=40, fs=1/dt)
y1 = signal.lfilter(filter1, 1, dataf)