ひばりログ

Apple関連やプログラミングなど趣味を書き綴る。

Pythonでwavの前後の無音部分をカットする

概要

f:id:hibari2978:20190811153448p:plain これを f:id:hibari2978:20190811153450p:plain こうする、ということです。

コード

import wave
import numpy as np
import matplotlib.pyplot as plt
import struct

input_filename = 'after_wav/001.wav'
output_filename = 'output.wav'

theta = 0.02
keep_frame = 50

wav = wave.open(input_filename, "rb")
data = wav.readframes(wav.getnframes())
ch = wav.getnchannels()
sample_width = wav.getsampwidth()
framerate = wav.getframerate()

wav.close()
x = np.frombuffer(data, dtype="int16") / float(2**(sample_width*8-1))

front_index = 0
after_index = 0

wav_len = len(x)

print(sample_width)

for i in range(wav_len):
    if theta < np.abs(x[i]):
        front_index = i
        break

for j in range(wav_len):
    if theta < np.abs(x[wav_len-j-1]):
        after_index = wav_len - j
        break

print(front_index)
print(after_index)

x = x[front_index-keep_frame:after_index+keep_frame] * float(2**(sample_width*8-1))
w_x = [int(d) for d in x]
w_x = struct.pack("h" * len(w_x), *w_x)

# グラフ表示
plt.figure(figsize=(15, 3))
plt.plot(x)
plt.show()

output_wav = wave.open(output_filename, 'wb')
output_wav.setnchannels(ch)
output_wav.setsampwidth(sample_width)
output_wav.setframerate(framerate)
output_wav.writeframes(w_x)
output_wav.close()

thetaが無音部分のしきい値で、値を大きくしていくと

削る範囲が大きくなっていきます。

keep_frameは切り取る前後を伸ばすためのもので、

単位はフレームです。

機械学習のデータ作成に使えるかも……?