gpt4 book ai didi

python - 如何使用 pydub 检测空的立体声 channel

转载 作者:太空宇宙 更新时间:2023-11-04 03:34:53 25 4
gpt4 key购买 nike

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

我想用 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')

到目前为止一切顺利。但我无法弄清楚如何自动检测一个是否是坏的。

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

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

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

最佳答案

好吧,原来我的步幅顺序错了。这有效:

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)

基本上,只要步幅正确,坏的单声道情况下为零的频率远远高于它们在任何真实声音通过时应有的频率。

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

关于python - 如何使用 pydub 检测空的立体声 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29586106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com