这是我的第418篇原创文章。
一、引言
在处理音频信号时,左右声道分离是一个非常常见的需求,尤其是在音频分析、声道处理和音频特效设计中。今天,我将分享如何使用 Python 的 Soundfile 库实现这一功能,通过几个步骤帮助大家理解整个过程。这一博文将集中在如何把立体声音频分离成左右声道,分析交互过程,并进行性能优化。
二、实现过程
2.1 分析原始音频文件
代码:
input_audio = AudioSegment.from("./test.ogg")
print(f"采样率:{input_audio.frame_rate}Hz")
print(f"声道数: {input_audio.channels}")
print(f"位深: {input_sample_width*8}位")
print(f"时长: {len(input_audio)}ms")
结果:
可见原始音频采样率为8k,双声道,位深度32,时长22520ms。
2.2 提取左声道
左声道:
channels = input_audio.split_to_mono()
channel_audio = channels[0]
channel_audio = channel_audio._spawn(channel_audio.raw_data, overides={"sample_width":2})"})
bytes_io = io.BytesIO()
channel_audio.export(
bytes_io,
format="wav",
parameters=["-ar", str(channel_audio.frame_rate), "-f", "s32le", "-ac": "1"]
)
left_bytes = bytes_io.getvalue()
with open("test_left.wav", "wb") as f:
f.write(left_bytes)
结果:
提取后的音频为单声道,位深度变为之前的一半,采样率和时长没有发生变化。
2.3 提取右声道
右声道:
channels = input_audio.split_to_mono()
channel_audio = channels[1]
channel_audio = channel_audio._spawn(channel_audio.raw_data, overides={"sample_width":2})"})
bytes_io = io.BytesIO()
channel_audio.export(
bytes_io,
format="wav",
parameters=["-ar", str(channel_audio.frame_rate), "-f", "s32le", "-ac": "1"]
)
right_bytes = bytes_io.getvalue()
with open("test_right.wav", "wb") as f:
f.write(right_bytes)
结果:
提取后的音频为单声道,位深度变为之前的一半,采样率和时长没有发生变化。
2.4 合并为双声道
左右声道合并为双声道:
left_audio = AudioSegment.from_wav("test_left.wav")
right_audio = AudioSegment.from_wav("test_right.wav")
merged = AudioSegment.from_mono_audiosegments(left_audio, right_audio)
merged.export("test_merged.wav", format="wav")
结果:
作者简介:
读研期间发表6篇SCI数据挖掘相关论文,现在某研究院从事数据算法相关科研工作,结合自身科研实践经历不定期分享关于Python、机器学习、深度学习、人工智能系列基础知识与应用案例。致力于只做原创,以最简单的方式理解和学习,关注我一起交流成长。需要数据集和源码的小伙伴可以关注底部公众号添加作者微信。