🔥博客主页:是dream
🚀系列专栏:深度学习环境搭建、环境配置问题解决、自然语言处理、语音信号处理、项目开发
💘每日语录:你要做冲出的黑马🐎 而不是坠落的星星。
🎉感谢大家点赞👍收藏⭐指正✍️
实验内容:
本文详细介绍了如何将视频“.MP4”文件转换成音频“.wav”文件,并通过python分析音频的波形图、频谱图、语谱图以及MFCC特征。
1、 通过pytube3下载YouTube上的视频,并通过ffmpeg工具将其转化“.wav”音频文件。
2、 通过LibROSA读取该音频,并分析其波形图、语谱图(时频谱图)以及MFCC特征 。
3、 选择截取整段音频中的一部分进一步分析。
前期准备:
如何下载YouTube上的视频?
这里我们用到的工具是pytube3。首先需要确保我们的环境中已经安装了PyTube3库,可以通过使用以下命令通过pip来安装。
pip install pytube3
经验之谈:有的同学在下载安装后pytube3依旧无法下载自己想要的视频,所以在安装pytube3之后,建议更新pytube3,可以通过使用以下命令来更新pytube3。
python -m pip install --upgrade pytube
完成以上的步骤后,可以通过运行以下代码来下载youtobe上的视频。
from pytube import YouTube
# 视频的YouTube URL
url = YouTube('你想要的视频网址')
# 获取视频的各种流
url.streams.get_highest_resolution()
# 下载视频到指定目录
url.streams.get_highest_resolution().download(output_path='文件保存目录')
需要等待一段时间,当下载好视频后就需要将视频转化成音频处理用到的wav文件。
通过ffmpeg将mp4转换成wav文件
前期准备:下载ffmpeg
官方下载地址:Download FFmpeg
通过我分享的文件下载:提取码(peng)百度网盘 请输入提取码
环境变量配置:
下载并解压FFmpeg。之后,需要配置环境变量。
首先需要找到FFmpeg文件下的bin文件,并复制bin文件的路径。如图:
在系统设置中搜索环境变量配置并找到path:
点击编辑,将刚才复制的bin文件路径添加到环境变量中。
找到下载的视频路径,从终端打开,输入以下命令行代码将mp4文件转换成音频处理用到的wav文件。 这里将文件转换成了单声道、16000hz、16位的wav格式音频。
ffmpeg -i input.mp4 -ac 1 -ar 16000 -sample_fmt s16 output.wav
通过LibROSA读取分析该音频
首先需要确保我们的环境中已经安装了libROSA库,可以通过使用以下命令行来安装。
pip install librosa
安装好之后就可以分析音频了。
音频分析
使用到的库函数
import librosa
import librosa.display
import matplotlib.pyplot as plt
import numpy as np
接下来的音频分析我将以《江南style》为例向大家展示。
音频时长:3分53秒
波形图可视化
audio_path = 'output.wav' # 音频文件路径
y, sr = librosa.load(audio_path)
plt.figure(figsize=(12, 4))
librosa.display.waveshow(y, sr=sr)
plt.title('Waveform')
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
plt.show()
波形图展示了音频信号随时间的振幅变化。
语谱图可视化
audio_path = 'output.wav' # 音频文件路径
y, sr = librosa.load(audio_path)
D = librosa.amplitude_to_db(librosa.stft(y), ref=np.max)
plt.figure(figsize=(12, 4))
librosa.display.specshow(D, sr=sr, x_axis='time', y_axis='log')
plt.colorbar(format='%+2.0f dB')
plt.title('Spectrogram')
plt.show()
语谱图用于更好地显示音频的特定频率范围内的能量。
语谱图(梅尔滤波器)可视化
audio_path = 'output.wav' # 音频文件路径
y, sr = librosa.load(audio_path)
S = librosa.feature.melspectrogram(y=y, sr=sr)
S_dB = librosa.power_to_db(S, ref=np.max)
plt.figure(figsize=(12, 4))
librosa.display.specshow(S_dB, sr=sr, x_axis='time', y_axis='mel')
plt.colorbar(format='%+2.0f dB')
plt.title('Mel Spectrogram')
plt.show()
梅尔滤波器语谱图是一种频率表示的变换,它将原始频率表示(线性频率)转换为梅尔频率表示(非线性频率)。梅尔频率表示更符合人类听觉系统对声音的感知,因此在语音识别等任务中更有用。MFCCs通常用于语音处理任务,例如语音识别、语音合成和说话人识别。它们可以提取声音的关键特征,减少噪音的影响,以便于机器学习模型更好地处理语音信号。
MFCC特征提取及其可视化
audio_path = 'output.wav' # 音频文件路径
y, sr = librosa.load(audio_path)
mfccs = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13) # 示例提取13个MFCC系数
librosa.display.specshow(mfccs, x_axis='time')
plt.colorbar()
plt.title('MFCC')
plt.show()
MFCC特征是一种常用于音频处理和语音识别的特征表示。
经验之谈:可以看到通过以上的代码我们能够很好的将音频文件中的信息提取出来并将其可视化,但是由于整个音频时长太长,那么如果想要进行局部的分析,我们又该怎么办?下面我给出了解决办法。
音频局部分析
为了能够更清楚地展示音频中的某些细节,这就需要我们截取其中的一段来进行具体的分析。下面直接附上代码。
import librosa
import librosa.display
import matplotlib.pyplot as plt
import numpy as np
# 替换为你的音频文件路径
audio_path = 'output.wav'
# 加载音频文件
y, sr = librosa.load(audio_path)
# 选择要分析的时间段(例如,从第3秒到第4秒)
start_time = 3.5 #
end_time = 4
# 将时间段转换为样本索引
start_sample = int(start_time * sr)
end_sample = int(end_time * sr)
# 提取选择的时间段内的波形
selected_waveform = y[start_sample:end_sample]
# 创建波形图
plt.figure(figsize=(12, 4))
librosa.display.waveshow(selected_waveform, sr=sr)
plt.title('Waveform (Selected Time Range)')
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
# 提取MFCC特征
mfccs = librosa.feature.mfcc(y=selected_waveform, sr=sr, n_mfcc=13)
# 创建MFCC图
plt.figure(figsize=(12, 4))
librosa.display.specshow(mfccs, x_axis='time')
plt.colorbar()
plt.title('MFCC (Selected Time Range)')
plt.xlabel('Time (s)')
plt.ylabel('MFCC Coefficients')
# 计算频谱图
D = librosa.amplitude_to_db(librosa.stft(selected_waveform), ref=np.max)
# 创建频谱图
plt.figure(figsize=(12, 4))
librosa.display.specshow(D, sr=sr, x_axis='time', y_axis='log')
plt.colorbar(format='%+2.0f dB')
plt.title('Spectrogram (Selected Time Range)')
plt.xlabel('Time (s)')
plt.ylabel('Frequency (Hz)')
# 计算语谱图
S = librosa.feature.melspectrogram(y=selected_waveform, sr=sr)
# 创建语谱图
plt.figure(figsize=(12, 4))
librosa.display.specshow(librosa.power_to_db(S, ref=np.max), sr=sr, x_axis='time', y_axis='mel')
plt.colorbar(format='%+2.0f dB')
plt.title('Mel Spectrogram (Selected Time Range)')
plt.xlabel('Time (s)')
plt.ylabel('Mel Frequency')
plt.tight_layout()
plt.show()