如何检查 2 轨 WAV 文件在立体声中是否“真的”?

ein*_*lum 54 audio linux duplicate stereo wav

我有一个音频文件(具体是 WAV 格式)。当我用编辑器(例如 audacity)打开它时,我看到两个通道,我怀疑录音实际上是单声道而不是音频,即我怀疑曲目是重复的。有什么简单的方法可以检查它们是否...

  • “完美”重复?
  • “几乎”重复,耳朵无法区分?

我正在使用 Devuan GNU/Linux。命令行解决方案会很好,GUI 也可以。

Kam*_*ski 93

这个答案现在已经扩展到涵盖三种不同的实现方式,从最简单的开始;无需代码,只需聆听可用于批量测试的更复杂的示例。

最简单的方法

翻转一侧的相位并将输出相加为单声道。
如果结果是沉默,那就是单声道;如果不是,那就是立体声。
即使在立体声中,某些部分也会被移到中心位置 - 人声、贝斯、许多鼓等,但您会听到“缺少某些位”和“几乎完全静音”之间的压倒性差异。
如果您只是听到曲目中奇怪的小声音、噼啪声,或者只是周期性的嘶嘶声、噼啪声和砰砰声,把这归结为编码不良,它仍然是“单一”的所有意图和目的。

这依赖于声音的物理学;以最简单的形式,如果您将两个相同的波形相加,结果将是原来的两倍。如果你反转一个,那么它们会相互抵消并且总是加起来“零”......沉默。该原理用于降噪耳机和手机麦克风中的背景降噪。

方法
来自Audacity 手册……

Effect > Invert
没有包含此效果参数的效果对话框;Invert 直接对选定的音频进行操作。如果反演需要相当长的时间,则会出现一个进度对话框。

使用示例

使用音轨下拉菜单并选择将立体声拆分为单声道。
选择一个频道而不是另一个,应用反转,然后播放。每首曲目中的人声会相互抵消,只留下乐器。
了解立体声通道的不同之处:在任何立体声轨道上使用上述相同的步骤 1 和 2。如果步骤之后的音频和之前一样响亮,则说明声道非常不同。如果结果是静音,则轨道不是真正的立体声而是双单声道,其中左右两侧包含完全相同的音频。

简单的方法

在 Audacity 中加载(导入)(据称是立体声)文件。从顶部栏菜单中选择Effect , Nyquist Prompt...。粘贴以下内容:

(diff (aref *track* 0) (aref *track* 1))
Run Code Online (Sandbox Code Playgroud)

并点击确定。这将计算两条轨道之间的差异。

  • 完全静音的结果意味着曲目是相同的。
  • 非常安静或非常嘈杂的结果意味着轨道几乎相同。
  • 至少在某些片段上类似于原始音频的结果意味着曲目可能不同。

“可能”,因为它可能会发生轨道相同但相位相反。然后diff将增加幅度而不是将其归零。结果将比原始声音大得多。要排除这种可能性,请返回原始曲目(编辑撤消奈奎斯特提示),sum而不是计算diff

(sum (aref *track* 0) (aref *track* 1))
Run Code Online (Sandbox Code Playgroud)

完全静音的结果意味着轨道相同但相位相反。

如果两条轨道相似但相位偏移,或者相似但音量不同,则这些简单的测试将失败。在这种情况下也可能存在一个能够发现相似之处的公式,但我对Audacity Nyquist Prompt不够熟悉,无法进一步帮助您。

这个答案从以下 Audacity 论坛主题中得到了很多:算术轨道混合操作


没那么简单的方法

使用以下代码.png从您的.wav. 它运行ffmpeg并且convert(来自 Imagemagick)。

(diff (aref *track* 0) (aref *track* 1))
Run Code Online (Sandbox Code Playgroud)

命名spect并使其可执行 ( chmod +x spect)。提供一个或多个所谓的立体声.wav文件作为命令行参数。例子:

./spect foo.wav /path/to/bar.wav
Run Code Online (Sandbox Code Playgroud)

这将生成foo.wav.png/path/to/bar.wav.png。通过检查这些文件,您将能够判断输入文件是否真的是立体声。

脚本的作用:

  1. ( ffmpeg) 它独立地标准化左右声道。这是为了防止通过复制具有不同放大倍数的单声道来创建假立体声文件。

  2. (仍然ffmpeg)它将光谱可视化为图形,其中两个通道用不同的颜色表示。这使得该方法不受相移的影响,因为在创建这样的频谱时,重要的是幅度,而不是相位。红色和绿色分量对应两个通道;蓝色分量对两个通道的共同点进行编码(稍后会派上用场)。

  3. ( convert) 它处理图形:

    • “左”和“右”颜色分量被“公共”分量减少。通过这种方式,我们强调了两个通道不同的片段。
    • 结果提高了 20 倍(您可以调整它)。
    • 颜色从红色/绿色重新映射到红色/蓝色。这只是因为我希望解决方案对色盲更友好。

下面我将分析一些示例结果。从中您可以学习如何判断立体声音响是否为正品。

笔记:

  • 该代码假定有两个通道。它仅对.wav具有两个通道的文件进行了测试。
  • 在画面中时间从左到右流动,频率从下到上上升。
  • 您可能不想标准化。在这种情况下,showspectrumpic是您需要的唯一过滤器ffmpeg
  • 800x600在这个答案中使用过。根据您的需要调整分辨率。
  • 每张图片的上半部分都是黑色的,我猜它跨越到 48 kHz (?) 而 22.1 kHz 就足够了。我的ffmpeg似乎不支持stop选项showspectrumpic,很可能这个选项会有所帮助。还有其他方法可以处理这个“问题”,但我决定不混淆代码。这是一个不便,并不是真正的问题。
  • spect可以与find -exec或一起使用find | xargs
  • 进一步的自动处理是可能的,最终达到脚本告诉您的程度I'm X% certain it's genuine stereo, I'm Y% certain it's fake stereo。在这个答案中,我不会走这么远。查看图片并应用启发式方法。从下面的例子中学习。

示例 – 歌曲 1

这是.wavspect以下人员处理的歌曲 1的原件:

歌曲1,正版立体声

你可以看到有红色的列,蓝色的列。这是(何时)其中一个渠道占主导地位的地方。这表明它是真正的立体声。

皇后乐队——波西米亚狂想曲


具有一个相位相反的通道的同一首歌曲 1 看起来几乎相同(点击放大):

歌曲1,正宗立体声,一声道反相


同一首歌 1 混合到单声道并呈现为立体声(两个相同的通道),假立体声:

歌曲1,假立体声

结果几乎全黑。理论上它应该是完全黑色的。TBH 我不知道这些文物究竟来自哪里。重要的是原曲没有详细的“结构”。diff上面的方法会为这个方法产生沉默。


同一首歌曲 1 混合到单声道并呈现为立体声(两个相同的通道),假立体声,但有一个通道相位相反:

歌曲1,假立体声,一声道反相

这将“愚弄”该diff方法,您将需要该sum方法。spect无论如何都很好用。


同一首歌曲 1 与单声道混合并呈现为立体声、假立体声,但其中一个通道的音量降低了 10 dB:

歌曲1,假立体声,一声道降低音量

您可以看到伪像,但图片看起来与原始歌曲中的非常不同。既diff不会也sum不会产生沉默。


同一首歌曲 1 与单声道混合并呈现为立体声、假立体声,但其中一个通道的音量降低了 10 dB,相位相反:

歌曲1,假立体声,一声道降低音量

现在应该清楚反相与spect. 此答案的其余部分将此问题视为已解决。


作为比较:原始歌曲 1 的一个通道的音量降低了 10 dB:

歌曲1,正版立体声,一声道降低音量

由于单独标准化通道,原始歌曲的详细“结构”仍然可见。


同一个频道的歌曲 1 完全静音:

歌曲一,一声道无声


以上结果一个接一个。从左到右:

  • 真正的立体声
  • 真正的立体声,不平衡
  • 一声道无声
  • 假立体声
  • 假立体声,不平衡

song 1, genuine stereo song 1, genuine stereo, one channel unbalanced 歌曲一,一声道无声 歌曲1,假立体声 歌曲1,假立体声,一声道不平衡

笔记:

  • 如果我操纵另一个通道,蓝色或红色伪影可能是其他颜色。细节很重要,而不是颜色。
  • “真正的立体声,不平衡”仍然是真正的立体声。“不平衡”意味着一个通道没有另一个通道那么响亮。在这里,我操纵原始文件来实现这一点。一般来说,原始录音可能是这样的。这并不意味着有人篡改了文件。

示例 – 歌曲 2

这是.wavspect以下人员处理的歌曲 1的原件:

歌曲1,正版立体声

这首歌没有像第一首那样清晰地分离通道,没有红色或蓝色的列。还有一些频率比蓝色更红。随着歌曲的发展,特征变化很少。这表明它是真正的立体声。

数乌鸦——琼斯先生


不同的结果一个接一个。从左到右:

  • 真正的立体声
  • 真正的立体声,不平衡
  • 一声道无声
  • 假立体声
  • 假立体声,不平衡

song 2, genuine stereo song 2, genuine stereo, unbalanced 歌曲2,一声道无声 歌曲2,假立体声 歌曲2,假立体声,不平衡

就像歌曲 1 一样,您可以通过发现详细的“结构”来判断真正的立体声。


示例 – 歌曲 3

这首歌实际上是单音的。单声道信号已被录制到(我怀疑)立体声磁带上。从磁带中翻录为立体声,每个通道的磁带噪声都不同。

第三首

没有详细的“结构”,只有噪音。这表明通道之间的差异基本上只是噪声。该diff方法的结果不会是静默的,尽管对于这个确切的.wav文件,该方法会起作用,因为我可以播放结果并听到它的噪音。

对于不平衡的输入,如果您先标准化,diff/sum方法可能会起作用。我们spect会自动执行此操作。为了记录,这是处理不平衡歌曲 3 的spect样子:

歌曲3,不平衡


最后的笔记

  • 长时间.wav“压缩”到.png800 像素覆盖整个持续时间可能看起来像噪音。一种合理的方法是进行改进,spect以便预先检索持续时间并相应地调整水平分辨率。
  • 如果您的输入噪声,则来自的输出spect将是噪声。您可能仍然可以从它的强度中看出一些东西,但是由于该方法基于发现详细的“结构”,因此它不会像我们的示例歌曲 1 和 2 的真正立体声情况那样给您明显的结果。
  • 实验。:)

  • @einpoklum 当我使用专业音响设备时,我们有一个按钮可以反转低音炮相对于其余声音的相位。虽然我们永远无法弄清楚它为什么重要的物理原理,但我们确实注意到一种设置听起来比另一种更好,但哪个听起来更好取决于场地。人耳是一种了不起的信号处理设备,它可以做很多看起来很奇怪的事情! (8认同)
  • @einpoklum 理论上:当您与两个扬声器的距离相等时,破坏性干扰。但是你的头脑不是一个点,在实践中可能很难说。使用耳机,您可能根本听不到任何明显的区别。我用耳机进行了测试:与相同的曲目相比,相反的相位听起来有些奇怪。但不同的曲目可能听起来很相似。注:(1)我不是音乐家,也不是音响专家;(2)我现在的耳机很笨,像扬声器一样工作([这个答案](https://superuser.com/a/1119386/432690)中提到的“好的蓝牙耳机”不再工作)。 (5认同)
  • @einpoklum 我的后置扬声器有两个高音扬声器和一个开关,可在单高音扬声器、双同相高音扬声器和双反相高音扬声器之间切换。效果相当有趣。双反相产生更“扩散”的声音。感觉我身后的房间突然变大了,这很棒,因为我就坐在墙前。因此,反相音频会产生奇怪的效果。 (3认同)

小智 20

在我看来,另一种更简单的方法来计算左右轨道之间的差异:

单击轨道,然后“拆分立体声轨道”

拆分立体声轨道

单击第二个轨道,然后单击“效果/反转”

效果反转

将两条轨道的平移设置为中心,选择所有内容,然后单击“轨道/混合/混合和渲染”

混合和渲染

结果是两条轨道的差异。如果为零,则左右两侧的轨道相同。在这种情况下,它不是。

结果


kub*_*ubi 11

这是一个带有sox的解决方案,在我看来,它比 ffmpeg 更适合这项任务。

Sox 有oops效果,又名卡拉 OK 过滤器:

异相立体声效果。将立体声混合到双单声道,其中每个单声道包含左右立体声声道之间的差异。

如果两个通道相同,则结果应该全部为零
我们可以使用 sox 的stat效果来检查这一点。

我们可以链接这两种效果并使用一个简单的命令:

sox infile.wav -n oops stat
Run Code Online (Sandbox Code Playgroud)

对于“假立体声”文件,其结果是这样的,即 l/r 通道是相同的:

...
Maximum amplitude:     0.000000
Minimum amplitude:     0.000000 
...
Run Code Online (Sandbox Code Playgroud)

对于几乎立体声的文件,它看起来像这样:

Maximum amplitude:     0.000397
Run Code Online (Sandbox Code Playgroud)

相比之下,对于我随机挑选的一首歌曲:

Maximum amplitude:     0.950149
Minimum amplitude:    -1.000000
Run Code Online (Sandbox Code Playgroud)

您可以更进一步,通过diffing 两个通道在位级别比较通道:

# check the -b/-e params with: soxi in.wav
sox in.wav -b 16 -e signed -c 1 in.l.raw remix 1
sox in.wav -b 16 -e signed -c 1 in.r.raw remix 2
diff in.l.raw in.r.raw
Run Code Online (Sandbox Code Playgroud)

哪个会输出

Binary files in.l.raw and in.r.raw differ
Run Code Online (Sandbox Code Playgroud)

如果他们不同。

我相信您也可以将其压缩为带有子外壳的一行。


ble*_*tin 8

您可以使用 FFmpeg 实现这一点,使用平移滤波器在两个音频通道之间生成增量,然后使用astats滤波器打印整体 RMS 信号电平。

ffmpeg -i $INPUT_FILE -filter:a "pan=1c|c0=c0-c1,astats=measure_perchannel=none:measure_overall=RMS_level" -f null /dev/null
Run Code Online (Sandbox Code Playgroud)

示例输出:

[Parsed_astats_1 @ 0x3ad1340] Channel: 1
[Parsed_astats_1 @ 0x3ad1340] Overall
[Parsed_astats_1 @ 0x3ad1340] RMS level dB: -16.015304
Run Code Online (Sandbox Code Playgroud)

显示的 RMS 电平越低,两个音频通道之间的差异就越小。如果它们完全相等,则显示的值将是“-inf”。


har*_*ymc 2

如果您已安装ffmpeg并拥有ffprobe,请使用以下命令:

ffprobe -i file.wav -show_streams -select_streams a:0
Run Code Online (Sandbox Code Playgroud)

这将为您提供一个输出,其中重要部分是:

[STREAM]
...
channels=2
channel_layout=stereo
Run Code Online (Sandbox Code Playgroud)

请注意channels=2channel_layout=stereo,您可以通过它grep 进行检查。

一个更简单的命令用于-show_entries指定您想要的内容,应用打印格式来-of删除其他所有内容,并将详细程度设置为0 不打印通常的起始信息:

ffprobe -i yourFile.mp4 -show_entries stream=channels -select_streams a:0 -of compact=p=0:nk=1 -v 0
Run Code Online (Sandbox Code Playgroud)

对于典型的立体声音频文件,这将返回“2”。

来源


为了比较两个频道, 比较两个据称相同的曲目后 有以下建议,该建议使用免费的Audacity

将它们都导入到 Audacity 中。将“反转”效果应用到其中一个轨道。选择两个轨道,然后从“轨道菜单 > 混合和渲染”中选择。如果曲目相同,结果将是沉默。要检查它是否绝对静音,请选择完整(混合)轨道,然后打开“放大”效果。如果放大效果显示“新峰值振幅”为“无穷大”,则混音轨道完全静音,并且两个导入的文件具有相同的音频。

这篇文章包含许多您感兴趣的讨论和一些替代方案。

  • 它是否还会显示“channels=2”和“channel_layout=stereo”,以将两通道单声道传递为立体声? (3认同)