【问题标题】:Python audio analysis: find real time values of the strongest beat in each meterPython音频分析:找到每米最强节拍的实时值
【发布时间】:2019-02-16 00:37:38
【问题描述】:

我有一首歌,我想用Python来分析它。

我需要找到歌曲中的“主要声音”。 我使用这个术语是因为我不知道它的技术术语,但我的意思是:

https://www.youtube.com/watch?v=TYYyMu3pzL4

如果你只播放歌曲的第一秒,我数了大约 4 个主要声音。

一般来说,这些声音与人们在哼歌时会哼出的声音相同。

这些叫什么? librosa(或任何其他库/编程语言)中是否有一个函数可以帮助我确定它们在歌曲中的出现?

我可以根据需要提供更多信息/示例。

更新:经过更多研究,我相信我正在寻找所谓的“最强节拍”。 Librosa 已经有一个 beat_track 功能,但我认为这为您提供了歌曲中可以称为节拍的每一件事。我真的不想要每一个节拍,只想要那些最突出的节拍。这里的首要目标是创建一个音乐视频,其中屏幕上发生的主要动作与最强的节拍完美对齐。这会在视频中产生协同效应 - 感觉一切都相互关联。

【问题讨论】:

    标签: python audio-processing librosa


    【解决方案1】:

    你最好调用解析音频的过程来识别它的声音原型acoustic fingerprinting

    音频具有时间维度,因此要见证您的“主要声音”,需要在一段时间内聆听音频……跨越一系列瞬时音频样本。音频可以被认为是一个时间序列曲线,您可以在每个瞬间记录数字化为 PCM 格式的音频曲线的高度。听到给定的“主要声音”需要挂钟时间。在这里,您的音频在时域中处于其自然状态。然而,一段音频的信息负载可以通过将一个音频样本窗口输入到 fft api 调用(进行傅里叶变换)来转换为其频域对应物。

    采用 FFT 的一个非常微妙的方面是它从输入数据中移除了时间维度,并用蒸馏代替了它,同时保留了输入信息负载。顺便说一句,如果音频是周期性的,一旦通过应用傅里叶变换从时域变换到其频域表示,则可以通过应用傅里叶逆变换将其重构回相同的时域音频曲线。数据最初是一条随时间上下摆动的曲线,现在被投射为频率的扩展,每个频率都有强度和相位偏移,但关键是没有任何时间概念。现在您可以奢侈地从这个静态频率数组中提取一组属性,这些属性可以由普通的 struct 数据结构表示,但又被其潜在的时间起源所浸染。

    在这里您可以找到您的“主要声音”。对于第一个近似值,您只需将顶部 X 频率及其强度值存储起来,这是对作为“主要声音”捕获的输入音频的给定时间段的度量。一旦您拥有“主要声音”的集合,您可以使用它来识别任何后续音频何时包含“主要声音”的出现,方法是在您预先存储的“主要声音”集和 FFT 之间执行差异匹配测试音频样本的当前窗口。当当前 FFT 结果的前 X 个频率的每个频率强度值与每个预存储的“主要声音”相比几乎没有或没有差异时,您已经找到匹配项

    我可以通过解释如何坐下来弹奏钢琴来执行那些白色和黑色小频率键的逆傅立叶变换,或者说穿过春雨肿胀的牧场的泥泞马车轨道是傅立叶变换所有那些数不胜数的满载货物的货车向前行驶,留下一条越来越深的轨道,上面印有每辆货车的车轴宽度,但我不会。

    这里有一些音频指纹识别的链接

    Python 中的音频指纹和识别 https://github.com/worldveil/dejavu

    使用 Python 和 Numpy 进行音频指纹识别http://willdrevo.com/fingerprinting-and-audio-recognition-with-python/

    连续音频流的类似 Shazam 的声学指纹识别 (github.com) https://news.ycombinator.com/item?id=15809291

    https://github.com/dest4/stream-audio-fingerprint

    音频地标指纹作为节点流模块 - nodejs 将 PCM 音频信号转换为一系列音频指纹。 https://github.com/adblockradio/stream-audio-fingerprint

    https://stackoverflow.com/questions/26357841/audio-matching-audio-fingerprinting

    【讨论】:

    • 我并不是真的想通过它的指纹来识别一首歌曲,我试图取一首歌曲并找到每米中最强节拍的时间值。所以最终结果应该是某种数组,如a = [0.25, 0.5, 0.70, 1.10...],其中每个数值都是一个时间值(以秒为单位),它可以精确定位仪表中最强的节拍。
    猜你喜欢
    • 2010-09-09
    • 2022-01-17
    • 2011-11-16
    • 2017-04-24
    • 2010-10-16
    • 2022-10-15
    • 2017-12-14
    • 2010-11-18
    • 1970-01-01
    相关资源
    最近更新 更多