分享

黎曼猜想的音乐:Python 中的声音生成

本帖最后由 nettman 于 2023-7-3 21:09 编辑


不久前,我发表了一篇题为《数据发出的声音》的文章。目标是将数据(在本例中为随机噪声)转化为音乐。希望通过“聆听”您的数据,您可以获得不同类型的见解,而不是通过可视化或表格摘要传达的见解。

本文对这个主题进行了更深入的探讨。首先,我将说明如何将黎曼猜想的核心黎曼 zeta 函数转化为音乐。它介绍了科学编程、MPmath 库和 Python 中的复数代数。当然,这适用于任何其他数学函数。然后我解释如何在实际数据上使用该方法,创建数据音轨和数据视频,并将两者结合起来。

数据可听化的好处
数据可视化提供颜色和形状,使您可以在一张图片中总结多个维度。数据动画(视频)更进一步,添加了时间维度。您可以在我的 YouTube 频道上找到很多内容。请参阅此处的示例。然后,声音随着时间的推移增加了多个维度:振幅、音量和频率。产生悦耳的声音,每个音符代表一个多元数据点,相当于数据分箱或桶化。

立体声和多种乐器(合成的)的使用增加了更多的维度。一旦你拥有了一个大型的音乐数据数据库,你就可以将它用于生成人工智能:声音生成来模仿现有的数据集。当然,音乐人工智能艺术是另一种应用,一直到制作合成电影。

执行
数据声音化是我在这里提供的 GenAI 认证计划参与者的项目之一。在本文的其余部分中,我将描述各个步骤:

  • 创建音阶(音符)
  • 创建和转换数据
  • 绘制声波
  • 制作音轨

我还在最后一节中提供了输出声音文件,供您聆听并与同事分享。

音符
导入之后的第一步包括创建音阶:简而言之,就是音符。如果您想创作优美的旋律,就需要它。如果没有它,声音就会感觉像噪音。
  1. import numpy as np
  2. import matplotlib as mpl
  3. import matplotlib.pyplot as plt
  4. from scipy.io import wavfile
  5. import mpmath
  6. #-- Create the list of musical notes
  7. scale=[]
  8. for k in range(35, 65):
  9.     note=440*2**((k-49)/12)
  10.     if k%12 != 0 and k%12 != 2 and k%12 != 5 and k%12 != 7 and k%12 != 10:
  11.         scale.append(note) # add musical note (skip half tones)
  12. n_notes = len(scale) # number of musical notes
复制代码



数据生产与转换
第二步生成数据,并通过重新缩放对其进行转换,以便可以轻松地将其转换为音乐。在这里,我使用 Dirichlet eta 函数(黎曼 zeta 函数的姐妹函数)的采样值作为输入数据。但您可以使用任何真实数据。我将多变量数据转换为按时间索引的 3 个特征:频率(音调)、音量(也称为振幅)以及与数据对应的 300 个音符中每个音符的持续时间。Real 和 Imag 分别是复数的实部和虚部。
  1. #-- Generate the data
  2. n = 300
  3. sigma = 0.5
  4. min_t = 400000
  5. max_t = 400020
  6. def create_data(f, nobs, min_t, max_t, sigma):
  7.     z_real = []
  8.     z_imag = []
  9.     z_modulus = []
  10.     incr_t = (max_t - min_t) / nobs
  11.     for t in np.arange(min_t, max_t, incr_t):   
  12.         if f == 'Zeta':
  13.             z = mpmath.zeta(complex(sigma, t))
  14.         elif f == 'Eta':
  15.             z = mpmath.altzeta(complex(sigma, t))
  16.         z_real.append(float(z.real))
  17.         z_imag.append(float(z.imag))
  18.         modulus = np.sqrt(z.real*z.real + z.imag*z.imag)
  19.         z_modulus.append(float(modulus))
  20.     return(z_real, z_imag, z_modulus)
  21. (z_real, z_imag, z_modulus) = create_data('Eta', n, min_t, max_t, sigma)
  22. size = len(z_real) # should be identical to nobs
  23. x = np.arange(size)
  24. # frequency of each note     
  25. y = z_real   
  26. min = np.min(y)
  27. max = np.max(y)
  28. yf = 0.999*n_notes*(y-min)/(max-min)
  29. # duration of each note
  30. z = z_imag  
  31. min = np.min(z)
  32. max = np.max(z)
  33. zf = 0.1 + 0.4*(z-min)/(max-min)
  34. # volume of each note
  35. v = z_modulus
  36. min = np.min(v)
  37. max = np.max(v)
  38. vf = 500 + 2000*(1 - (v-min)/(max-min))
复制代码



绘制声波
下一步将每个音符所附加的 3 个值绘制为 3 个时间序列。

  1. #-- plot data
  2. mpl.rcParams['axes.linewidth'] = 0.3
  3. fig, ax = plt.subplots()
  4. ax.tick_params(axis='x', labelsize=7)
  5. ax.tick_params(axis='y', labelsize=7)
  6. plt.rcParams['axes.linewidth'] = 0.1
  7. plt.plot(x, y, color='red', linewidth = 0.3)
  8. plt.plot(x, z, color='blue', linewidth = 0.3)
  9. plt.plot(x, v, color='green', linewidth = 0.3)
  10. plt.legend(['frequency','duration','volume'], fontsize="7",
  11.     loc ="upper center", ncol=3)
  12. plt.show()
复制代码



制作音轨
每个波浪对应一个音符。您可以使用 Scipy 库中的 wavfile.write 函数将串联的波形转换为 wav 文件。除此之外,这里没有涉及任何特殊的声音库!很难让它变得更容易。

  1. #-- Turn the data into music
  2. def get_sine_wave(frequency, duration, sample_rate=44100, amplitude=4096):
  3.     t = np.linspace(0, duration, int(sample_rate*duration))
  4.     wave = amplitude*np.sin(2*np.pi*frequency*t)
  5.     return wave
  6. wave=[]
  7. for t in x: # loop over dataset observations, create one note per observation
  8.     note = int(yf[t])
  9.     duration = zf[t]
  10.     frequency = scale[note]   
  11.     volume = vf[t]  ## 2048
  12.     new_wave = get_sine_wave(frequency, duration = zf[t], amplitude = vf[t])
  13.     wave = np.concatenate((wave,new_wave))
  14. wavfile.write('sound.wav', rate=44100, data=wave.astype(np.int16))
复制代码


结果
详细介绍该项目的技术文档可在此处找到。它包括有关如何将音频文件(如下所示)添加到数据视频的其他详细信息,以及测试数据集(来自现实生活)以转换为声音。也许向视频添加音频的最简单方法是将 wav 文件转换为 mp4 格式,然后使用 Moviepy 库将两者结合起来。要聆听生成的音乐,请单击下面框中的箭头。

下图显示了重新缩放之前 wav 文件中 300 个音符的频率、持续时间和音量。每次黎曼 zeta 函数在临界线上达到零时,体积就达到最大。这是与黎曼猜想的联系之一。

1.png


-----------我的底线--------------
中文版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.如何避免简历被一眼淘汰:十大致命特征揭秘




获取更多资源:
领取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


加微信w3aboutyun,可拉入技术爱好者群

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条