【问题标题】:What does a audio frame contain?音频帧包含什么?
【发布时间】:2011-04-26 19:13:55
【问题描述】:

我正在研究如何比较声音文件(wave)。基本上我想将存储的声音文件(wav)与麦克风的声音进行比较。所以最后我想预先存储一些我自己的语音命令,然后当我运行我的应用程序时,我想将预先存储的文件与来自麦克风的输入进行比较。

我的想法是在比较时留出一些余量,因为我猜想以完全相同的方式连续说两次某事会很困难。

所以经过一番谷歌搜索后,我看到 python 有这个名为 wave 的模块和 Wave_read 对象。该对象有一个名为 readframes(n) 的函数:

读取并返回最多 n 帧 音频,作为一串字节。

这些字节包含什么?我正在考虑循环遍历波形文件,然后逐帧比较它们。

【问题讨论】:

  • 字节包含 PCM 数据。您是否正在尝试进行语音识别?听起来你有点过头了。你应该研究这个话题。
  • 啊,该死的 :) 感谢您的回复。你可以称之为语音识别,但我认为它是简单的文件比较,这会简单得多。就我而言,这只是发出相同声音的问题,而不是分析和尝试解释单词
  • 那还是语音识别。即使是声音的细微变化或速度差异也会产生截然不同的音频数据,因此您不能逐帧进行比较。
  • 嗯……那真是太糟糕了。是否有一个 python 库可以满足我的需求?
  • 否,但还有其他具有 Python 绑定的库。 pypi.python.org/pypi/speech/0.5.2 如果您使用的是 Windows。如果你不是:en.wikipedia.org/wiki/Speech_recognition_in_Linux

标签: python wav


【解决方案1】:

我认为接受的描述有些不正确。

frame 看起来有点像图形格式中的 stride。对于 interleaved 立体声 @ 16 位/样本,帧大小为 2*sizeof(short)=4 字节。对于non-interleaved stereo@16 bits/sample,左声道的sample都是一个接一个,所以帧大小刚好sizeof(short)

【讨论】:

  • 如何检查是否交错?什么更常见?
【解决方案2】:

您应该做的第一件事是将数据转换为其频率的傅立叶变换。然而,它相当复杂。我不会在这里使用语音识别库,因为听起来你不只录制语音。然后,您将尝试不同的时移(以防声音未完全对齐)并使用可提供最佳相似度的时移 - 您必须在其中定义相似度函数。哦,你应该标准化两个信号(相同的最大响度)。

【讨论】:

    【解决方案3】:

    音频帧或样本包含特定时间点的幅度(响度)信息。为了产生声音,需要按顺序播放数万帧以产生频率。

    对于 CD 质量的音频或未压缩的波形音频,每秒大约有 44,100 帧/样本。这些帧中的每一个都包含 16 位的分辨率,可以相当精确地表示声级。另外,因为 CD 音频是立体声的,所以实际上有两倍多的信息,左声道为 16 位,右声道为 16 位。

    在python中使用sound模块获取一帧时,会返回一串十六进制字符:

    • 一个字符用于 8 位单声道信号。
    • 8 位立体声的两个字符。
    • 16 位单声道的两个字符。
    • 16 位立体声的四个字符。

    为了转换和比较这些值,您必须首先使用 python wave 模块的函数来检查位深度和通道数。否则,您将比较不匹配的质量设置。

    【讨论】:

    • 每秒 75 帧?你不是说44100吗?
    • 是的,我最初有这个(见编辑),但它已经在我身上进行了修改。除非编辑者能够解释他们对音频帧的解释,否则我将把它改回来。
    • 红皮书 CD 播放器每秒从光盘读取 75 个扇区这一事实可能会造成一些混淆,但这与本讨论的目的无关
    • 我认为python最常见的“声音模块”是wavedocs.python.org/2.7/library/wave.html,但见docs.python.org/2.7/library/mm.html
    • "一个字符用于 8 位单声道信号" => 一个十六进制字符 = 8 位?当然,对于一个 8 位分辨率的信号,您需要两个十六进制字符。
    【解决方案4】:

    一个简单的逐字节比较几乎没有成功匹配的机会,即使有一定的容忍度。语音模式识别是一个非常复杂和微妙的问题,仍然是很多研究的主题。

    【讨论】:

    • 添加到这个答案......这个问题与我们通常如何以数字方式表示音频与我们如何感知声音有很大关系。我们听到频率及其相互作用。我们不会直接感知波浪的每一次起起落落。然而,当我们以 PCM 形式采集音频时,我们只是每秒记录数千次压力水平测量值。我们在频域中听到,但 PCM 音频在时域中。为了开始比较,我们首先需要运行傅里叶变换,将我们的数字音频转换为频域。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多