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

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

相关链接

代码: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查看结果!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微服务day10-Redis面试篇

Redis主从 搭建主从集群 建立集群时主节点会生成同一的replicationID,交给各个从节点。 集群中的缓冲区是一个环型数组,即若从节点宕机时间过长,可能导致命令被覆盖。 主从集群优化 哨兵原理 哨兵是一个集群来确保哨兵不出现问题。 服务状态监控 选举…

交换排序——快速排序

交换排序——快速排序 7.7 交换排序——快速排序快速排序概念c语言的库函数qsort快速排序框架quickSort 7.7 交换排序——快速排序 快速排序概念 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法(下文简称快排),其基本思想为&a…

预处理(1)(手绘)

大家好,今天给大家分享一下编译器预处理阶段,那么我们来看看。 上面是一些预处理阶段的知识,那么明天给大家讲讲宏吧。 今天分享就到这里,谢谢大家!!

自动驾驶系列—深入解析自动驾驶车联网技术及其应用场景

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

华为路由策略配置

一、AS_Path过滤 要求: AR1与AR2、AR2与AR3之间建立EBGP连接 AS10的设备和AS30的设备无法相互通信 1.启动设备 2.配置IP地址 3.配置路由器的EBGP对等体连接,引入直连路由 [AR1]bgp 10 [AR1-bgp]router-id 1.1.1.1 [AR1-bgp]peer 200.1.2.2 as-nu…

深度学习中的Pixel Shuffle和Pixel Unshuffle:图像超分辨率的秘密武器

在深度学习的计算机视觉任务中,提升图像分辨率和压缩特征图是重要需求。Pixel Shuffle和Pixel Unshuffle是在超分辨率、图像生成等任务中常用的操作,能够通过转换空间维度和通道维度来优化图像特征表示。本篇文章将深入介绍这两种操作的原理,…

React--》如何高效管理前端环境变量:开发与生产环境配置详解

在前端开发中,如何让项目在不同环境下表现得更为灵活与高效,是每个开发者必须面对的挑战,从开发阶段的调试到生产环境的优化,环境变量配置无疑是其中的关键。 env配置文件:通常用于管理项目的环境变量,环境…

HuggingFace:基于YOLOv8的人脸检测模型

个人操作经验总结 1、YOLO的环境配置 github 不论base环境版本如何,建议在conda的虚拟环境中安装 1.1、创建虚拟环境 conda create -n yolov8-face python3.9conda create :创建conda虚拟环境, -n :给虚拟环境命名的…

基于Python的仓库管理系统设计与实现

背景: 基于Python的仓库管理系统功能介绍 本仓库管理系统采用Python语言开发,利用Django框架和MySQL数据库,实现了高效、便捷的仓库管理功能。 用户管理: 支持员工和管理员角色的管理。 用户注册、登录和权限分配功能&#x…

当 docker-compose.yaml 文件部署时,Dify 线上版本升级过程

如果线上 Dify 是通过 docker-compose.yaml 文件部署的,那么当 Dify 版本升级时该如何操作呢?官方已经给出了 Docker compose 和 Source Code 两种方式。相对而言,前者更简单些,至少不需要安装依赖包和迁移数据库文件。为了更加具…

【H3C华三 】VRRP与BFD、Track联动配置案例

原创 厦门微思网络 组网需求 如图1所示,区域A和区域B用户所在网络的出口处部署了两台汇聚层设备(Device A和Device B)。 现要求使用VRRP与BFD、Track联动功能,实现以下需求: • 在Device A和Device B上分别配置两个…

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

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

【汇编】c++游戏开发

由一起学编程创作的‘C/C项目实战:2D射击游戏开发(简易版), 440 行源码分享来啦~’: C/C项目实战:2D射击游戏开发(简易版), 440 行源码分享来啦~_射击c-CSDN博客文章浏览…

Vue Canvas实现区域拉框选择

canvas.vue组件 <template><div class"all" ref"divideBox"><!-- 显示图片&#xff0c;如果 imgUrl 存在则显示 --><img id"img" v-if"imgUrl" :src"imgUrl" oncontextmenu"return false" …

JavaWeb--MySQL

1. MySQL概述 首先来了解一下什么是数据库。 数据库&#xff1a;英文为 DataBase&#xff0c;简称DB&#xff0c;它是存储和管理数据的仓库。 像我们日常访问的电商网站京东&#xff0c;企业内部的管理系统OA、ERP、CRM这类的系统&#xff0c;以及大家每天都会刷的头条、抖音…

在MATLAB中导入TXT文件的若干方法

这是一篇关于如何在MATLAB中导入TXT文件的文章&#xff0c;包括示例代码和详细说明 文章目录 在MATLAB中导入TXT文件1. 使用readtable函数导入TXT文件示例代码说明 2. 使用load函数导入TXT文件示例代码说明 3. 使用importdata函数导入TXT文件示例代码说明 4. 自定义导入选项示例…

Clonezilla 再生龙制作系统U盘还原系统 ubuntu 22.04 server

参考 Clonezilla 再生龙制作系统U盘还原系统(UltraISO) https://blog.csdn.net/qq_57172130/article/details/120417522 Clonezilla-备份_部署ubuntu https://blog.csdn.net/xiaokai1999/article/details/131054826 基于再生龙&#xff08;clonezilla&#xff09;的Ubuntu镜…

号卡分销系统,号卡系统,物联网卡系统源码安装教程

号卡分销系统&#xff0c;号卡系统&#xff0c;物联网卡系统&#xff0c;&#xff0c;实现的高性能(PHP协程、PHP微服务)、高灵活性、前后端分离(后台)&#xff0c;PHP 持久化框架&#xff0c;助力管理系统敏捷开发&#xff0c;长期持续更新中。 主要特性 基于Auth验证的权限…

Nature Communications 基于触觉手套的深度学习驱动视触觉动态重建方案

在人形机器人操作领域&#xff0c;有一个极具价值的问题&#xff1a;鉴于操作数据在人形操作技能学习中的重要性&#xff0c;如何有效地从现实世界中获取操作数据的完整状态&#xff1f;如果可以&#xff0c;那考虑到人类庞大规模的人口和进行复杂操作的简单直观性与可扩展性&a…

STM32 独立看门狗(IWDG)详解

目录 一、引言 二、独立看门狗的作用 三、独立看门狗的工作原理 1.时钟源 2.计数器 3.喂狗操作 4.超时时间计算 5.复位机制 四、独立看门狗相关寄存器 1.键寄存器&#xff08;IWDG_KR&#xff09; 2.预分频寄存器&#xff08;IWDG_PR&#xff09; 3.重载寄存器&…