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')

打开zz.mp4看音频波谱图视频

2310181707