开源音乐分离器Audio Decomposition:可实现盲源音频分离,无需外部乐器分离库,从头开始制作。将音乐转换为五线谱的程序

news2024/11/15 11:00:01

今天给大家分析一个音频分解器,通过傅里叶变换和信封匹配分离音乐中的各个音符和乐器,实现音乐到乐谱的转换。将音乐开源分离为组成乐器。该方式是盲源分离,从头开始制作,无需外部乐器分离库。

相关链接

代码:https://github.com/mbird1258/Audio-Decomposition

演示视频:https://youtu.be/-i0PSxcoDH0

准备

仪器数据

乐器数据全部来自爱荷华大学电子音乐工作室乐器数据库。利用这些文件,我们用下文所述方法找到整个波的傅里叶变换和波的包络。

工作原理

乐器的声波主要由其傅里叶变换和包络线来表征。因此,我们可以利用这两者来很好地了解哪种乐器正在演奏哪个音符。

傅立叶变换

该程序将音乐分解为组成音符和乐器的第一种方法是每 0.1 秒对音乐文件进行一次傅里叶变换(频谱图),并将我们存储的每种乐器的傅里叶变换相加,以重新创建 0.1 秒窗口的傅里叶变换。这个想法是希望在设定的时间内完美地重现音乐,因为傅里叶变换应该能相对好地代表所演奏的音乐。

原始傅里叶变换

原始傅里叶变换

组成文书

组成文书

重新创建傅里叶变换

通过求解以下矩阵可得出每种乐器的幅度。该矩阵是通过对每种乐器的 MSE 成本函数按频率(例如 5 hz 时的 FT 值)求偏导数而得出的。矩阵中的每一行都是不同的偏导数。(第一个是相对于大提琴的,第二个是相对于钢琴的,等等)

信封

将乐器的包络与声波匹配的第一步是获取包络本身。包络是波的上限,虽然有函数可以做到这一点,但它们似乎难以处理噪音和某些类型的声波。因此,由于我们必须处理不同频率的许多不同乐器,我们需要一个更强大的解决方案。

为了获得包络,该函数将声波分成几块,然后取每块的最大值。为了进一步优化结果,该函数找到包络低于原始声波的点,并添加一个定义包络的新点。

下一步是将波的包络分解为起音、延音和释音。起音是音符的初始噪音,延音是音符保持时,释音是音符停止时。对于乐器样本,我们可以取波的第一个非零值来获取起音的开始。要获取起音和延音之间的点,我们获取函数向下凹或减小时的第一个点。要获取延音和释音之间的点,我们获取函数增加或向下凹的末端的第一个点。要获取释音的末端,我们找到函数非零的末端的第一个点。

为了进一步对波进行分类,我们需要考虑波可以采取的主要形式。一些乐器,例如钢琴,具有静态衰减,其中它们大多遵循指数衰减形状。另一方面,一些乐器,例如小提琴,可以随着音符的持续而增加或减少音量。除此之外,乐器文件中的一些音频样本会保留到声音结束,而其他音频样本则会提前释放。为了区分衰减是静态的还是动态的,如果衰减因子> 1,或者它偏离衰减曲线太多,则为动态的。为了区分包络是否有释放(AS或ASR),我们查看维持和释放的平均变化率,如果释放的变化率较低,则没有释放。

为了处理音乐文件,我们首先对每个音符频率的信号进行带通滤波。使用滤波后的波,我们迭代每个乐器。对于每种乐器,我们利用乐器的起音(标准化)和释放(标准化)的互相关来找到每个音符的开始和结束,然后利用乐器波和滤波后的音频的 MSE 来获得当时乐器的成本。之后,我们将在傅立叶变换步骤中找到的幅度乘以 1/(我们在此步骤中找到的成本)以获得最终的幅度。

展示 为了显示文件,我们使用 matplotlib 的散点图和 - 形点来显示乐谱。最初,我想根据幅度重新创建音频,但这导致了许多问题,花费了一段时间,并使故障排除变得更加困难。我也尝试使用 matplotlib 的 imshow 图,但在这种情况下效率极低,因为大多数值都是 0,并且每次我们平移或缩放屏幕时,matplotlib 都需要重新绘制每个点,无论它是否在屏幕上。

结果

总体效果很好。你可以用它来更好地重现乐谱,特别是当你很难找到正确的音高或和弦时,而且它运行起来也不会花费太多时间。

如何运行项目

  1. 从GitHub下载后分别运行 ScrapeInstruments.py 和 ProcessInstruments.py 一次 InstrumentAudioFiles 和 InstrumentData 现在应该被填充

  2. 将 soundfile.read() 可以处理的文件类型上传到 In 文件夹

  3. 进入 Main.py 并更改任何参数,主要是歌曲的乐器白名单或黑名单。

  4. 运行 Main.py PlayBack 现在应该为每个输入都有一个文件

  5. 运行Display.py查看结果!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2240788.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

35.3K+ Star!PhotoPrism:一款基于AI的开源照片管理工具

PhotoPrism 简介 PhotoPrism[1] 是一个为去中心化网络设计的AI照片应用,它利用最新技术自动标记和查找图片,实现自动图像分类与本地化部署,你可以在家中、私有服务器或云端运行它。 项目特点 主要特点 浏览所有照片和视频,无需担心RAW转换、重复项或视频格式。 使用强大的…

基于Spider异步爬虫框架+JS动态参数逆向+隧道代理+自定义中间件的猎聘招聘数据爬取

在本篇博客中,我们将介绍如何使用 Scrapy 框架结合 JS 逆向技术、代理服务器和自定义中间件,来爬取猎聘网站的招聘数据。猎聘是一个国内知名的招聘平台,提供了大量的企业招聘信息和职位信息。本项目的目标是抓取指定城市的招聘信息&#xff0…

计算机网络 (2)计算机网络的类别

计算机网络的类别繁多,根据不同的分类原则,可以得到各种不同类型的计算机网络。 一、按覆盖范围分类 局域网(LAN): 定义:局域网是一种在小区域内使用的,由多台计算机组成的网络。覆盖范围&#…

超好用shell脚本NuShell mac安装

利用管道控制任意系统 Nu 可以在 Linux、macOS 和 Windows 上运行。一次学习,处处可用。 一切皆数据 Nu 管道使用结构化数据,你可以用同样的方式安全地选择,过滤和排序。停止解析字符串,开始解决问题。 强大的插件系统 具备强…

【C#设计模式(9)——组合模式(Component Pattern)】

前言 组合模型是将对象组合成树形结构以表示“整体-部分”的层次结构,使客户终端代码更加简洁和灵活。 代码 //目录抽象类 public abstract class Directory {protected string _name;public Directory(string name){_name name;}public abstract void Show(); } …

Ubuntu下Xshell连接腾讯云服务器

1.在腾讯云上买好服务器后,找到控制台,找到自己的服务器重置密码,默认用户名时ubuntu 2.在Xshell连接服务器 然后出现一个秘钥接受,直接接受就好了,然后就出现下面 然后就可以了 查看当前登录的用户 whoami 查看当前服…

初识算法 · 位运算(3)

目录 前言: 两整数之和 题目解析 算法原理 算法编写 只出现一次的数字II 题目解析 算法原理 算法编写 前言: ​本文的主题是位运算,通过两道题目讲解,一道是只出现一次的数字II,一道是两整数之和。 链接分别…

微信小程序——01开发前的准备和开发工具

文章目录 一、开发前的准备1注册小程序账号2安装开发者工具 二、开发者工具的使用1创建项目2 工具的使用3目录结构4各个页面之间的关系5 权限管理6提交审核和发布 一、开发前的准备 开发前需要进行以下准备: 1 注册小程序账号2激活邮箱3 信息登记4 登录小程序管理后…

使用热冻结数据层生命周期优化在 Elastic Cloud 中存储日志的成本

作者:来自 Elastic Jonathan Simon 收集数据对于可观察性和安全性至关重要,而确保数据能够快速搜索且获得低延迟结果对于有效管理和保护应用程序和基础设施至关重要。但是,存储所有这些数据会产生持续的存储成本,这为节省成本创造…

记录配置ubuntu18.04下运行ORBSLAM3的ros接口的过程及执行单目imu模式遇到的问题(详细说明防止忘记)

今天的工作需要自己录制的数据集来验证昨天的标定结果 用ORBSLAM3单目imu模式运行,mentor给的是一个rosbag格式的数据包,配置过程出了几个问题记录一下,沿配置流程写。 一.orbslam3编译安装 1.首先是安装各种依赖 这里不再赘述&#xff0…

vue2项目启用tailwindcss - 开启class=“w-[190px] mr-[20px]“ - 修复tailwindcss无效的问题

效果图 步骤 停止编译"npm run dev"安装依赖 npm install -D tailwindcssnpm:tailwindcss/postcss7-compat postcss^7 autoprefixer^9 创建文件/src/assets/tailwindcss.css,写入内容: tailwind base; tailwind components; tailwind utiliti…

实施工程师简历「精选篇」

【#实施工程师简历#】一份出色的实施工程师简历,是获得优质工作机会的重要跳板。那么,如何打造一份令人眼前一亮的实施工程师简历呢?以下是幻主简历网整理的实施工程师简历「精选篇」,欢迎大家阅读收藏! 实施工程师简历…

Linux篇(权限管理命令)

目录 一、权限概述 1. 什么是权限 2. 为什么要设置权限 3. Linux中的权限类别 4. Linux中文件所有者 4.1. 所有者分类 4.2. 所有者的表示方法 属主权限 属组权限 其他权限 root用户(超级管理员) 二、普通权限管理 1. ls查看文件权限 2. 文件…

惊爆!72.1K star 的 Netdata:实时监控与可视化的超炫神器!

在当今复杂的 IT 环境中,实时监控与可视化对于保障系统的稳定运行和性能优化至关重要。 无论是服务器、应用程序,还是网络设备,及时获取性能数据能够帮助我们快速定位问题、优化资源配置。 Netdata,作为一个开源的实时监控工具&a…

姓名改成商标名称,李子柒已成身份证名字!

近日李子柒紫气东来,以中国非物质文化遗产“漆器”生动地展现了中国漆器的独特美学和工艺之美,这条视频在微博已超过1.3亿观看,在国外视频平台订阅超二千万粉丝成海外中文创作第一人。 李子柒原名李佳佳,在网上看到她已经正式将身…

论云游戏的性能与性价比,ToDesk、青椒云、顺网云游戏等具体实操看这篇就够了

文章目录 一、前言二、云电脑产品基础介绍2.1 ToDesk云电脑2.1.1 ToDesk云电脑硬件参数2.1.2 ToDesk云电脑鲁大师跑分2.1.3 ToDesk云电脑收费方式2.1.4 ToDesk云电脑特色功能 2.2 青椒云2.2.1 青椒云游戏娱乐硬件配置2.2.2 青椒云云电脑鲁大师跑分2.2.3 青椒云收费方式2.2.4 青…

服务器数据恢复——Ext4文件系统使用fsck后mount不上的数据恢复案例

关于Ext4文件系统的几个概念: 块组:Ext4文件系统的全部空间被划分为若干个块组,每个块组结构基本上相同。 块组描述符表:每个块组都对应一个块组描述符,这些块组描述符统一放在文件系统的前部,称为块组描述…

ubuntu 下mosquitto TLS配置

1、/etc/mosquitto/mosquitto.conf文件配置 persistence true persistence_location /var/lib/mosquitto/ log_dest file /var/log/mosquitto/mosquitto.log include_dir /etc/mosquitto/conf.d listener 1883 listener 8883 0.0.0.0 password_file /etc/mosquitto/pwfile cert…

隧道论文阅读2-采用无人融合扫描数据的基于深度学习的垂直型隧道三维数字损伤图

目前存在的问题: 需要开发新的无人测量系统测量垂直隧道图像数据量巨大,基于深度学习完成损伤评估跟踪获取图像位置的困难,对大型基础设施感兴趣区域(roi)的2d和3d地图建立进行了研究,对整个目标结构的损伤定位仍然具有挑战性。为…

【C++动态规划 最长公共子序列】1035. 不相交的线|1805

本文涉及知识点 C动态规划 LeetCode1035. 不相交的线 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线,这些直线需要同时满足: nums1[i] nums2[j] 且绘制的…