如何将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
相关产品推荐
相关产品推荐

