我正在研究如何比较声音文件(波形)。基本上我想比较存储的声音文件(wav)和麦克风的声音。所以最后我想预先存储我自己的一些语音命令,然后当我运行我的应用程序时,我想将预先存储的文件与麦克风的输入进行比较。
我的想法是在比较时加入一些余地,因为我想,连续两次以同样的方式说某些东西我很难。
所以经过一些谷歌搜索后,我发现python有这个名为wave的模块和Wave_read对象。该对象有一个名为readframes(n)的函数:
读取并返回最多n帧 audio,作为一串字节。
这些字节包含什么?我想通过波形文件循环一帧,然后逐帧比较它们。
答案 0 :(得分:36)
音频帧或样本包含该特定时间点的幅度(响度)信息。为了产生声音,按顺序播放数万帧以产生频率。
对于CD质量音频或未压缩波形音频,每秒大约有44,100帧/样本。这些帧中的每一帧都包含16位分辨率,允许相当精确地表示声级。此外,由于CD音频是立体声,实际上有两倍的信息,左声道为16位,右声道为16位。
当你在python中使用声音模块来获取一个帧时,它将作为一系列十六进制字符返回:
为了转换和比较这些值,您必须首先使用python wave模块的函数来检查位深度和通道数。否则,您将比较不匹配的质量设置。
答案 1 :(得分:8)
简单的逐字节比较几乎没有成功匹配的机会,即使有一些容忍度。语音模式识别是一个非常复杂和微妙的问题,仍然是许多研究的主题。
答案 2 :(得分:6)
您应该做的第一件事是将数据转换为频率的傅里叶变换。然而,它相当复杂。我不会在这里使用语音识别库,因为它听起来像你不仅仅录制声音。然后,您将尝试不同的时移(如果声音未完全对齐)并使用提供最佳相似性的那个 - 您必须定义相似度函数。哦,你应该对两个信号进行标准化(相同的最大响度)。
答案 3 :(得分:6)
我认为接受的描述有些不正确。
框架在图形格式中看起来有点像 stride 。对于 interleaved stereo @ 16 bits / sample,帧大小为2*sizeof(short)
= 4个字节。对于非交错立体声@ 16比特/样本,左声道的样本都是一个接一个,所以帧大小只是sizeof(short)
。