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

如何将16kHz int16 PCM格式.wav数据导出为C数组格式文本文件

报错原因
  • 你调用numpy.ndarray.tofile的方式错误:tofile是numpy数组的实例方法,需要用你读取到的pcm数组对象调用,不能直接通过numpy.ndarray类传入文件对象调用
  • numpy.array(a[1])这行没有赋值给变量,转换后的数组没有被后续使用
  • 直接用tofile输出的只有纯数值,没有C数组的格式定义,没法直接复制到C程序里用
最简修复(仅解决报错,输出纯逗号分隔数值)
from scipy.io.wavfile import read
import numpy

sample_rate, pcm_data = read("sound.wav")
fd = open("wav_array.txt", 'w')
# 用数组实例调用tofile
pcm_data.tofile(fd, ', ')
fd.close()
更实用的C数组格式输出方案

直接输出带结构的C数组定义,复制即可用,支持十进制/十六进制两种格式:

from scipy.io.wavfile import read
import numpy as np
# 可选:屏蔽wav元数据不识别的警告
import warnings
from scipy.io.wavfile import WavFileWarning
warnings.filterwarnings("ignore", category=WavFileWarning)

# 读取并确认数据格式
sample_rate, pcm_data = read("sound.wav")
pcm_data = pcm_data.astype(np.int16) # 强制转成你需要的int16格式

# 输出配置
array_name = "sound_16k_pcm"
output_hex = False # 改成True就输出十六进制格式
val_per_line = 16 # 每行放多少个数值,方便阅读

with open("wav_c_array.txt", "w", encoding="utf-8") as f:
    # 写入C数组头部定义
    f.write(f"/* 16kHz采样率 int16格式PCM数据 */\n")
    f.write(f"const int16_t {array_name}[{len(pcm_data)}] = {{\n")
    for idx, val in enumerate(pcm_data):
        if output_hex:
            # 十六进制输出,处理负数补码
            f.write(f"0x{val & 0xFFFF:04X}, ")
        else:
            # 十进制输出,对齐格式
            f.write(f"{val:6d}, ")
        # 每行满指定数量就换行
        if (idx + 1) % val_per_line == 0:
            f.write("\n")
    # 写入数组尾部和辅助参数
    f.write("\n};\n\n")
    f.write(f"const uint32_t {array_name}_sample_rate = {sample_rate};\n")
    f.write(f"const uint32_t {array_name}_length = {len(pcm_data)};\n")

运行后打开wav_c_array.txt就可以直接把内容复制到C代码中使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:39:00