音频帧包含什么?
我正在研究如何比较声音文件(波形文件)。简单来说,我想把存储的声音文件(wav格式)和麦克风录入的声音进行比较。最终,我希望能先录制一些自己的语音指令,然后在运行我的应用程序时,将这些预先存储的文件与麦克风输入的声音进行比较。
我想在比较时留出一些余地,因为我觉得连续两次完全一样地说同样的话是很困难的。
经过一些搜索,我发现Python有一个叫做wave的模块,还有一个叫Wave_read
的对象。这个对象有一个名为readframes(n)
的函数:
这个函数读取并返回最多n帧音频,结果是一个字节字符串。
这些字节里包含了什么呢?我在想,是否可以逐帧循环读取波形文件,逐帧进行比较。
4 个回答
我觉得之前的描述有点不太准确。
一个帧看起来有点像图形格式中的步幅。对于交错立体声,每个样本16位,帧的大小是2*sizeof(short)
=4字节。对于非交错立体声,每个样本16位,左声道的样本都是一个接一个的,所以帧的大小就是sizeof(short)
。
逐字节的简单比较几乎不可能成功匹配,即使加上一些容错的处理也是如此。语音模式识别是一个非常复杂且微妙的问题,目前仍然在进行大量研究。
音频帧,或者说音频样本,就是在某个特定时刻的声音强度(也就是响度)信息。为了产生声音,成千上万的音频帧会依次播放,从而形成不同的音频频率。
以CD音质的音频为例,或者说无压缩的波形音频,每秒大约有44,100个音频帧/样本。每个音频帧有16位的分辨率,这样可以比较准确地表示声音的强弱。而且,由于CD音频是立体声的,所以实际上信息量是两倍,左声道16位,右声道也16位。
当你在Python中使用声音模块获取一个音频帧时,它会以一串十六进制字符的形式返回:
- 一个字符表示8位单声道信号。
- 两个字符表示8位立体声。
- 两个字符表示16位单声道。
- 四个字符表示16位立体声。
为了转换和比较这些值,你需要先使用Python的wave模块的函数来检查音频的位深和声道数量。否则,你可能会在比较不匹配的音质设置。