适配EfficientConformer:如何获取无头部PCM音频文件的长度?
解决无头部PCM文件的音频长度获取问题
你的问题出在Tensor维度转换的错误上,以下是具体分析和修复方案:
问题根源
原代码中:
waveform = Tensor(signal).unsqueeze(0).t() audio_length = waveform.size(1)
signal是一维numpy数组(形状为(N,),N是实际样本数),转成Tensor后仍是(N,)unsqueeze(0)将其变为(1, N)(对应torchaudio输出的(声道数, 样本数)格式)- 后续的
.t()转置操作把二维张量转成了(N, 1),此时size(1)取的是第二个维度的大小,自然得到1,而非实际样本数。
正确的实现方式
方式1:从读取的信号直接获取长度
这是最直接的方式,无需多余维度操作:
import numpy as np import torch signal = np.memmap(audio_path, dtype='h', mode='r').astype('float32') if np.sum(np.abs(signal)) <= 80: raise ValueError(f'[WARN] Silence file in {audio_path}') signal = signal / 32767 # 归一化 # 转换为符合torchaudio格式的waveform (声道数, 样本数) waveform = torch.Tensor(signal).unsqueeze(0) # 获取音频长度:取样本数维度的大小 audio_length = waveform.size(1) # 或者更简单:直接用numpy数组的长度 audio_length = len(signal)
方式2:通过文件大小计算(无需读取全部数据)
对于无头部的16位单声道PCM文件,每个样本占2字节,可直接通过文件字节数计算样本数:
import os file_size = os.path.getsize(audio_path) # 单声道int16格式,样本数 = 文件字节数 // 2 audio_length = file_size // 2
这种方法适合大文件,无需加载整个音频到内存。
验证方案
可以同时用两种方式获取长度并校验,确保文件是合法的16位单声道PCM:
# 读取信号得到的长度 signal_length = len(signal) # 文件大小计算的长度 file_calc_length = os.path.getsize(audio_path) // 2 assert signal_length == file_calc_length, "文件格式异常,不是标准的16位单声道PCM"
内容的提问来源于stack exchange,提问作者Alpha Code
相关产品推荐
相关产品推荐

