Pythonを使ってみる。
やってみたこと。
wav(音声)ファイルを読込み、
音声データを少しいたずらし、
別のwavファイルに書出す。
やってみたこと。
wav(音声)ファイルを読込み、
音声データを少しいたずらし、
別のwavファイルに書出す。
==
import wave
import matplotlib.pyplot as plt
import numpy as np
import struct
from scipy import signal
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)データ
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()
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()
plt.show()
==
上記の「いたずら」の例
(1)ボリュームを半分にする
y1= dataf * 0.5
上記の「いたずら」の例
(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
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)
filter1 = signal.firwin(numtaps=21, cutoff=40, fs=1/dt)
y1 = signal.lfilter(filter1, 1, dataf)