1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| import wave import numpy as np from scipy.fftpack import fft import matplotlib.pyplot as pyplt import os import subprocess import sys
if not os.path.exists('images'): os.mkdir('images')
def extract_feature(wave_signal,samplerate,fn): window_time=100 # ms shift_time=100 # ms window_length=int(samplerate/1000*window_time) x=np.linspace(0,window_length-1,window_length,dtype=np.int16) w=0.54-0.46*np.cos(2*np.pi*x/(window_length-1)) range0_end=int(len(wave_signal)/samplerate*1000-window_time)//shift_time+1 data_line=np.zeros((1,window_length),dtype=np.float)
for i in range(range0_end): # for i in range(1): p_start=i*int(samplerate/1000*shift_time) p_end=p_start+window_length data_line=wave_signal[p_start:p_end] data_line=data_line*w data_line=np.abs(fft(data_line)) a=np.log(data_line+10).astype(np.int8) print(a) unique,count=np.unique(a,return_counts=True) print(unique,count) pyplt.cla() pyplt.xlim((0, 16)) pyplt.ylim((0, 4000)) pyplt.plot(unique,count) # pyplt.show() pyplt.savefig('images/%05d.jpg'%i) print(f'saving {i+1}th/{range0_end} image') subprocess.call(f'ffmpeg -f image2 -framerate {1000//shift_time} -i "images/%05d.jpg" -b:v 25313k yy.mp4 -y',shell=True) subprocess.call(f'ffmpeg -i yy.mp4 -i {fn} -c:v copy -c:a aac -strict experimental zz.mp4 -y',shell=True)
fn='/home/tellw/test/summer_fruit.wav' with wave.open(fn,'rb') as wav: str_data=wav.readframes(wav.getnframes()) samplerate=wav.getframerate() framenums=wav.getnframes() nchannels=wav.getnchannels() print(framenums,nchannels,samplerate) wave_data=np.frombuffer(str_data,dtype=np.short) extract_feature(wave_data,samplerate,fn) print(f'has {framenums} frames')
|