如何让 python 加载一个大(2 小时)wav 文件并将其内容转换为时频数组?

Posted

技术标签:

【中文标题】如何让 python 加载一个大(2 小时)wav 文件并将其内容转换为时频数组?【英文标题】:How do I make python load a big(2hours) wave-file and convert it's contents into a time-frequency array? 【发布时间】:2012-01-17 17:55:17 【问题描述】:

我想用类似 array[5000][440] 的东西来访问数组,这意味着从开始的 5000 毫秒和 440 赫兹,它会给我一个在这个位置的频率幅度值。

我在这里找不到类似的东西,如果有,请指出。

【问题讨论】:

我认为这可以让你大部分时间到达那里? ***.com/questions/3694918/… 好吧,不幸的是还没有。我错过了他们提供的东西和我想要的东西的链接。第一个样本让我例如“(0.27440469538 + 0.908302073062j)* exp(2 pi it * 0.263687742847)”。这是什么意思? 完成 gravitron 发布的内容:***.com/questions/2063284/…。有了这两个资源,你应该可以为所欲为。 @LionelBarret 你的链接对我有多大帮助? 【参考方案1】:

你基本上想要一个spectrogram。为了让您开始,请以小块的形式浏览您的声音文件,其中每个块为 1/10 秒,然后对每个块进行 FFT。 (然后,当然,要查找 5000ms 和 440Hz,请转到相应块的 FFT。)

【讨论】:

其实我想检测语音。但首先我需要找到一些模式。如果有一些语音检测可用,我可以跳过。 “检测语音”是什么意思?您的意思是确定何时有声音与何时有背景噪音? 是的,我就是这个意思。语音检测,而不是识别。仅检测。 这可能不是太难,但它完全取决于背景(即所有不是声音的东西)。如果背景是相对安静的,那当然很简单,只看幅度;如果是噪声,请在每个 FFT 中寻找结构,例如加宽峰或谐波结构。并非所有音素都容易识别为语音(“sh”、“t”等),但元音和其他可能不会太糟糕;当然,您的时间片通常会包含混音,但总而言之,这似乎是可能的。首先绘制频谱图以可视化信号与背景。 顺便说一句,matplotlib 有一个名为“specgram”的频谱图函数。这是一个容易开始的地方。 (顺便说一句,人们通常认为他们只会计算而无需先将事情绘制出来。这从不适用于这样的问题。从绘图开始。)【参考方案2】:

您的操作存在一些误解。

您无法获取特定时间点的波频率。您需要选择一个时间窗口,包括兴趣点之前和之后的许多点。您包含的点越多,您在频率细分中的分辨率就越高。您需要在这些点上运行某种窗口函数,然后对它们进行 FFT。

获得 FFT 的结果后,数字将与频率相对应,但不是简单的关系。您无法控制与每个输出相对应的频率,这已经由信号的采样频率和样本数量决定。恐怕我手头没有转换公式。每个频率都有两个分量,一个实部和一个虚部,幅度为sqrt(r**2+i**2)

【讨论】:

在 python 代码中 sqrt(r2+i2) 是什么意思?你在谈论upload.wikimedia.org/wikipedia/de/math/d/f/4/… 吗?最好的,理查特。 @RichardBremer,是的,这正是我的意思——复数的绝对值。 好吧,你的回答对我帮助很大。我的下一个目标是使用我得到的结果进行语音检测。您是否知道有一种行之有效的方法? @RichardBremer,语音检测比频率检测复杂得多。恐怕我在那个方面完全超出了我的深度。【参考方案3】:

您可以即时转换时间和频率。您必须使用__getitem__ 并且可能使用lru_cache 来存储一些值以供进一步使用。

假设傅立叶是这样的

class Fourier():
   def __init__(self,a=10):
      self.a=a
   def __getitem__(self, index): 
      #this is function that calculates and returns value of my_furier
      return self.a+index

t=Fourier()
print(t[12.4])

您可以应用相同的方法从傅立叶访问时间。因此,您可以创建新的时间对象,使您能够选择任何有效时间并返回该时间,或者使用某种插值来返回表中没有的值。

如果您无法将所有值存储在 ram 中,您可以使用标准库中的 shelve 模块来存储和访问磁盘中的项目,如果需要,您可以在其上应用插值接口。

【讨论】:

以上是关于如何让 python 加载一个大(2 小时)wav 文件并将其内容转换为时频数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用python [duplicate]连接多个.wav文件

将 .wav 加载到内存中,然后在 C++ 中播放

如何让 Apache 2.2 加载 *.php?

将大 mp3 文件转换为 wav 时间问题

Python改变wav文件的音高[关闭]

如何使用 python 连接两个 wav 文件?