音频帧包含什么?

24 投票
4 回答
46407 浏览
提问于 2025-04-16 05:39

我正在研究如何比较声音文件(波形文件)。简单来说,我想把存储的声音文件(wav格式)和麦克风录入的声音进行比较。最终,我希望能先录制一些自己的语音指令,然后在运行我的应用程序时,将这些预先存储的文件与麦克风输入的声音进行比较。

我想在比较时留出一些余地,因为我觉得连续两次完全一样地说同样的话是很困难的。

经过一些搜索,我发现Python有一个叫做wave的模块,还有一个叫Wave_read的对象。这个对象有一个名为readframes(n)的函数:

这个函数读取并返回最多n帧音频,结果是一个字节字符串。

这些字节里包含了什么呢?我在想,是否可以逐帧循环读取波形文件,逐帧进行比较。

4 个回答

8

我觉得之前的描述有点不太准确。

一个看起来有点像图形格式中的步幅。对于交错立体声,每个样本16位,帧的大小是2*sizeof(short)=4字节。对于非交错立体声,每个样本16位,左声道的样本都是一个接一个的,所以帧的大小就是sizeof(short)

8

逐字节的简单比较几乎不可能成功匹配,即使加上一些容错的处理也是如此。语音模式识别是一个非常复杂且微妙的问题,目前仍然在进行大量研究。

47

音频帧,或者说音频样本,就是在某个特定时刻的声音强度(也就是响度)信息。为了产生声音,成千上万的音频帧会依次播放,从而形成不同的音频频率。

以CD音质的音频为例,或者说无压缩的波形音频,每秒大约有44,100个音频帧/样本。每个音频帧有16位的分辨率,这样可以比较准确地表示声音的强弱。而且,由于CD音频是立体声的,所以实际上信息量是两倍,左声道16位,右声道也16位。

当你在Python中使用声音模块获取一个音频帧时,它会以一串十六进制字符的形式返回:

  • 一个字符表示8位单声道信号。
  • 两个字符表示8位立体声。
  • 两个字符表示16位单声道。
  • 四个字符表示16位立体声。

为了转换和比较这些值,你需要先使用Python的wave模块的函数来检查音频的位深和声道数量。否则,你可能会在比较不匹配的音质设置。

撰写回答