In [17]:
from pydub import AudioSegment
import numpy as np
import pylab as plt
import IPython
import glob

格式转换

In [18]:
mp3s = glob.glob('./video/*.m4a')
for src in mp3s:
    dst = './video/'+src.split('/')[-1:][0].replace('.m4a','.wav')
    sound = AudioSegment.from_file(src,'m4a')
    sound.export(dst, format='wav')

获取音频的基本信息

In [20]:
sound = AudioSegment.from_wav("./video/incredible.wav")
In [21]:
print('dBFS:',sound.dBFS)
print('声道数:',sound.channels)
print('采样字节数:',sound.sample_width)
print('采样频率',sound.frame_rate)
print('每帧字节数:',sound.frame_width)
print('响度:',sound.rms)
print('最高振幅:',sound.max)
print('max_dBFS:',sound.max_dBFS)
print('持续时间:',sound.duration_seconds)
print('采样点数:',sound.frame_count())
dBFS: -30.47561855159539
声道数: 2
采样字节数: 2
采样频率 44100
每帧字节数: 4
响度: 981
最高振幅: 6560
max_dBFS: -13.97092191168115
持续时间: 2.76172335600907
采样点数: 121792.0

获取音频的数据

In [22]:
wave_data = np.array(sound.get_array_of_samples())
print(wave_data.shape)
(243584,)

音频是两个声道,数据是两个声道的数据交替组成的

1声道采样值,2声道采样值,1声道采样值,2声道采样值......

我们希望将两个声道的数据分开,wave_data[0]是1声道的数据,wave_data[1]是2声道的数据:

In [23]:
wave_data.shape = (-1,2)
wave_data = wave_data.T
print(wave_data.shape)
print(wave_data[0])
print(wave_data[1])
(2, 121792)
[ 1  1  0 ... -3 -3 -2]
[ 1  1  0 ... -3 -3 -2]

时域图

In [24]:
time=np.arange(0,sound.frame_count())/sound.frame_rate
plt.plot(time,wave_data[0])
Out[24]:
[<matplotlib.lines.Line2D at 0x7f4d78349320>]
In [25]:
plt.plot(time,wave_data[1],c="r")
Out[25]:
[<matplotlib.lines.Line2D at 0x7f4d78326438>]

频域图

In [26]:
# 采样点数,修改采样点数和起始位置进行不同位置和长度的音频波形分析
N=int(sound.frame_count())
start=0 #开始采样位置
df = sound.frame_rate/(N-1) # 分辨率
freq = [df*n for n in range(0,N)] #N个元素
wave_data2=wave_data[0][start:start+N]
c=np.fft.fft(wave_data2)*2/N
#常规显示采样频率一半的频谱
d=int(len(c)/2)
plt.plot(freq[:d-1],abs(c[:d-1]),'r')
plt.show()

将数据分成200段,分别计算每段的频谱

In [27]:
pxx, freqs, bins, im = plt.specgram(wave_data[0], 200, sound.frame_rate)
In [28]:
print(pxx.shape)
(101, 1689)

音频裁剪

将10s的背景音频剪成两段5s的

In [29]:
backgrounds = glob.glob('./Pronunciation/backgrounds_10s/*.wav')
for key,value in enumerate(backgrounds):
    bk = AudioSegment.from_wav(value)
    frist_s5 = bk[:5000]
    last_s5 = bk[5000:]
    frist_s5.export('./Pronunciation/backgrounds_5s/'+str(key)+"_frist_s5.wav", format="wav")
    last_s5.export('./Pronunciation/backgrounds_5s/'+str(key)+"_last_s5.wav", format="wav")

调节音量

In [30]:
sound.apply_gain(-20)
Out[30]:
In [31]:
sound.apply_gain(0)
Out[31]:

播放音频

In [15]:
IPython.display.Audio("./video/incredible.wav")
Out[15]:
In [ ]:
 
posted @ 2019-03-06 16:39:34
评论加载中...

发表评论