用用python实现音乐可视化实现音乐可视化
用用python就是库多,这么多的库,你的什么需求,都有轮子用啊就是库多,这么多的库,你的什么需求,都有轮子用啊
今天分享一个音乐可视化的程序,什么是音乐可视化,就像下面这样
没错,就是这个东西,这个似乎有一个名词来称呼的吧,什么名词呢想不到了,就叫她音乐可视化吧。
基本思路是这样,这个东西应该就是音乐中不同频率的分布情况,那么如何得到一首歌的频率分布情况呢,能想到的就是傅里
叶变换了,由时域得到频域,然后再用matplotlib库把频域的信息实时更新到画面上。思路就是这么个思路,卧槽那应该如何
实现啊,什么傅里叶,什么时域频域,这似乎很麻烦,还好,谁让python有那么多库可以用呢,快速认识一个库,那就找找有
没有其他人的实现案例,现成的用起来(这次实现参考的这篇博客的实现方法他实现了很多样式的可视化展示,我拿了其中两
个样式来用)
导入库
import numpy as np
import pyaudio
from pydub import AudioSegment, effects
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
首先是音乐读取的部分,这里注意将你的音乐转换成wav格式,MP3我试了下不行
p = pyaudio.PyAudio()
sound = AudioSegment.from_file(file='Free-Converter.com-a1-86040504.wav')
left = sound.split_to_mono()[0] fs = left.frame_rate
size = len(left.get_array_of_samples())
channels = left.channels
stream = p.open(
format=p.get_format_from_width(left.sample_width, ),
channels=channels,
rate=fs,
# input=True,
output=True,
)
stream.start_stream()
然后是初始化视图
fig = plt.figure()
ax1 = fig.subplots()
ax1.set_ylim(0, 2)
ax1.set_axis_off()
window = int(0.02 * fs) # 20ms
g_windows = window // 8
f = np.linspace(20, 20 * 1000, g_windows)
t = np.linspace(0, 20, window)
lf1, = ax1.plot(f, np.zeros(g_windows), lw=1)
lf1.set_antialiased(True)
然后是定义一个视图的更新函数
color_grade = ['black','blue','yellow','red'] def update(frames):
if stream.is_active():
slice = left.get_sample_slice(frames, frames + window)
data = slice.raw_data
stream.write(data)
y = np.array(slice.get_array_of_samples()) / 30000 # 归一化