我有一个音频文件(具体来说是 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
。它运行ffmpeg
并convert
(来自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
。通过检查这些文件,您将能够判断输入文件是否真的是立体声的。
脚本的作用:
(
ffmpeg
) 它独立地标准化左右声道。这是因为通过复制具有不同放大率的单声道来创建伪立体声文件。(静止
ffmpeg
)它将频谱可视化为图形,其中两个通道用不同的颜色表示。这使得该方法不受相移的影响,因为在创建这样的频谱时,重要的是振幅,而不是相位。红色和绿色分量对应于两个通道;蓝色分量编码两个通道的共同点(稍后会用到)。(
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
.wav
这是经过处理的第一首歌曲的原版spect
:
您可以看到有红色列和蓝色列。这是其中一个通道占主导地位的情况。这表明它是真正的立体声。
皇后乐队 – 波西米亚狂想曲
同一首歌曲 1,其中一个通道的相位相反,看起来几乎完全相同(点击放大):
同一首歌曲 1 混合为单声道并呈现为立体声(两个相同的声道),假立体声:
结果几乎全是黑色。理论上它应该是完全黑色的。老实说,我不知道这些瑕疵究竟来自哪里。重要的是原曲没有详细的“结构”。diff
上面的方法会为这首歌产生静默。
同一首歌曲 1 混合为单声道并呈现为立体声(两个相同的通道),假立体声,但其中一个通道的相位相反:
这个会“欺骗”diff
方法,你需要这个sum
方法。spect
无论如何都能很好地工作。
同一首歌曲 1 混合为单声道并呈现为立体声,假立体声,但其中一个通道的音量降低了 10 dB:
您可以看到伪影,但图片看起来与原曲非常不同。两者都diff
不会sum
产生静音。
同一首歌曲 1 混合为单声道并呈现为立体声,假立体声,但其中一个通道的音量降低了 10 dB 且相位相反:
现在应该清楚了,反相对 来说并不重要spect
。本答案的其余部分将此问题视为已解决。
为了进行比较:原始歌曲 1 的一个通道的音量降低了 10 dB:
由于单独对通道进行了标准化,原始歌曲的详细“结构”仍然可见。
同一首歌曲 1,其中一个频道完全静音:
上述结果一一对应。从左到右:
- 真正的立体声
- 真正的立体声,不平衡
- 一个频道沉默
- 假立体声
- 假立体声,不平衡
笔记:
- 如果我操纵另一个通道,蓝色或红色伪影可能是另一种颜色。细节很重要,而不是颜色。
- “真正的立体声,不平衡”仍然是真正的立体声。“不平衡”意味着一个声道的音量不如另一个声道大。在这里,我操纵了原始文件来实现这一点。一般来说,原始录音可能是这样的。这并不意味着有人篡改了文件。
示例 – 歌曲 2
.wav
这是经过处理的第一首歌曲的原版spect
:
这首歌的声道分离不如第一首那么清晰,没有红色或蓝色的柱状图。但有些频率的红色多于蓝色。随着歌曲的进行,特性发生了几次变化。这表明这是真正的立体声。
数乌鸦——琼斯先生
不同的结果并排摆放。从左到右:
- 真正的立体声
- 真正的立体声,不平衡
- 一个频道沉默
- 假立体声
- 假立体声,不平衡
就像歌曲 1 一样,您可以通过观察详细的“结构”来辨别真正的立体声。
示例 – 歌曲 3
这首歌实际上是单声道的。单声道信号被录制到(我怀疑)立体声磁带上。从磁带中翻录成立体声,每个声道的磁带噪音也不同。
没有详细的“结构”,只有噪音。这表明通道之间的差异基本上只是噪音。该diff
方法的结果不会是无声的,尽管对于这个确切的.wav
文件,该方法是可行的,因为我可以播放结果并听到它的噪音。
对于不平衡输入,如果您先进行标准化,diff
/方法可能会起作用。我们的系统会自动执行此操作。顺便说一下,不平衡歌曲 3 的处理方式如下:sum
spect
spect
最后说明
- 长时间
.wav
“压缩”到.png
800 像素覆盖整个持续时间可能看起来像噪音。一个合理的方法是改进,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,则它是单声道,但有一个声道被反转。
如何使用scipy
和audio2numpy
库来实现这一点:
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 位。