python - Soundfile 以两种不同的格式导入音频
问题描述
我正在尝试使用 预处理要在神经网络中使用soundfile.read()
的音频文件,但是对于具有相同采样率和长度的不同 .FLAC 文件,该函数对返回的数据进行了不同的格式化。例如,调用data, sr = soundfile.read(audiofile1)
生成一个具有形状的数组data.shape = (48000, 2)
(其中单个元素的值是幅度,0 或 NumPy float64 中的负幅度),而调用data, sr = soundfile.read(audiofile2)
生成一个具有形状的数组data.shape = (48000,)
(其中单个元素的值在 NumPy float64 中变化)。
此外,如果有帮助的话,audiofile1
是从通过 PyAudio 拍摄的录音中提取的录音,而是audiofile2
来自 LibriSpeech 语料库的样本。
所以,我的问题是双重的:
为什么会soundfile.read()
产生两种不同的数据格式,如何确保该函数将来返回相同格式的数组?
解决方案
您的audiofile2
样本是单声道的,而您的audiofile1
录音是立体声的(即您可能使用配置了的 PyAudio 流录制它channels=2
)。所以我建议您首先弄清楚您的应用程序需要单声道还是立体声。
如果您真正关心的是单声道音频信号,您可以通过平均声道将立体声(或更一般的 N 声道)音频转换为单声道:
data, sr = soundfile.read(audiofile)
if np.dim(data)>1:
data = np.mean(data,axis=1)
如果您需要立体声音频,那么您可以通过复制您拥有的通道来创建一个附加通道(尽管这不会添加通常的附加信息,例如不同通道之间的相位或幅度差异):
if np.dim(data)<2:
data = np.tile(data,(2,1)).transpose()
推荐阅读
- angular - 如何通过 Visual Studio 2017 为 .Net Core 2.1 项目添加 Angular Material
- git - 将 sql server 数据库提交到源代码控制
- laravel - 我正在使用 jorenvanhocht/laravel-share 包使用 laravel 共享,但是当我在社交网站上共享时它不显示预览或缩略图
- ios - 无法使用 firebase ML 套件检测眨眼事件
- create-react-app - 如何调整画布大小?
- c# - 我可以在仍然使用 DbContext 的同时调用未等待的 Async 方法并返回响应吗?
- sql-server - cte 和申报联盟
- sql - 在插入之前执行存储过程以更新每一行
- shell - 在 kibana 仪表板中经常观察到 Forbitten 异常
- python - 如何仅使用 Python 对文本文件执行一些操作