根据音色(音调)按相似度对声音进行排序

2024-03-18

解释

我希望能够根据以下内容对列表中的声音集合进行排序音色(音调)的声音。这是一个玩具示例,其中我手动对我创建的 12 个声音文件的声谱图进行了排序,上传到这个仓库 https://github.com/samgermain/sort-sounds-by-similarity-from-sound-file/tree/bare-example/assets/transients_1。我知道这些已正确排序,因为每个文件生成的声音与之前文件中的声音完全相同,但添加了一个效果或过滤器。

例如,正确的声音排序x, y and z where

  • 声音x和y是相同的,但y有失真效果
  • 声音 y 和 z 是相同的,但 z 过滤掉高频
  • 声音x和z是一样的,但是z有失真效果,z过滤掉高频

将会x, y, z

只需查看声谱图,我就可以看到一些视觉指示器,暗示应如何对声音进行排序,但我希望通过让计算机识别这些指示器来自动化排序过程。


上图中声音的声音文件

  • 长度都相同
  • 所有相同的音符/音高
  • 一切都在同一时间开始。
  • 所有相同的幅度(响度级别)

即使所有这些条件都满足,我也希望我的排序能够进行not是的(但即使它不能解决这个问题,我也会接受最佳答案)

例如,在下图中

  • 与第一幅图像中的 MFCC_8 相比,MFCC_8 的开头发生了偏移
  • MFCC_9 与第一张图像中的 MFCC_9 相同,但有重复(因此长度是其两倍)

如果第一张图片中的 MFCC_8 和 MFCC_9 替换为下图中的 MFCC_8 和 MFCC_9,我希望声音的排序保持完全相同。

对于我的真实程序,我打算通过声音更改来分解 mp3 文件像这样 https://www.youtube.com/watch?v=Vedm2WbFkwQ


到目前为止我的计划

这是产生的程序这篇文章中的第一张图片 https://i.stack.imgur.com/A0CHb.png。我需要函数中的代码sort_sound_files替换为一些实际上根据音色对声音文件进行排序的代码。需要做的部分是靠近底部和声音文件在此存储库上 https://github.com/samgermain/sort-sounds-by-similarity-from-sound-file/tree/bare-example/assets/transients_1。我也有这个代码Jupyter笔记本 https://github.com/samgermain/sort-sounds-by-similarity-from-sound-file/blob/bare-example/src/example.ipynb,其中还包括第二个示例,该示例更类似于我实际希望该程序执行的操作

import librosa
import librosa.display
import matplotlib.pyplot as plt
import numpy as np
import math
from os import path
from typing import List


class Spec:
    name: str = ''
    sr: int = 44100


class MFCC(Spec):

    mfcc: np.ndarray  # Mel-frequency cepstral coefficient
    delta_mfcc: np.ndarray  # delta Mel-frequency cepstral coefficient
    delta2_mfcc: np.ndarray  # delta2 Mel-frequency cepstral coefficient
    n_mfcc: int = 13

    def __init__(self, soundFile: str):
        self.name = path.basename(soundFile)
        y, sr = librosa.load(soundFile, sr=self.sr)
        self.mfcc = librosa.feature.mfcc(y, n_mfcc=self.n_mfcc, sr=sr)
        self.delta_mfcc = librosa.feature.delta(self.mfcc, mode="nearest")
        self.delta2_mfcc = librosa.feature.delta(self.mfcc, mode="nearest", order=2)


def get_mfccs(sound_files: List[str]) -> List[MFCC]:
    '''
        :param sound_files: Each item is a path to a sound file (wav, mp3, ...)
    '''
    mfccs = [MFCC(sound_file) for sound_file in sound_files]
    return mfccs


def draw_specs(specList: List[Spec], attribute: str, title: str):
    '''
        Takes a list of same type audio features, and draws a spectrogram for each one
    '''
    def draw_spec(spec: Spec, attribute: str, fig: plt.Figure, ax: plt.Axes):
        img = librosa.display.specshow(
            librosa.amplitude_to_db(getattr(spec, attribute), ref=np.max),
            y_axis='log',
            x_axis='time',
            ax=ax
        )
        ax.set_title(title + str(spec.name))
        fig.colorbar(img, ax=ax, format="%+2.0f dB")

    specLen = len(specList)
    fig, axs = plt.subplots(math.ceil(specLen/3), 3, figsize=(30, specLen * 2))
    for spec in range(0, len(specList), 3):

        draw_spec(specList[spec], attribute, fig, axs.flat[spec])

        if (spec+1 < len(specList)):
            draw_spec(specList[spec+1], attribute, fig, axs.flat[spec+1])

        if (spec+2 < len(specList)):
            draw_spec(specList[spec+2], attribute, fig, axs.flat[spec+2])


sound_files_1 = [
    '../assets/transients_1/4.wav',
    '../assets/transients_1/6.wav',
    '../assets/transients_1/1.wav',
    '../assets/transients_1/11.wav',
    '../assets/transients_1/13.wav',
    '../assets/transients_1/9.wav',
    '../assets/transients_1/3.wav',
    '../assets/transients_1/7.wav',
    '../assets/transients_1/12.wav',
    '../assets/transients_1/2.wav',
    '../assets/transients_1/5.wav',
    '../assets/transients_1/10.wav',
    '../assets/transients_1/8.wav'
]
mfccs_1 = get_mfccs(sound_files_1)


##################################################################
def sort_sound_files(sound_files: List[str]):
    # TODO: Complete this function. The soundfiles must be sorted based on the content in the file, do not use the name of the file

    # This is the correct order that the sounds should be sorted in
    return [f"../assets/transients_1/{num}.wav" for num in range(1, 14)]  # TODO: remove(or comment) once method is completed
##################################################################


sorted_sound_files_1 = sort_sound_files(sound_files_1)
mfccs_1 = get_mfccs(sorted_sound_files_1)

draw_specs(mfccs_1, 'mfcc', "Transients_1 Sorted MFCC-")
plt.savefig('sorted_sound_spectrograms.png')

EDIT

直到后来我才意识到这一点,但另一件非常重要的事情是,会有很多属性在振荡。例如,声音 5 和声音 6 与第一组的区别在于,声音 6 是声音 5,但在音量上有振荡(LFO),这种类型的振荡可以放置在频率滤波器上,效果(如失真)甚至投球。我意识到这使问题变得更加棘手,并且超出了我要求的范围。你有什么建议吗?我什至可以使用几种不同的类型,并且一次只查看一种属性。


Sam,我认为你可以用机器学习来比较两张图片,或者用 numpy 作为数据数组来比较。

这只是一个idea解决方案(不是完整的答案): 是否可以将两个直方图转换为平面大小相等的数组 经过numpy.ndarray.flatten

array1 = numpy.array([1.1, 2.2, 3.3])
array2 = numpy.array([1, 2, 3])
diffs = array1 - array2 # array([ 0.1,  0.2,  0.3])
similarity_coefficient = np.sum(diffs)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据音色(音调)按相似度对声音进行排序 的相关文章

  • Pandas 将行中的非空值获取到一个单元格中[重复]

    这个问题在这里已经有答案了 给定以下数据框 a pd DataFrame A 1 2 B 4 0 C 1 2 a A B C 0 1 4 1 1 2 0 2 我想创建一个新专栏D包含由列分隔的非空值 每行 像这样 A B C D 0 1 4
  • python中热图的层次聚类

    我有一个 NxM 矩阵 其值范围为 0 到 20 我可以使用 Matplotlib 和 pcolor 轻松获得热图 现在我想使用 scipy 应用层次聚类和树状图 我想重新排序每个维度 行和列 以显示哪些元素相似 根据聚类结果 如果矩阵是方
  • Celery计划任务中的打印语句不会出现在终端中

    当我跑步时celery A tasks2 celery worker B我想看到每秒打印 芹菜任务 目前没有打印任何内容 为什么这不起作用 from app import app from celery import Celery from
  • 带有指针数组的 cython

    我在 python 中有一个 numpy ndarrays 列表 具有不同的长度 并且需要非常快速地访问 python 中的列表 我认为指针数组就可以解决问题 我试过 float type t list of arrays no of ar
  • 帮助需要在可选条件下编写正则表达式[关闭]

    我有一个日志文件包含如下内容 log Using data from yyyy mm dd 2011 8 3 0 files queued for scanning Warning E test H ndler pdf File not F
  • 创建圆形图像 PIL Tkinter

    Currently I have a zoom feature in my application that works very well however I d like the actual zoom box to be a circ
  • Python 使用 M2Crypto 通过 S/MIME 对消息进行签名

    我现在花了几个小时 但找不到我的错误 我想要一个简单的例程来创建 S MIME 签名消息 稍后可以与 smtplib 一起使用 这是我到目前为止所拥有的 usr bin python2 7 coding utf 8 from future
  • 十六进制数的按位异或

    我们如何在 Python 中对十六进制数进行异或 例如 我想要异或 ABCD and 12EF 答案应该是 B922 我使用了下面的代码 但它给出了错误的结果 xor two strings of different lengths def
  • 使用 Python 的文本中的词频但忽略停用词

    这给了我文本中单词的频率 fullWords re findall r w allText d defaultdict int for word in fullWords d word 1 finalFreq sorted d iterit
  • Pyinstaller --onefile 警告文件已存在但不应存在

    跑步时Pyinstaller onefile 并开始得到结果 exe 会出现多个弹出窗口 并显示以下警告 WARNING file already exists but should not C Users myuser AppData L
  • 属性错误:类型对象“图像”没有属性“打开”

    Exception in Tkinter callback Traceback most recent call last File C Python34 lib tkinter init py line 1482 in call retu
  • Selenium:等到 WebElement 中的文本发生变化

    我在用着selenium使用Python 2 7 从网页上的搜索框检索内容 搜索框动态检索结果并在框本身中显示结果 from selenium import webdriver from selenium webdriver common
  • 提交表格并上传带有请求的文件

    我正在努力提交特定的表格蟒蛇请求 http www python requests org 我想使用它的网站上的其他表单工作正常 我可以提交登录表单等 这只是我遇到问题的文件上传 显然 提交表单效果很好 因为我从网站收到一条消息 说 请返回
  • 管理文件字段当前 url 不正确

    在 Django 管理中 只要有 FileField 编辑页面上就会有一个 当前 框 其中包含指向当前文件的超链接 但是 此链接会附加到当前页面 url 因此会导致 404 因为不存在这样的页面 例如 http 127 0 0 1 8000
  • 如何从数据框的单元格中获取值?

    我构建了一个条件 从我的数据框中提取一行 d2 df df l ext l ext df item item df wn wn df wd 1 现在我想从特定列中获取一个值 val d2 col name 但结果 我得到一个包含一行和一列
  • 有没有任何方法可以使用 openpyxl 获取 .xlsx 工作表中存在的行数和列数?

    有没有任何方法可以使用 openpyxl 获取 xlsx 工作表中存在的行数和列数 在xlrd中 sheet ncols sheet nrows 将给出列数和行数 openpyxl中有这样的方法吗 给定一个变量sheet 可以通过以下方式之
  • 在Python中计算结构体的CRC

    我有以下结构 来自 C 中的 NRPE 守护程序代码 typedef struct packet struct int16 t packet version int16 t packet type uint32 t crc32 value
  • 向量化 numpy bincount

    我有一个 2d numpy 数组 A我要申请np bincount 到矩阵的每一列A生成另一个二维数组B由原始矩阵每列的 bincounts 组成A 我的问题是 np bincount 是一个采用一维数组的函数 它不是像这样的数组方法B A
  • 在Python中从列表中获取n个项目组的惯用方法? [复制]

    这个问题在这里已经有答案了 给定一个列表 A 1 2 3 4 5 6 是否有任何惯用的 Pythonic 方式来迭代它 就好像它是 B 1 2 3 4 5 6 除了索引之外 这感觉像是 C 的遗留物 for a1 a2 in A i A i
  • python中匹配3个或更多相同的字符

    我正在尝试使用正则表达式在字符串中查找三个或更多相同的字符 例如 你好 不匹配 噢 会的 我尝试过做类似的事情 re compile 1 3 a zA Z re compile w 1 5 但似乎都不起作用 w 1 2 是您正在寻找的正则表

随机推荐

  • Xcode 连接到 MS SQL 数据库

    我有一个现有数据库已在远程启动并运行MS SQL server 并且我希望能够与该数据库进行通信和交互Xcode 我正在写一份申请OS X in Swift以及应用程序应使用的数据存储在该远程数据库中 问题是我好像找不到Swift可以连接到
  • 如何传递 bquote 的符号字符串以在 ggplot 中求值?

    我在函数中创建的 ggplot 的轴标签有所不同 有些标签有上标 下标 而另一些则没有 例子 m data lt data frame x runif 10 y runif 10 x labs lt c rain mm light W m
  • array_walk 匿名函数

    有没有办法让我用匿名函数来获取这个数组来设置值 url array dog cat fish array walk url function value key url key str replace dog value echo pre
  • Azure CLI 运行命令使用参数调用 RunPowerShellScript

    我一直在尝试在 Azure VM 上运行一个脚本 该脚本需要像这样传递参数 az vm run command invoke g
  • scikit learn:与 GridSearchCV 兼容的自定义分类器

    我已经实现了自己的分类器 现在我想对其运行网格搜索 但出现以下错误 estimator fit X train y train fit params TypeError fit takes 2 positional arguments bu
  • ASP>net MVC 可重用部分

    在 winforms 和 ASP net 中使用 net 几年后 我现在开始进入 MVC 我知道有点晚了 对我来说 一个主要的困惑是可重用 组件 的概念 类似于网络表单中用户控件的概念 例如 我希望在我的网站的会员区域内有许多 小部件 其中
  • OpenCL 内置函数“选择”

    我不清楚内置 OpenCL 函数的目的是什么select 有人可以澄清一下吗 来自 OpenCL 规范 功能选择 基因型a 基因型b 基因型c 返回 对于向量类型的每个分量 结果 i 如果设置了 c i 的 MSB b i a i 在这种情
  • 在 asp.net C# 中使用客户端 ID 和客户端密钥访问 Sharepoint 列表

    目前 我可以使用用户 ID 和密码访问共享点列表 如下所示 但想了解如何使用客户端 ID 和客户端密码访问列表 string siteUrl https xyz sharepoint com sites MyList ClientConte
  • VBA 运行时错误 3134

    以下代码创建一个 SQL 字符串 该字符串在 MS Access 中产生语法错误 3134 sql INSERT INTO tblItems desc descExtended itemNumber currentPrice VALUES
  • Spring Security 加密 MD5

    我有一个使用 spring 框架和 spring security 进行登录的 java web 应用程序 在我的数据库中 我的密码在保存之前已加密为 MD5 我在 application config xml 中添加了这段代码
  • jQuery DataTable - 搜索一列下拉列表

    我有一个简单的 jQuery 数据表 其中包含 4 列 其中一列是下拉列表 table tfoot tr th class searchBox Vendor Location th th class searchBox Currency t
  • RestKit valueTransformer 没有被调用

    我正在使用 RestKit 与我的 JSON 端点对话 端点返回一个以 毫秒数 为单位的 UNIX 时间戳 但是 RestKit 的默认转换器假定它是 秒数 并且我在 NSDate 中得到了错误的值 所以我环顾四周 发现我需要使用自定义 v
  • 在同一请求中创建和更新结构时可能出现的竞争条件 - Coldfusion

    大约一年前 我问了一个关于我在应用程序中遇到的错误的问题 该错误表明可能存在竞争条件 在 ColdFusion 中创建结构体时可能存在竞争条件 https stackoverflow com questions 19859690 possi
  • 使用 clang 在命令行上编译多个 Objective-C 文件

    希望是简单的问题 我正在尝试使用 clang 从命令行学习基本的 Objective C 编译 我知道 Xcode 对于复杂的项目来说是一个更好的解决方案 我计划很快转向它 但我个人觉得如果我可以在终端中手动编译一门语言 我会更好地理解它
  • Ember 过渡和渲染完成事件

    是否触发了任何事件 表明转换 渲染已完成 并且 dom 可见 准备就绪 setupcontroller activate 在 dom 构建 渲染之前 仅当我已经插入一个元素并且我只是将其下面的模型切换出来时 didInsertElement
  • 通过 PHP 执行 .sh 脚本

    我有一些游戏服务器 我需要运行 shell 脚本来提高质量 我试图弄清楚如何通过同一服务器上的网页运行这些脚本 这是一个 Ubuntu 专用服务器 网站文件位于 var www 我需要手动运行的 sh 文件位于 home amservers
  • 在 Lambda 中获取用户的 IP 地址(使用 API 网关和 Python)

    我正在使用这种技术 如何使用 Python 检索 AWS Lambda 公共 IP 地址 https stackoverflow com questions 48619163 how could i retrieve aws lambda
  • 使用 Swift 中的新并发将同步函数转换为异步函数

    我想将同步函数转换为异步函数 但我不知道正确的方法是什么 假设我有一个需要很长时间才能获取数据的同步函数 func syncLongTimeFunction throws gt Data Data 然后我在下面的函数中调用它 它仍然是一个同
  • 为什么要更改选项卡,停止 ios 应用程序中的动画?

    我的应用程序中有多个选项卡 我的一个视图控制器正在运行动画 当我切换到另一个视图控制器 并再次进入带有动画的视图控制器时 动画停止 有人可以指导我使用 Xcode 甚至在 Iphone 应用程序中切换选项卡吗 IBAction btn id
  • 根据音色(音调)按相似度对声音进行排序

    解释 我希望能够根据以下内容对列表中的声音集合进行排序音色 音调 的声音 这是一个玩具示例 其中我手动对我创建的 12 个声音文件的声谱图进行了排序 上传到这个仓库 https github com samgermain sort soun