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

如何将NumPy音频数组写入无头部的uLaw编码WAV块?

解决方案:生成无头部uLaw编码音频流

你遇到的问题是因为使用soundfile写入WAV格式时,库会自动添加RIFF容器头。要生成无头部的uLaw数据,需要直接输出纯编码后的原始字节流,而非封装成WAV格式。以下是两种可行实现:

方案1:用soundfile直接写入RAW格式(最简单)

将格式参数从WAV改为RAW,soundfile就会跳过容器头,仅输出uLaw编码的原始字节:

import soundfile as sf
from io import BytesIO

# audio为numpy数组(如float32类型,范围[-1, 1],采样率8000)
audio_len = len(audio)
chunkLen = int(0.030 * 8000)

for i in range(0, audio_len, chunkLen):
    chunk = audio[i:min(i+chunkLen, audio_len)]
    buffered = BytesIO()
    # 关键:使用RAW格式避免生成文件头
    sf.write(buffered, chunk, samplerate=8000, format="RAW", subtype="ULAW")
    buffered.seek(0)
    yield buffered.read()

该方案依赖soundfile,但代码改动极小,且能自动处理输入音频格式到uLaw的转换(支持float32、int16等常见线性PCM格式)。

方案2:手动实现uLaw编码(无额外依赖)

如果不想依赖第三方库,可基于numpy实现G.711标准的uLaw编码,直接生成纯字节流:

import numpy as np

# G.711 uLaw标准参数
ULAW_MAX = 32767  # 16位PCM最大值
ULAW_BIAS = 0x84   # 编码偏移量
ULAW_MASK = 0x7F   # 8位uLaw掩码

def ulaw_encode(samples):
    # 将float类型音频转换为int16(范围[-32767, 32767])
    if samples.dtype in (np.float32, np.float64):
        samples = (samples * ULAW_MAX).astype(np.int16)
    elif samples.dtype != np.int16:
        raise ValueError("输入音频应为float32/64或int16类型")
    
    # 处理符号位与绝对值
    sign = np.sign(samples)
    abs_samples = np.abs(samples)
    
    # 对数编码核心逻辑
    abs_samples += ULAW_BIAS
    log_vals = np.log2(abs_samples)
    exponent = np.floor(log_vals).astype(np.int8)
    mantissa = np.floor((abs_samples / (2 ** exponent)) - 1).astype(np.int8)
    
    # 组合成uLaw字节:符号位+阶码+尾码,最后反转掩码
    ulaw_bytes = ((sign < 0).astype(np.uint8) << 7) | (exponent << 4) | (mantissa & 0x0F)
    ulaw_bytes ^= ULAW_MASK
    
    return ulaw_bytes.tobytes()

# 分块处理音频
audio_len = len(audio)
chunkLen = int(0.030 * 8000)

for i in range(0, audio_len, chunkLen):
    chunk = audio[i:min(i+chunkLen, audio_len)]
    yield ulaw_encode(chunk)

两种方案输出的字节流均不会包含RIFF标识,完全符合无头部uLaw文件的要求。

内容的提问来源于stack exchange,提问作者demid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 23:25:59