【问题标题】:How do I compare 2 audio files, returning a percentage of difference如何比较 2 个音频文件,返回差异百分比
【发布时间】:2015-11-18 00:29:45
【问题描述】:

有没有办法比较 2 个音频文件,从而返回差异百分比? 我正在使用 C# VS08,.net 框架 3.5。

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

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

我们将不胜感激。

【问题讨论】:

  • 您所描述的是数字信号处理领域。坦率地说,如果你需要问怎么做,你还没有准备好去做。我非常怀疑 .NET 是否具有如此复杂的内置功能。
  • 我最近看到一篇关于这个主题的研究论文:An Industrial-Strength Audio Search Algorithm (PDF)他们比较了频谱。该技术用于流行的 iPhone 应用程序Shazam
  • 要回答这个问题,我们需要仔细准确地定义“相似”的含义。在 wav 文件的上下文中,您认为“相似”是什么意思?
  • 您正在尝试解决世界各地严肃的研究人员几十年来一直在解决的语音识别问题。尽管这是一件很酷的事情,但我认为对于没有 DSP、贝叶斯网络、分类器等先验知识的人来说,这不是一件容易的事。
  • 您真的想比较音频的差异,还是仅仅比较转录文本的差异?一旦你克服了最初的障碍,这就容易多了。

标签: audio c#


【解决方案1】:

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

例如,请告诉我们您期望获得的价值:

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

你想测量什么?演讲内容(词)?旋律,节奏?整体音频相似度?编码/录音设备差异?

【讨论】:

  • 我们不要屏住呼吸;问题是两年前的,OP 是 AWOL。
  • 糟糕,我只注意到(最近的)迁移日期。
【解决方案2】:

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

这只是围绕语音(而不是其他音频信息)。您比较两个音频文件,sourcedegraded,并获得一个百分比值或 MOS 等效值。

【讨论】:

  • 欢迎来到 DSP.stackexchange!感谢您提供答案,但我建议查看FAQ 以改进您的答案/问题。不鼓励签名——无论如何你都用你的注册句柄“签名”。此外,为您在答案中提到的方法提供指向外部材料、示例和说明的链接是一种很好的做法:)
【解决方案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+' %.');

}

【讨论】:

  • 直接比较字节流是不行的。根据您的代码,两个记录在感知上可能无法区分,但会被编码为两个不同的 bystream,匹配率为 0%。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 2020-04-02
  • 2011-09-29
相关资源
最近更新 更多