如何检查双轨 WAV 文件是否“真正”是立体声?

如何检查双轨 WAV 文件是否“真正”是立体声?

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

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

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

答案1

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

最简单的方法

翻转一侧的相位并将输出相加为单声道。
如果结果是无声,则为单声道;如果不是,则为立体声。
即使是立体声,某些部分也会被置于中央 - 人声、低音、大量鼓声等,但您会听到“某些部分丢失”和“几乎完全无声”之间的巨大差异。
如果您只听到音轨中奇怪的小声、噼啪声,或者只是周期性的嘶嘶声、噼啪声和砰砰声,则将其归因于编码不佳,从所有意图和目的来看,它仍然是“单声道”。

这依赖于声音的物理原理;最简单的形式是,如果你将两个相同的波形相加,结果将大一倍。如果你将其中一个波形反转,那么它们将相互抵消并始终相加为“零”……静音。此原理用于降噪耳机和手机麦克风的背景降噪等。

方法
来自Audacity 手册

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

使用示例

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

简单方法

在 Audacity 中加载(导入)该(据称是立体声)文件。从顶部菜单栏中选择影响奈奎斯特提示….粘贴以下内容:

(diff (aref *track* 0) (aref *track* 1))

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

  • 完全安静的结果意味着轨道是相同的。
  • 非常安静或非常嘈杂的结果意味着轨道几乎相同。
  • 如果结果至少在某些片段上与原始音频相似,则意味着音轨大概不同的。

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

(sum (aref *track* 0) (aref *track* 1))

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

如果两个音轨相似但相位不同,或者相似但音量不同,这些简单的测试将失败。在这种情况下,可能存在能够发现相似性的公式,但我不熟悉Audacity Nyquist 提示符足以进一步帮助您。

这个答案很大程度上取自以下 Audacity 论坛主题:算术轨道混合操作


不那么简单的方法

.png使用以下代码从您的创建图形.wav。它运行ffmpegconvert(来自Imagemagick)。

#!/bin/sh

for input do

ffmpeg -nostdin -i "$input" -lavfi \
 '[0:a] channelsplit=channel_layout=stereo [left][right];
  [left] loudnorm [L];
  [right] loudnorm [R];
  [L][R] join=inputs=2:channel_layout=stereo [a];
  [a] showspectrumpic=s=800x600:mode=combined:color=channel:legend=no [out]' \
  -f apng -map '[out]' - \
| convert - -colorspace RGB -color-matrix \
' 20   0 -20   0   0   0
   0   0   0   0   0   0
   0  20 -20   0   0   0
   0   0   0   0   0   0
   0   0   0   0   0   0
   0   0   0   0   0   0
' "$input".png

done

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

./spect foo.wav /path/to/bar.wav

这将生成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支持stopshowspectrumpic,这个选项很可能有帮助。还有其他方法可以解决这个“问题”,但我决定不混淆代码。这很不方便,但不是真正的问题。
  • spectfind -exec可与或 一起使用find | xargs
  • 可以进行进一步的自动处理,最终达到脚本告诉您的程度I'm X% certain it's genuine stereo, I'm Y% certain it's fake stereo。在这个答案中,我不会走这么远。查看图片并应用启发式方法。从以下示例中学习。

示例 – 歌曲 1

.wav这是经过处理的第一首歌曲的原版spect

歌曲 1,纯正立体声

您可以看到有红色列和蓝色列。这是其中一个通道占主导地位的情况。这表明它是真正的立体声。

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


同一首歌曲 1,其中一个通道的相位相反,看起来几乎完全相同(点击放大):

歌曲 1,真正的立体声,单声道反相


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

歌曲 1,假立体声

结果几乎全是黑色。理论上它应该是完全黑色的。老实说,我不知道这些瑕疵究竟来自哪里。重要的是原曲没有详细的“结构”。diff上面的方法会为这首歌产生静默。


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

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

这个会“欺骗”diff方法,你需要这个sum方法。spect无论如何都能很好地工作。


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

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

您可以看到伪影,但图片看起来与原曲非常不同。两者都diff不会sum产生静音。


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

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

现在应该清楚了,反相对 来说并不重要spect。本答案的其余部分将此问题视为已解决。


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

歌曲 1,纯立体声,单声道降低音量

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


同一首歌曲 1,其中一个频道完全静音:

歌曲 1,一个频道静音


上述结果一一对应。从左到右:

  • 真正的立体声
  • 真正的立体声,不平衡
  • 一个频道沉默
  • 假立体声
  • 假立体声,不平衡

song 1, genuine stereosong 1, genuine stereo, one channel unbalanced歌曲 1,一个频道静音歌曲 1,假立体声歌曲 1,假立体声,一个声道不平衡

笔记:

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

示例 – 歌曲 2

.wav这是经过处理的第一首歌曲的原版spect

歌曲 1,纯正立体声

这首歌的声道分离不如第一首那么清晰,没有红色或蓝色的柱状图。但有些频率的红色多于蓝色。随着歌曲的进行,特性发生了几次变化。这表明这是真正的立体声。

数乌鸦——琼斯先生


不同的结果并排摆放。从左到右:

  • 真正的立体声
  • 真正的立体声,不平衡
  • 一个频道沉默
  • 假立体声
  • 假立体声,不平衡

song 2, genuine stereosong 2, genuine stereo, unbalanced第 2 首歌曲,一个频道静音歌曲 2,假立体声歌曲 2,假立体声,不平衡

就像歌曲 1 一样,您可以通过观察详细的“结构”来辨别真正的立体声。


示例 – 歌曲 3

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

歌曲 3

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

对于不平衡输入,如果您先进行标准化,diff/方法可能会起作用。我们的系统会自动执行此操作。顺便说一下,不平衡歌曲 3 的处理方式如下:sumspectspect

第三首歌,不平衡


最后说明

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

答案2

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

点击音轨,然后点击“分割立体声音轨”

分割立体声音轨

点击第二条轨道,然后点击“效果/反转”

效果反转

将两个音轨的声像设置为中心,选择所有内容,然后单击“音轨/混合/混合和渲染”

混合并渲染

结果是两条轨道的差值。如果为零,则表示左右两侧的轨道相同。在本例中,不是。

结果

答案3

这是一个解决方案袜子,在我看来,这比 ffmpeg 更适合这项任务。

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

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

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

我们可以将这两种效果串联起来,只使用一个简单的命令:

sox infile.wav -n oops stat

对于“假立体声”文件,其结果如下,即 l/r 通道相同:

...
Maximum amplitude:     0.000000
Minimum amplitude:     0.000000 
...

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

Maximum amplitude:     0.000397

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

Maximum amplitude:     0.950149
Minimum amplitude:    -1.000000

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

# 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

这将输出

Binary files in.l.raw and in.r.raw differ

如果它们不同。

我确信您也可以用子 shell 将其压缩为一行。

答案4

稍微有点数学的方法:计算左右声道之间的皮尔逊相关性。如果结果非常接近 1,则文件实际上是单声道。如果结果是 -1,则它是单声道,但有一个声道被反转。

如何使用scipyaudio2numpy库来实现这一点:

import audio2numpy
from  scipy.stats import pearsonr
audio=audio2numpy.open_audio('filename')
pearsonr(audio[0][:,0], audio[0][:,1])

对于我随机挑选的几个立体声歌曲文件,声道之间的相关性在 0.6 到 0.9 之间变化。对于一个文件,将其混音为单声道,再将其转换回立体声并编码为联合立体声 mp3,相关性的精度为 1 到 10 位,而对于单声道混音朝右声道平移并进行相同编码的文件,相关性的精度为 4 位。

相关内容