当前位置: 首页 > news >正文

[具身智能-633]:语音 PCM 超通俗精讲(嵌入式 / 树莓派 / RK3588 专用)

一、什么是 PCM

PCM = 脉冲编码调制语音从麦克风进来:模拟声波→ ADC 采样 → 变成一个个数字采样点 → 连续排列就是 PCM

它是所有语音格式的原始底层裸数据,WAV/MP3/OPUS 本质都是包裹或压缩后的 PCM。

二、语音 PCM 四个核心参数(必记)

语音工程固定标配

  1. 采样率16000Hz(人声标准),其次 8000Hz
  2. 位深16bit(2 字节 / 采样点)
  3. 声道单声道 Mono
  4. 字节序小端序 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:纯裸流,无头部,播放器打不开,只能程序解析
  • WAV44 字节文件头 + 后面跟着 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 开销最小

九、快速总结

  1. PCM 是语音最原始裸数据
  2. 工业语音统一标准:16k 16bit 单声道小端
  3. 无文件头,靠代码约定参数
  4. WAV = 头 + PCM;PCM 是去掉头的裸流
  5. 语音 AI、嵌入式开发优先用 PCM
http://www.jsqmd.com/news/790833/

相关文章:

  • SuperDuper框架:AI模型与数据库的无缝集成与向量搜索实践
  • 为Claude Code配置Taotoken解决封号与Token不足问题
  • 基于Simulink的SVG无功补偿装置谐波治理仿真​
  • N_m3u8DL-RE:如何5分钟掌握跨平台流媒体下载与解密核心技术?
  • 别再乱调字体了!Qt界面开发中QSS字体属性(font-family, size, weight)的实战避坑指南
  • CVT算法实战踩坑记:从点云到三角网格,我遇到的三个‘坑’及填坑方案
  • TikTok评论采集终极指南:3步轻松获取完整评论数据,无需编程技能
  • AI原生持续集成实战手册(SITS 2026 CI/CD for LLM全栈适配白皮书)
  • [具身智能-634]:语音全链路:通道 → PCM 编码 → 传输格式 → 存储格式 → WAV 文件
  • 2026新式酸奶饮品模式爆火,健康与口感成为竞争关键点 - 博客湾
  • 为什么ChatGPT Enterprise没敢用SITS 2026?——对话状态持久化设计中的3个IEEE标准冲突点(附合规改造路径)
  • NadirRouter/NadirClaw:高性能网络数据采集与智能代理路由实战指南
  • 独立开发者如何利用Taotoken管理多个个人项目的AI调用成本
  • TikTokCommentScraper:创新智能的抖音评论自动化采集解决方案,让数据驱动决策变得简单
  • 第51篇:Vibe Coding时代:LangGraph + 权限系统实战,解决 Agent 谁都能改代码、调用工具的安全问题
  • with open() 打开文件 文件被占用 except PermissionError
  • 深度测评2026年三星SDI电池和三星道达尔化工原料权威榜单
  • BurpMCP:基于MCP协议实现AI辅助渗透测试的实践指南
  • 3步实现Illustrator到Photoshop的矢量图层转换:为什么Ai2Psd是设计师必备工具?
  • 给数字IC新人的保姆级指南:用PrimeTime(PT)做STA到底在分析什么?
  • [具身智能-635]:不同常规音频文件,差别在于对数据的压缩,但都是时域波形
  • 从Qclaw-old项目考古看旧代码库的技术价值与重构实践
  • 5分钟快速诊断Windows热键冲突:Hotkey Detective完整使用指南
  • Python开发者快速集成Gemini API:HanaokaYuzu/Gemini-API工具包实战指南
  • UnblockNeteaseMusic完整指南:一键解锁网易云音乐灰色歌曲的终极解决方案
  • C语言实战:辗转相除法实现分数约分
  • Netgear路由器终极救援指南:如何用开源工具nmrpflash拯救“变砖“设备
  • 别再被Nouveau卡住了!Ubuntu 22.04 LTS下NVIDIA驱动保姆级安装与卸载指南
  • ARM64 汇编编写的 Web 服务器 ymawky:功能特性、安全措施与配置说明
  • Vue项目引入vue-particles插件避坑指南:从安装到性能优化的全流程