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。通过检查这些文件,您将能够判断输入文件是否真的是立体声。
脚本的作用:
( ffmpeg) 它独立地标准化左右声道。这是为了防止通过复制具有不同放大倍数的单声道来创建假立体声文件。
(仍然ffmpeg)它将光谱可视化为图形,其中两个通道用不同的颜色表示。这使得该方法不受相移的影响,因为在创建这样的频谱时,重要的是幅度,而不是相位。红色和绿色分量对应两个通道;蓝色分量对两个通道的共同点进行编码(稍后会派上用场)。
( convert) 它处理图形:
下面我将分析一些示例结果。从中您可以学习如何判断立体声音响是否为正品。
笔记:
.wav具有两个通道的文件进行了测试。showspectrumpic是您需要的唯一过滤器ffmpeg。800x600在这个答案中使用过。根据您的需要调整分辨率。ffmpeg似乎不支持stop选项showspectrumpic,很可能这个选项会有所帮助。还有其他方法可以处理这个“问题”,但我决定不混淆代码。这是一个不便,并不是真正的问题。spect可以与find -exec或一起使用find | xargs。I'm X% certain it's genuine stereo, I'm Y% certain it's fake stereo。在这个答案中,我不会走这么远。查看图片并应用启发式方法。从下面的例子中学习。这是.wav由spect以下人员处理的歌曲 1的原件:
你可以看到有红色的列,蓝色的列。这是(何时)其中一个渠道占主导地位的地方。这表明它是真正的立体声。
皇后乐队——波西米亚狂想曲
具有一个相位相反的通道的同一首歌曲 1 看起来几乎相同(点击放大):
同一首歌 1 混合到单声道并呈现为立体声(两个相同的通道),假立体声:
结果几乎全黑。理论上它应该是完全黑色的。TBH 我不知道这些文物究竟来自哪里。重要的是原曲没有详细的“结构”。diff上面的方法会为这个方法产生沉默。
同一首歌曲 1 混合到单声道并呈现为立体声(两个相同的通道),假立体声,但有一个通道相位相反:
这将“愚弄”该diff方法,您将需要该sum方法。spect无论如何都很好用。
同一首歌曲 1 与单声道混合并呈现为立体声、假立体声,但其中一个通道的音量降低了 10 dB:
您可以看到伪像,但图片看起来与原始歌曲中的非常不同。既diff不会也sum不会产生沉默。
同一首歌曲 1 与单声道混合并呈现为立体声、假立体声,但其中一个通道的音量降低了 10 dB,相位相反:
现在应该清楚反相与spect. 此答案的其余部分将此问题视为已解决。
作为比较:原始歌曲 1 的一个通道的音量降低了 10 dB:
由于单独标准化通道,原始歌曲的详细“结构”仍然可见。
同一个频道的歌曲 1 完全静音:
以上结果一个接一个。从左到右:
笔记:
这是.wav由spect以下人员处理的歌曲 1的原件:
这首歌没有像第一首那样清晰地分离通道,没有红色或蓝色的列。还有一些频率比蓝色更红。随着歌曲的发展,特征变化很少。这表明它是真正的立体声。
数乌鸦——琼斯先生
不同的结果一个接一个。从左到右:
就像歌曲 1 一样,您可以通过发现详细的“结构”来判断真正的立体声。
这首歌实际上是单音的。单声道信号已被录制到(我怀疑)立体声磁带上。从磁带中翻录为立体声,每个通道的磁带噪声都不同。
没有详细的“结构”,只有噪音。这表明通道之间的差异基本上只是噪声。该diff方法的结果不会是静默的,尽管对于这个确切的.wav文件,该方法会起作用,因为我可以播放结果并听到它的噪音。
对于不平衡的输入,如果您先标准化,diff/sum方法可能会起作用。我们spect会自动执行此操作。为了记录,这是处理不平衡歌曲 3 的spect样子:
.wav“压缩”到.png800 像素覆盖整个持续时间可能看起来像噪音。一种合理的方法是进行改进,spect以便预先检索持续时间并相应地调整水平分辨率。spect将是噪声。您可能仍然可以从它的强度中看出一些东西,但是由于该方法基于发现详细的“结构”,因此它不会像我们的示例歌曲 1 和 2 的真正立体声情况那样给您明显的结果。小智 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)
如果他们不同。
我相信您也可以将其压缩为带有子外壳的一行。
您可以使用 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”。
如果您已安装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=2和channel_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 中。将“反转”效果应用到其中一个轨道。选择两个轨道,然后从“轨道菜单 > 混合和渲染”中选择。如果曲目相同,结果将是沉默。要检查它是否绝对静音,请选择完整(混合)轨道,然后打开“放大”效果。如果放大效果显示“新峰值振幅”为“无穷大”,则混音轨道完全静音,并且两个导入的文件具有相同的音频。
这篇文章包含许多您感兴趣的讨论和一些替代方案。