如何比较2个音频文件,返回差异百分比


12

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

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

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

帮助将不胜感激。


7
您所描述的是数字信号处理领域。坦率地说,如果您需要询问如何做,那么您就毫无准备了。我非常怀疑.NET是否具有如此复杂的内置功能。

我最近看过一篇有关该主题的研究论文:一种工业强度的音频搜索算法(PDF)它们比较频谱。这项技术已在流行的iPhone应用Shasham中使用

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

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

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

Answers:


8

您能否定义“差异百分比”?

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

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

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


3
让我们不要屏住呼吸;问题是两岁,OP是AWOL。
Emre

1
糟糕,我只注意到(最近的)迁移日期。
pichenettes 2012年

3

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

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


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

-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+' %.');

}


3
直接比较字节流不起作用。两条录音在听觉上是无法区分的,但根据您的代码,它们被编码为两个不同的,具有0%匹配的流。
pichenettes 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.