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