@toc
1 使用moviepy库包提取音频
1.1 moviepy库包说明
1、moviepy库包介绍
MoviePy
是一个用于视频编辑
的Python模块,它可以用于基本操作(如剪切、连接、标题插入
)、视频合成
(也称为非线性编辑)、视频处理
,或创建高级效果
。它可以读写最常见的视频格式,包括GIF。
2、moviepy参考文档
1.2 安装moviepy
直接使用pip安装即可:
pip install moviepy -i https://pypi.tuna.tsinghua.edu.cn/simple
1.2 使用moviepy提取视频中的音频
# 1、使用moviepy模块 提取视频中的音频文件
from moviepy.editor import AudioFileClip
my_audio_clip = AudioFileClip("./test.mp4")
print(type(my_audio_clip)) # <class 'moviepy.audio.io.AudioFileClip.AudioFileClip'>
# 提取视频中的音频文件 m4v,mp3等音频格式也是支持的
my_audio_clip.write_audiofile("./extract_audio.wav")
'''
MoviePy - Writing audio in ./extract_audio.wav
MoviePy - Done.
'''
2 使用librosa库包读取音频文件,并分析音频文件
2.1 librosa库包介绍
1、librosa
是一个用于音乐
和音频分析
的python包。它提供了创建音乐信息检索系统所必需的构建模块。
2、librosa参考文档
2.2 使用librosa读取音频文件,并分析音频文件
音频数据内容,可以认为记录了:采样频率 和 每个采样点的信号强度 两个部分构成一个音频文件
数据流可以理解为一个数组
,按照字节存储
# 2、使用librosa分析音频
import librosa
import numpy as np
# 加载音频文件
audio, freq = librosa.load("./extract_audio.wav")
print(f"audio: {audio} and audio shape: {audio.shape}\nfreq: {freq}")
print(f"audio type: {type(audio)}\nfreq type: {type(freq)}")
time = len(audio) / freq
print(time) # 94.3
'''
audio: [ 0. 0. 0. ... -0.00216522 -0.00011788
-0.00167476] and audio shape: (2079315,)
freq: 22050
audio type: <class 'numpy.ndarray'>
freq type: <class 'int'>
# 上面的这段音频 采样点共:2079315 采样频率为:22050
这段音频的时长为:2079315 / 22050 = 94.3 因此这段音频的时长约为94秒
也就是每秒采样 22050个数据
'''
上面有几个概念:
音频采样点
:就是在一段时间内,一共采集了多少个音频数据音频采样频率
:就是在一秒内采样采样多少个采样点
因此可以根据音频采样点和音频采样频率,计算出音频的时长:
$$音频的时长 = \frac{音频采样点个数}{音频采样频率}$$
3 绘制音频信号的强度图
3.1 使用matplotlib绘制音频信号强度图
# 3、画出音频的信号强度图
import matplotlib.pyplot as plt
time = np.arange(0, len(audio)) / freq
# np.arange(0, len(audio)) = (0,1,2,3,...,2079314)
print(time.shape) # (2079315,)
print(np.min(time), np.max(time)) # 94.29995464852608 0.0
fig, ax = plt.subplots()
ax.plot(time, audio)
ax.set(xlabel="Time(s)", ylabel="Sound Amplitude")
plt.show()
# 其实绘制的点一共有2079315个,但是由于我们的时间范围是0-94,因此音频信号看起来很拥挤
3.2 使用librosa画信号强度图
当然我们可以使用librosa 库
的工具来分析,可以修掉音频首尾的其他信息
,画信号强度图的方式如下:
# 4、使用librosa画信号强度图
# 当然我们可以使用 librosa 库的工具来分析,可以修掉音频首尾的其他信息,画信号强度图的方式如下:
import librosa.display
audio, _ = librosa.effects.trim(audio)
librosa.display.waveplot(audio, sr=freq)
plt.show()
完整代码如下:
__Author__ = "Shliang"
__Email__ = "shliang0603@gmail.com"
# 1、使用moviepy模块 提取视频中的音频文件
from moviepy.editor import AudioFileClip
my_audio_clip = AudioFileClip("./test.mp4")
print(type(my_audio_clip)) # <class 'moviepy.audio.io.AudioFileClip.AudioFileClip'>
# 提取视频中的音频文件 m4v,mp3等音频格式也是支持的
# my_audio_clip.write_audiofile("./extract_audio.wav")
'''
MoviePy - Writing audio in ./extract_audio.wav
MoviePy - Done.
'''
# 2、使用librosa分析音频
# 音频数据内容,可以认为记录了:采样频率 和 每个采样点的信号强度 两个部分构成一个音频文件
# 数据流可以理解为一个数组,按照字节存储
import librosa
import numpy as np
# 加载音频文件
audio, freq = librosa.load("./extract_audio.wav")
print(f"audio: {audio} and audio shape: {audio.shape}\nfreq: {freq}")
print(f"audio type: {type(audio)}\nfreq type: {type(freq)}")
time = len(audio) / freq
print(time) # 94.3
'''
audio: [ 0. 0. 0. ... -0.00216522 -0.00011788
-0.00167476] and audio shape: (2079315,)
freq: 22050
audio type: <class 'numpy.ndarray'>
freq type: <class 'int'>
# 上面的这段音频 采样点共:2079315 采样频率为:22050
这段音频的时长为:2079315 / 22050 = 94.3 因此这段音频的时长约为94秒
也就是每秒采样 22050个数据
'''
# 3、画出音频的信号强度图
import matplotlib.pyplot as plt
time = np.arange(0, len(audio)) / freq
# np.arange(0, len(audio)) = (0,1,2,3,...,2079314)
print(time.shape) # (2079315,)
print(np.min(time), np.max(time)) # 94.29995464852608 0.0
fig, ax = plt.subplots()
ax.plot(time, audio)
ax.set(xlabel="Time(s)", ylabel="Sound Amplitude")
plt.show()
# 其实绘制的点一共有2079315个,但是由于我们的时间范围是0-94,因此音频信号看起来很拥挤
# 4、使用librosa画信号强度图
# 当然我们可以使用 librosa 库的工具来分析,可以修掉音频首尾的其他信息,画信号强度图的方式如下:
import librosa.display
audio, _ = librosa.effects.trim(audio)
librosa.display.waveplot(audio, sr=freq)
plt.show()