[具身智能-633]:语音 PCM 超通俗精讲(嵌入式 / 树莓派 / RK3588 专用)
一、什么是 PCM
PCM = 脉冲编码调制语音从麦克风进来:模拟声波→ ADC 采样 → 变成一个个数字采样点 → 连续排列就是 PCM
它是所有语音格式的原始底层裸数据,WAV/MP3/OPUS 本质都是包裹或压缩后的 PCM。
二、语音 PCM 四个核心参数(必记)
语音工程固定标配:
- 采样率:16000Hz(人声标准),其次 8000Hz
- 位深:16bit(2 字节 / 采样点)
- 声道:单声道 Mono
- 字节序:小端序 Little-Endian(ARM 树莓派 / RK 全是小端)
标准语音 PCM 规格:
16k 16bit 单声道 小端 PCM
三、算一笔关键账(工程必用)
1. 一个采样点大小
16bit =2 字节
2. 每秒字节数
16000×2Byte=32000 字节/秒
- 1 秒语音 PCM =32KB
- 1 分钟:1920000 字节 ≈ 1875KB
四、PCM 长什么样
没有文件头、没有标识、纯二进制流水:
plaintext
[2字节采样点1][2字节采样点2][2字节采样点3]...特点:
- 只有原始波形数据
- 不存采样率、位深、声道
- 必须代码里手动约定参数才能解析
五、PCM 和 WAV 的区别
- PCM:纯裸流,无头部,播放器打不开,只能程序解析
- WAV:44 字节文件头 + 后面跟着 PCM去掉 WAV 前 44 字节,剩下就是标准 PCM。
六、PCM 常见存储 / 文件后缀
.pcm、.raw、.bin都是语音裸 PCM
七、Python 读写 PCM 代码示例
1. 录音存为纯 PCM
python
运行
import pyaudio FORMAT = pyaudio.paInt16 CHANNELS = 1 RATE = 16000 CHUNK = 1024 RECORD_SECONDS = 5 p = pyaudio.PyAudio() stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK) print("录制PCM中...") frames = [] for _ in range(int(RATE / CHUNK * RECORD_SECONDS)): data = stream.read(CHUNK) frames.append(data) # 写入纯PCM,无任何头 with open("voice_16k_16bit_mono.pcm", "wb") as f: f.write(b"".join(frames)) stream.stop_stream() stream.close() p.terminate() print("PCM保存完成")2. 读取 PCM 转波形 / 音量
python
运行
import numpy as np # 固定参数,必须和录制时一致 RATE = 16000 CHANNELS = 1 SAMPLE_WIDTH = 2 with open("voice_16k_16bit_mono.pcm", "rb") as f: pcm_data = f.read() # 转成int16波形数组 waveform = np.frombuffer(pcm_data, dtype=np.int16) print("采样点总数:", len(waveform)) print("平均音量:", np.abs(waveform).mean())八、开发板应用场景
树莓派 4B/5、RK3568/RK3588:
- 音频采集 → 直接输出16k 16bit 单声道 PCM
- 送入 VAD 静音检测、语音识别模型、降噪算法
- 网络传输前先拿 PCM 再编码 OPUS/AMR
- 本地缓存存 PCM 效率最高、CPU 开销最小
九、快速总结
- PCM 是语音最原始裸数据
- 工业语音统一标准:16k 16bit 单声道小端
- 无文件头,靠代码约定参数
- WAV = 头 + PCM;PCM 是去掉头的裸流
- 语音 AI、嵌入式开发优先用 PCM
