有没有一种方法可以比较2个音频文件,从而返回一定百分比的差异?
我正在使用C#VS08,.net framework 3.5。

编辑:声音差异(例如,音频1:"HELP",音频2:"HELP ME PLEASE",它将返回这2种音频之间的百分比差异。)

我目前正在以WAV格式保存录制的文件,其比特率和质量也将与录制和比较的比特率相同。我想问一下是否有一种方法可以比较两个具有相同属性和相同格式(WAV)的音频文件中的声音(不仅仅是二进制文件),并显示两个音频文件中两个声音之间的百分比差异。 br />
我们将不胜感激。

评论

您所描述的是数字信号处理领域。坦率地说,如果您需要询问如何做,那么您就毫无准备了。我非常怀疑.NET是否具有如此复杂的内置功能。<​​br />
我最近看过一篇有关该主题的研究论文:一种工业强度的音频搜索算法(PDF)它们比较频谱。该技术已在流行的iPhone应用Shasham中使用。

为了回答这个问题,我们需要对“相似”的含义进行仔细而精确的定义。在wav文件的上下文中,您认为“相似”是什么意思?

您正在尝试解决全世界几十年来认真研究的语音识别问题。尽管这是一件很酷的事情,但我认为如果没有DSP,贝叶斯网络,分类器等方面的先验知识,那么对一个人来说这是很难处理的。

您是否真的想比较音频或仅抄录文本的差异?一旦您克服了最初的障碍,那就容易得多。

#1 楼

例如,请告诉我们您希望获得哪个值:


在两个版本的使用不同设置编码的同一文件?
在同一文件的两个版本之间,只是一个版本比另一个版本稍快?
在相同音频输入的两个记录之间,但是通过不同的麦克风/录音设备?
同一个人说两个单词的两个录音之间?
同一个人说同一单词的两个录音之间的韵律(节奏/旋律)不同吗?不同的人说相同的单词?
同一个人的两个录音之间说几个句子,除了几个单词?
一个人的录音与一头牛的录音之间?
记录飞机和音乐?

您要测量什么?演讲内容(单词)?旋律,节奏?总体的音频相似度?编码/记录设备的差异?

评论


$ \ begingroup $
不要屏住呼吸;问题是两岁,OP是AWOL。
$ \ endgroup $
–埃姆雷
2012年3月28日23:22



$ \ begingroup $
糟糕,我仅注意到(最近的)迁移日期。
$ \ endgroup $
–小食
2012年3月29日在8:51

#2 楼

请查看ITU-T P.862。它是PESQ(语音质量的感知评估)的标准形式,PESQ是评估电话系统用户所体验的语音质量的标准系列。

这仅涉及语音(不是其他音频信息) )。您比较两个音频文件(源文件和降级文件),并获得以百分比或MOS等效值表示的值。

评论


$ \ begingroup $
欢迎使用DSP.stackexchange!感谢您提供答案,但我建议您查看FAQ,以改善您的答案/问题。不鼓励签名-无论如何,您都要使用注册的句柄“签名”。另外,为您在回答中提到的方法提供外部材料,示例和说明的链接也是一种好习惯:)
$ \ endgroup $
–佩内洛普
2012年11月26日12:19

#3 楼

我正在使用一种JavaScript函数比较两个音频文件。通过使用相同的逻辑,您可以比较任何语言的任何文件。

function compireAudio(){ 
var audio1 = "http://soundjax.com/reddo/86502%5Ealarm.mp3"; 
var audio2 = "http://soundjax.com/reddo/44368%5EALARME.mp3";
var i,j,d;
var matching = 0;
var t = 0;var i,j,d;
var matching = 0;
var t = 0;
var audio1Arr = Array();
var audio1Len = audio1.length;
for (i = 1; i<=audio1Len; i++)
{
    //reverse so its like a stack
    d = audio1.charCodeAt(audio1Len-i);
    for (j = 0; j < 8; j++) 
    {
        audio1Arr.push(d%2);
        d = Math.floor(d/2);
    }
}
var audio2Len = audio2.length;
for (i = 1; i<=audio2Len; i++)
{
    //reverse so its like a stack
    d = audio2.charCodeAt(audio2Len-i);
    for (j = 0; j < 8; j++) 
    {
        if(d%2 == audio1Arr[t])
        {
            matching++;
        }
        d = Math.floor(d/2);
        t++;
    }
}
var avarage = Number(matching)/((Number(t)+Number(audio1Arr.length))/Number(2))*Number(100);
alert('The Matching with the two audio is '+avarage+' %.');


}

评论


$ \ begingroup $
直接比较字节流不起作用。两条录音在听觉上是无法区分的,但根据您的代码,它们被编码为两个不同的流,匹配度为0%。
$ \ endgroup $
–小食
2012年5月24日15:55