2

我正在处理的一些音频文件有一个令人讨厌的属性:它们有两个通道,但一个是空的。这比单声道更糟糕,因为操作系统很乐意在左右立体声扬声器上播放单声道音轨,但这些文件仅在(例如)左扬声器上播放。

我想用 PyDub 检测到这一点,但我有点卡住了。如果我知道一个文件是坏的,我可以这样做:

import pydub
bad_sample = pydub.AudioSegment.from_mp3('bad_file.mp3')
mono_sample = bad_sample.set_channels(1)
mono_sample.export('mono_file.mp3')

到目前为止,一切都很好。但我不知道如何自动检测一个是否坏。

隔离每个通道并检查其中一个是否为空应该就足够了。我的尝试是做类似的事情:

import numpy as np
assert bad_sample.sample_width == 2  # hence int16
a = np.fromstring(bad_sample._data,
                  dtype=np.int16)
a = a.reshape((bad_sample.channels, bad_sample.frame_count()))
left = a[0, :]
right = a[1, :]

但是这个坏文件似乎都不是空的,这表明我没有正确阅读格式。

一个例子是: http: //www.newsonair.com/writereaddata/bulletins/Aurangabad-Marathi-Regional-Bulletins-38645.mp3

谁能建议一种简单的方法来拆分通道并检测空通道?

4

1 回答 1

2

好的,事实证明我的步幅顺序错误。这有效:

def is_bad_mono(segment):
    if segment.channels != 2:
        return False
    a = np.fromstring(segment._data, dtype=np.uint16)
    a = a.reshape(( int(segment.frame_count()), 2 ))
    threshold = 0.3
    return ((a[:, 0] == 0).mean() > threshold or (a[:, 1] == 0).mean() > threshold)

基本上,只要步幅正确,单声道坏的情况就比任何真正的声音通过时的频率要多得多。

希望这对其他人有帮助:)

于 2015-04-12T06:17:54.380 回答