python对wav音频可视化


前言

本文主要是使用代码实现音频文件(wav)的多种可视化。
1.信号
2.傅里叶变换
3.Mel(梅尔)谱图
4.log_Mel谱图


提示:以下是本篇文章正文内容,下面案例可供参考

一、导入包以及音频文件

为了便于展示,我将信号和傅里叶变换使用plt组合在一起进行展示。

import matplotlib.pyplot as plt
import librosa
import librosa.display
import numpy as np
import sys


# 读取音频wav文件
audio_path = r"D:\PycharmProjects\testwav\test01.wav"
y, sr = librosa.load(audio_path, sr=None, mono=True)
"""
:param
    path	音频路径
    sr	采样率(默认22050,但是有重采样的功能)
    mono	设置为true是单通道,否则是双通道
    offset	音频读取的时间
    duration	获取音频的时长

:returns
    y : 音频的信号值,类型是ndarray
    sr : 采样率
"""
###############################################################################

结果展示:

二、信号+傅里叶变换

为了便于展示,我将信号和傅里叶变换使用plt组合在一起进行展示。

import matplotlib.pyplot as plt
import librosa
import librosa.display
import numpy as np
import sys


# 读取音频wav文件
audio_path = r"D:\PycharmProjects\testwav\test01.wav"
y, sr = librosa.load(audio_path, sr=None, mono=True)
"""
:param
    path	音频路径
    sr	采样率(默认22050,但是有重采样的功能)
    mono	设置为true是单通道,否则是双通道
    offset	音频读取的时间
    duration	获取音频的时长

:returns
    y : 音频的信号值,类型是ndarray
    sr : 采样率
"""
###############################################################################

###############################################################################
# plt画图
f, ((ax11, ax12)) = plt.subplots(1, 2, sharex=False, sharey=False)
###################################################################
# 01 左,信号
ax11.set_title('Signal')
ax11.set_xlabel('Time (samples)')
ax11.set_ylabel('Amplitude')
ax11.plot(y)
###################################################################
# 02 右,傅里叶变换
n_fft = 2048
ft = np.abs(librosa.stft(y[:n_fft], hop_length=n_fft+1))
ax12.set_title('Spectrum')
ax12.set_xlabel('Frequency Bin')
# ax12.set_ylabel('Amplitude')
ax12.plot(ft)
################################################################################

plt.show()

结果展示:
在这里插入图片描述


三、Mel谱图

代码如下(示例):

import matplotlib.pyplot as plt
import librosa
import librosa.display
import numpy as np
import sys


# 读取音频wav文件
audio_path = r"D:\PycharmProjects\testwav\test01.wav"
y, sr = librosa.load(audio_path, sr=None, mono=True)
"""
:param
    path	音频路径
    sr	采样率(默认22050,但是有重采样的功能)
    mono	设置为true是单通道,否则是双通道
    offset	音频读取的时间
    duration	获取音频的时长

:returns
    y : 音频的信号值,类型是ndarray
    sr : 采样率
"""
###############################################################################

################################################################################
# 03 使用librosa获取mel谱图
n_mels = 64
n_frames = 5
n_fft = 1024
hop_length = 512
power = 2.0

mel_spectrogram = librosa.feature.melspectrogram(y=y,
                                                 sr=sr,
                                                 n_fft=n_fft,
                                                 hop_length=hop_length,
                                                 n_mels=n_mels,
                                                 power=power)
librosa.display.specshow(librosa.power_to_db(mel_spectrogram, ref=np.max),
                         y_axis='mel', fmax=8000, x_axis='time')
plt.colorbar(format='%+2.0f dB')
##################################################################################

plt.show()

结果展示:
在这里插入图片描述


四、Log_Mel谱图

代码如下(示例):

import matplotlib.pyplot as plt
import librosa
import librosa.display
import numpy as np
import sys


# 读取音频wav文件
audio_path = r"D:\PycharmProjects\testwav\test01.wav"
y, sr = librosa.load(audio_path, sr=None, mono=True)
"""
:param
    path	音频路径
    sr	采样率(默认22050,但是有重采样的功能)
    mono	设置为true是单通道,否则是双通道
    offset	音频读取的时间
    duration	获取音频的时长

:returns
    y : 音频的信号值,类型是ndarray
    sr : 采样率
"""
###############################################################################

################################################################################
# 03 使用librosa获取mel谱图
n_mels = 64
n_frames = 5
n_fft = 1024
hop_length = 512
power = 2.0

mel_spectrogram = librosa.feature.melspectrogram(y=y,
                                                 sr=sr,
                                                 n_fft=n_fft,
                                                 hop_length=hop_length,
                                                 n_mels=n_mels,
                                                 power=power)

# librosa.display.specshow(librosa.power_to_db(mel_spectrogram, ref=np.max),
#                          y_axis='mel', fmax=8000, x_axis='time')
# plt.colorbar(format='%+2.0f dB')
##################################################################################

# 04 将mel谱图转换为log mel谱图
log_mel_spectrogram = 20.0 / power * np.log10(np.maximum(mel_spectrogram, sys.float_info.epsilon))
librosa.display.specshow(librosa.power_to_db(log_mel_spectrogram, ref=np.max),
                         y_axis='mel', fmax=8000, x_axis='time')
# plt.colorbar(format='%+2.0f dB')
##################################################################################

plt.show()

结果展示:
在这里插入图片描述


总结

本文主要是将wav文件进行可视化,并没有对原理进行说明。

  • 15
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
要创建一个wav可视化音频播放器,你需要了解以下几个步骤: 1. 使用Python中的wave模块读取wav文件。 2. 使用Python中的PyAudio模块播放wav文件。 3. 使用Python中的matplotlib模块绘制wav文件的可视化波形图。 下面是一个示例代码: ```python import wave import pyaudio import numpy as np import matplotlib.pyplot as plt # 读取wav文件 def read_wav_file(filename): with wave.open(filename, 'rb') as wav_file: sample_rate = wav_file.getframerate() num_channels = wav_file.getnchannels() num_samples = wav_file.getnframes() data = wav_file.readframes(num_samples) return sample_rate, num_channels, num_samples, data # 播放wav文件 def play_wav_file(filename): sample_rate, num_channels, num_samples, data = read_wav_file(filename) p = pyaudio.PyAudio() stream = p.open(format=p.get_format_from_width(2), channels=num_channels, rate=sample_rate, output=True) stream.write(data) stream.close() p.terminate() # 绘制wav文件的可视化波形图 def plot_wav_file(filename): sample_rate, num_channels, num_samples, data = read_wav_file(filename) data = np.frombuffer(data, dtype=np.int16) duration = num_samples / sample_rate time = np.linspace(0, duration, num_samples) plt.plot(time, data) plt.xlabel('Time (s)') plt.ylabel('Amplitude') plt.show() # 测试 if __name__ == '__main__': filename = 'test.wav' play_wav_file(filename) plot_wav_file(filename) ``` 你可以将文件名替换为你想要播放和可视化wav文件的文件名,然后运行代码来测试。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘丶小歪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值