黎曼猜想的音乐:Python 中的声音生成
本帖最后由 nettman 于 2023-7-3 21:09 编辑不久前,我发表了一篇题为《数据发出的声音》的文章。目标是将数据(在本例中为随机噪声)转化为音乐。希望通过“聆听”您的数据,您可以获得不同类型的见解,而不是通过可视化或表格摘要传达的见解。
本文对这个主题进行了更深入的探讨。首先,我将说明如何将黎曼猜想的核心黎曼 zeta 函数转化为音乐。它介绍了科学编程、MPmath 库和 Python 中的复数代数。当然,这适用于任何其他数学函数。然后我解释如何在实际数据上使用该方法,创建数据音轨和数据视频,并将两者结合起来。
数据可听化的好处
数据可视化提供颜色和形状,使您可以在一张图片中总结多个维度。数据动画(视频)更进一步,添加了时间维度。您可以在我的 YouTube 频道上找到很多内容。请参阅此处的示例。然后,声音随着时间的推移增加了多个维度:振幅、音量和频率。产生悦耳的声音,每个音符代表一个多元数据点,相当于数据分箱或桶化。
立体声和多种乐器(合成的)的使用增加了更多的维度。一旦你拥有了一个大型的音乐数据数据库,你就可以将它用于生成人工智能:声音生成来模仿现有的数据集。当然,音乐人工智能艺术是另一种应用,一直到制作合成电影。
执行
数据声音化是我在这里提供的 GenAI 认证计划参与者的项目之一。在本文的其余部分中,我将描述各个步骤:
[*]创建音阶(音符)
[*]创建和转换数据
[*]绘制声波
[*]制作音轨
我还在最后一节中提供了输出声音文件,供您聆听并与同事分享。
音符
导入之后的第一步包括创建音阶:简而言之,就是音符。如果您想创作优美的旋律,就需要它。如果没有它,声音就会感觉像噪音。
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from scipy.io import wavfile
import mpmath
#-- Create the list of musical notes
scale=[]
for k in range(35, 65):
note=440*2**((k-49)/12)
if k%12 != 0 and k%12 != 2 and k%12 != 5 and k%12 != 7 and k%12 != 10:
scale.append(note) # add musical note (skip half tones)
n_notes = len(scale) # number of musical notes
数据生产与转换
第二步生成数据,并通过重新缩放对其进行转换,以便可以轻松地将其转换为音乐。在这里,我使用 Dirichlet eta 函数(黎曼 zeta 函数的姐妹函数)的采样值作为输入数据。但您可以使用任何真实数据。我将多变量数据转换为按时间索引的 3 个特征:频率(音调)、音量(也称为振幅)以及与数据对应的 300 个音符中每个音符的持续时间。Real 和 Imag 分别是复数的实部和虚部。
#-- Generate the data
n = 300
sigma = 0.5
min_t = 400000
max_t = 400020
def create_data(f, nobs, min_t, max_t, sigma):
z_real = []
z_imag = []
z_modulus = []
incr_t = (max_t - min_t) / nobs
for t in np.arange(min_t, max_t, incr_t):
if f == 'Zeta':
z = mpmath.zeta(complex(sigma, t))
elif f == 'Eta':
z = mpmath.altzeta(complex(sigma, t))
z_real.append(float(z.real))
z_imag.append(float(z.imag))
modulus = np.sqrt(z.real*z.real + z.imag*z.imag)
z_modulus.append(float(modulus))
return(z_real, z_imag, z_modulus)
(z_real, z_imag, z_modulus) = create_data('Eta', n, min_t, max_t, sigma)
size = len(z_real) # should be identical to nobs
x = np.arange(size)
# frequency of each note
y = z_real
min = np.min(y)
max = np.max(y)
yf = 0.999*n_notes*(y-min)/(max-min)
# duration of each note
z = z_imag
min = np.min(z)
max = np.max(z)
zf = 0.1 + 0.4*(z-min)/(max-min)
# volume of each note
v = z_modulus
min = np.min(v)
max = np.max(v)
vf = 500 + 2000*(1 - (v-min)/(max-min))
绘制声波
下一步将每个音符所附加的 3 个值绘制为 3 个时间序列。
#-- plot data
mpl.rcParams['axes.linewidth'] = 0.3
fig, ax = plt.subplots()
ax.tick_params(axis='x', labelsize=7)
ax.tick_params(axis='y', labelsize=7)
plt.rcParams['axes.linewidth'] = 0.1
plt.plot(x, y, color='red', linewidth = 0.3)
plt.plot(x, z, color='blue', linewidth = 0.3)
plt.plot(x, v, color='green', linewidth = 0.3)
plt.legend(['frequency','duration','volume'], fontsize="7",
loc ="upper center", ncol=3)
plt.show()
制作音轨
每个波浪对应一个音符。您可以使用 Scipy 库中的 wavfile.write 函数将串联的波形转换为 wav 文件。除此之外,这里没有涉及任何特殊的声音库!很难让它变得更容易。
#-- Turn the data into music
def get_sine_wave(frequency, duration, sample_rate=44100, amplitude=4096):
t = np.linspace(0, duration, int(sample_rate*duration))
wave = amplitude*np.sin(2*np.pi*frequency*t)
return wave
wave=[]
for t in x: # loop over dataset observations, create one note per observation
note = int(yf)
duration = zf
frequency = scale
volume = vf## 2048
new_wave = get_sine_wave(frequency, duration = zf, amplitude = vf)
wave = np.concatenate((wave,new_wave))
wavfile.write('sound.wav', rate=44100, data=wave.astype(np.int16))
结果
详细介绍该项目的技术文档可在此处找到。它包括有关如何将音频文件(如下所示)添加到数据视频的其他详细信息,以及测试数据集(来自现实生活)以转换为声音。也许向视频添加音频的最简单方法是将 wav 文件转换为 mp4 格式,然后使用 Moviepy 库将两者结合起来。要聆听生成的音乐,请单击下面框中的箭头。
下图显示了重新缩放之前 wav 文件中 300 个音符的频率、持续时间和音量。每次黎曼 zeta 函数在临界线上达到零时,体积就达到最大。这是与黎曼猜想的联系之一。
-----------我的底线--------------
中文版ChatGPT
https://xing.aboutyun.com/
加微信领取Chat GPT教程:
1.一份超值的教程,让你成为职场“大佬”,轻松掌握ChatGPT技能
ChatGPT教程1:如何用ChatGPT自动化操作Excel,十倍提升你的工作效率
ChatGPT教程2:如何让ChatGPT帮你做专业又美观的PPT,人工智能神器ChatGPT高效办公系列2023最新教学
ChatGPT教程3:如何利用ChatGPT免费高效自学编程,再也不用担心学不会编程了!
ChatGPT教程4:2023普通人ChatGPT副业赚钱项目
ChatGPT教程5:ChatGPT全方位必修课 报告 论文
绘图教程6:AI绘图最新Midjourney v5.1 + Raw Mode
绘图教程7:深入实作教学 Midjourney niji journey ChatGPT v5
绘图教程8:最新Midjourney v5 + ChatGPT 咒语生成Prompt Generator
2.领取最新面试教程
1.具备哪些特征,你几乎拿不到任何offer
2.如何避免简历被一眼淘汰:十大致命特征揭秘
https://www.aboutyun.com/data/attachment/forum/201912/26/080948j470n3tgw4h0p7kp.jpg
获取更多资源:
领取100本书+1T资源
http://www.aboutyun.com/forum.php?mod=viewthread&tid=26480
大数据5个项目视频
http://www.aboutyun.com/forum.php?mod=viewthread&tid=25235
名企资源、名企面试题、最新BAT面试题、专题面试题等资源汇总
https://www.aboutyun.com/forum.php?mod=viewthread&tid=27732
页:
[1]