You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

适配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 12:15:42