嵌入式语音开发应用基础说明

发布时间:2026/6/17 14:20:22
嵌入式语音开发应用基础说明
嵌入式语音应用相关基础说明 ...... 矜辰所致前言博主之前也没有太深入了解过嵌入式语音有关的应用之前做的语音项目都直接使用的成品语音模块最近遇到了需要低成本的解决方案所以还得来了解一下嵌入式语音开发的一些基本内容毕竟理论了解是我们在后期做语音应用时候的根本 。所以本文我们主要就是来了解一下嵌入式语音方案相关的基础知识 。我是矜辰所致全网同名尽量用心写好每一系列文章不浮夸不将就认真对待学知识的我们矜辰所致金石为开目录前言一、 嵌入式语音相关基础说明1.1 嵌入式语音采样率1.2 位深/声道1.3 语音码率二、 实现相关2.1 语音采样收音2.2 语音编解码2.3 语音传输2.4 语音播放三、 FFmpeg 工具的使用3.1 什么是 FFmpeg3.2 FFmpeg 下载安装3.3 FFmpeg 常用命令3.4 语音开发应用相关命令3.4.1 生成 PCM3.4.2 压缩3.4.3 把 PCM 转成 WAV3.4.4 查看音频文件3.4.5 播放音频文件3.4.6 小结结语一、 嵌入式语音相关基础说明本文主要针对通用单片机方案不包含高端专业的语音芯片1.1 嵌入式语音采样率在嵌入式语音方案中常用的采样率基本就两种 8KHz 和 16 KHz 。这可不是随便挑的而是基于 人声物理特性、奈奎斯特定理、行业标准和硬件成本 决定的。人声频率范围人耳能听 20Hz~20KHz 正常成年人说话时产生的声波信号主要集中在300Hz到 3400Hz 之间其中清晰传递语音信息的关键频段为300Hz-3000Hz。低于300Hz 的声音影响音色饱满度高于 3400Hz 的成分对语音清晰度贡献较小但是高于 3400Hz ~ 8KHz 的频率包括摩擦音、唇齿音细节会使得音质更加自然。所以语音只要保留到 4KHz采样率 8KHz语音就可懂这也是 传统通话标准 G.711 标准使用的采样率。语音保留到 8KHz采样率 16KHz 就更加自然这是 现在 主流 AI 语音的标准采样率。为什么采样率要是语音频率的 2 倍通信界有一条铁律—奈奎斯特采样定理 采样率 ≥ 2 × 信号最高频率采样率 ≥ 2 × 声音最高频率的 2 倍才能保证声音传到单片机后不失真、不发生重叠。为什么其他频率不可以首先对于单片机本身单片机的外设时钟源基本都是晶振分频8K 16K 可以通过从常规晶振整数分频得到误差小非常规频段无法精确分频得到这样采样和播放时候的音质都会收到影响。其次是整个语音算法、协议、生态完全不兼容所以其他频段并无太大意义。在单片机应用中采样率决定了单片机的硬件定时器触发频率8K 采样率定时器 1 秒中断 8000 次16K 采样率定时器 1 秒中断 16000 次。除了 采样率还有一个位深单声道双声道码率等概念下面也需要了解一下。1.2 位深/声道位深 每个采样点用多少位bit来存储幅度值一般就是 8bit 和 16bit 。8bit 256 个音量等级档位少声音容易有 “阶梯感”、发闷16bit : 65536个音量等级过渡平滑人声细节保留完整。当然16 位深的数据量相比 8 位直接翻倍。单声道 / 双声道对于语音来说单声道完全够用双声道几乎不提升效果只会徒增数据量也是翻倍、带宽、功耗只有音乐 / 立体音效场景双声道才有意义。1.3 语音码率上面我们说的 8K 和 16K 是 “采样率 ” 不是码率码率也叫比特率是指音频在播放或传输时一秒钟要消耗/产生多少个“比特bit”的数据。它的单位是 bpsBits Per Second比特/秒 或 Kbps千比特/秒。简单来说码率 这一秒钟声音占用的网络流量/存储空间有多大。在未压缩的原始 PCM 状态下码率是由你前面总结的“三要素”共同乘出来的。码率bps 采样率 ✖ 位深 ✖ 声道数注意这是相对原始 PCM 来说的如果是有压缩那么码率就不是这么对应的。比如以前的固定电话标准8KHz 语音参数采样率 8kHz、位深 8bit、单声道码率8000×8×164000 bps64 Kbps这就是 PSTN 电话、G.711 经典 64Kbps 的由来。现在的主流 AI 语音标准参数采样率 16kHz、位深 16bit、单声道码率16000×16×1256000 bps256 Kbps在单片机应用中码率决定了 Flash 空间够不够用如果使用无线传输比如蓝牙也要看蓝牙带宽够不够用。所以原始的 PCM 相对比较大语音应用中可以使用编码压缩的方式减少码率以获得更小的资源需求 。二、 实现相关2.1 语音采样收音连续的声音能够采集播放的原理就像高速连拍照片连起来就是视频。快速播放一串按时间排列的电压数字。收音流程 麦克风 → 模拟 → 数字 PCM使用 咪头采集原始的声音通过 ADC 采集电压值把人声变成PCM脉冲编码调制原始的数字音频编码方式。。比如 每 1/16000 秒16K采样率 采样一次电压把电压通过 ADC 转成数字这些数字排成一串就是 PCM 数据PCM 就是原始声音数字版没有压缩。采样得到的PCM 会很大。比如上面我们16K 采样用 12bit ADC那么1S 理论数据如下16,000 × 12 bit 192,000 bit 24,000 Byte 23.4375 KB 。在很多应用上 12bit 的数据应该会对齐到 16bit 放置一是为了 CPU 访问速度二是正好变成标准的 16位深的 PCM 所以实际上的数据大小会变成16,000 × 16 bit 256,000 bit 32,000 Byte 31.25 KB 。至于 MIC 采集 有机会的话我们再来单独说明但是这里先记录一下MIC 采集电路的输出静态电压是主要是由 MIC 的 供电电压 和偏置电阻 决定的MIC 内部就是一个 可变电容 内置 JFET场效应管.2.2 语音编解码编码就是将收音过程采集到的 PCM 按照规定的标准进行压缩。解码就是把压缩的数据还原成PCM。因为原始的 PCM 数据会很大在一些应用中要尽可能的压缩。在接收端再进行解码操作。通过上文的学习我们可以从理论上分析压缩的好处压缩算法改变的是什么 原始 16kHz 的声音原始码率256 Kbps太高蓝牙传输容易卡顿可以使用 ADPCM 压缩算法压缩后采样率依然是 16kHz声音的音质、高频细节完全没有变单片机定时器依然是一秒中断 16000 次。但是位深从 16bit 变成了 4bit。重新计算压缩后的码率16,000 × 4 ×1 64,000 bps 64 Kbps。结果码率从 256 Kbps 掉到了 64 Kbps蓝牙传输数据量缩减到 1/4但音质没有发生断崖式下跌。单片机方案常用编码方式有SBC、OPUS、ADPCM、CVSD编解码主要使用场景典型工作码率音质核心特点软件实现难易Opus高清语音、游戏低延迟语音16~64 kbps最高高清语音、超低延迟、自适应码率难算法复杂内存和算力开销大SBC蓝牙 A2DP 音乐 / mSBC 语音127~328 kbps音乐~64 kbps语音 mSBC较高音乐最低要求蓝牙音乐标准所有蓝牙音箱/耳机必支持中等有开源库纯 C 可移植ADPCM低码率语音、对讲、BLE 语音32~64 kbps4:1 压缩后一般语音可听清差分量化极省 Flash 和 CPU容易算法简单内存占用低SpeexVoIP、网络对讲、嵌入式语音通信8~32 kbps中等语音可懂专为语音优化支持降噪/回声消除中等有开源库纯 C 可移植内存占用较小CVSD老式蓝牙 HFP 通话64 kbps较差语音可懂但粗糙传统蓝牙通话老旧设备标配容易2.3 语音传输语音传输比如使用 BLE 无线传输一个核心的点就是蓝牙的传输速率。对于目前市面上的稍微正规一点厂商的蓝牙芯片来说一般都能做到 100Kb/s 完全能够满足一般语音数据收发要求比如博主测试过的 沁恒微的 CH585 最大可以达到 140 kB/s 。比如我们上面算出来 即便是 16K/16bit/单声道无压缩的 PCM 每秒的实际大小位 31.25 KB/s , 在蓝牙信号正常的情况下实时传输也是不会卡顿的具体应用实现当然还需要注意实现方式等一些细节问题。2.4 语音播放这里介绍实际应用中常见的几种语音播放方案PWM 模拟音频方案低成本、省芯片原理利用单片机内部的定时器产生高频 PWM 波。通过快速改变 PWM 的占空比Duty Cycle来模拟电压的高低变化。驱动方式也分为两种低成本单路 PWM ( RC滤波) 功放小攻放/三极管。缺点音质较差。进阶版双 PWM互补输出 H桥芯片如数字功放 IC。这种方式属于 Class-DD类功放原型。它利用 H桥直接驱动喇叭效率极高、省电、推力大在智能门锁、警报器里非常普及。缺点占用两个 IO 高频噪声大需要用电感/电容做低通滤波LC滤波否则喇叭容易发热、有杂音。外接 I2S DAC 功放芯片方案通过 I2S 总线把标准的 S16LE 裸数字直接扔给专门的音频芯片。单片机只需要把内存里的 PCM 数据搬运到 I2S 寄存器解码、放大、驱动全由外接芯片搞定。优点音质极好芯片内部集成了高精度的硬件 DAC 和 D类功放自带完美的滤波电路声音非常干净、清脆。缺点多了一颗芯片的成本。单片机自带内部 DAC 方案部分MCU支持有些单片机内部自带硬件数模转换器DAC。它能直接输出真正的模拟电压信号接一个普通的模拟功放就能放音。三、 FFmpeg 工具的使用介绍一款语音应用需要用到的工具 。3.1 什么是 FFmpegFFmpeg Fast Forward Mpeg是一套免费开源的、跨平台的音视频处理命令行工具。它能读、写、转换、剪辑、录制、直播几乎任何格式的音频和视频是专门用于音频和视频的编码、解码、转码等操作的开源软件。3.2 FFmpeg 下载安装FFmpeg 官网下载地址如下https://www.ffmpeg.org/download.html上面最显眼的那个下载是源码给底层开发人员用的。在 Windows 下面使用通过下面 Windows 图标那里选择下载选择 Windows builds by BtbN 这是去 FFmpeg builds 的 github 页面我们按照下图方式选择最新的 win64 版本点击即可下载下载好以后解压出来接下来就是添加环境变量这个和我们很多工具链一样bin 下面就是可以使用命令行的工具我们需要把 bin 的路径添加到系统环境变量现在找的系统找环境变量可以直接打开 win 输入环境变量搜索就可以直接找出来添加完环境变量我们可以在 CMD 命令提示符里面输入 ffmpeg 如果命令有效表示我们安装成功如下图3.3 FFmpeg 常用命令现在有 AI 一般需要用到什么命令可以现场找 AI 问即可这里就简单的列举几个常用命令了具体的实际应用需要的时候临时问就行了。文件信息查看ffprobe# 简易查看音视频参数ffprobe input.mp4# json结构化输出脚本批量解析用ffprobe input.mp4-verror-show_format-show_streams-print_formatjson视频格式互转# 最简转码自动编码ffmpeg-iinput.mkv output.mp4 ffmpeg-iinput.mp4 output.avi# 限定码率压缩视频ffmpeg-iinput.mp4-b:v1200k-b:a128k output.mp4# 只封装不重新编码(极速拷贝)ffmpeg-iinput.mov-ccopy output.mp4视频裁剪、片段截取# 从10秒开始截取20秒# 从 00:01:30 开始截取 10 秒# -ss 放前面 快 -ss 放后面 准ffmpeg-iinput.mp4-ss00:00:10-t20-ccopy cut.mp4 ffmpeg-ss00:01:30-t10-iinput.mp4-ccopy output.mp4# 精准起止时间ffmpeg-iinput.mp4-ss00:00:05-to00:00:25 cut.mp4视频提取音频# 提取mp3 -vn Video None 不要视频ffmpeg-iinput.mp4-vnoutput.mp3 ffmpeg-iinput.wav output.mp3# 提取aacffmpeg-iinput.mp4-vn-c:aaac output.aac# 提取无损wavffmpeg-iinput.mp4-vn-c:apcm_s16le output.wav音频通用处理# mp3-wav互转ffmpeg-iinput.mp3 output.wav# 音量放大1.8倍ffmpeg-iin.wav-afvolume1.8out.wav# 多音频拼接ffmpeg-ia.wav-ib.wav-filter_complexamixinputs2out.wav视频截图ffmpeg-iinput.mp4-ss00:00:05-vframes1output.jpg3.4 语音开发应用相关命令在单片机语音开发中随着需求的变化常用的 FFmpeg 命令主要分为 三大类生成裸数据、高压缩比导出、以及录音验证。先记几个参数-ar16000→ 采样率 16k-ac1→ 单声道-fs16le → 16bit 单片机标准PCM-ab64k → 码率 64k-acodecsbc → 编码格式 SBC蓝牙语音3.4.1 生成 PCMffmpeg-i输入文件-ar16000-ac1-fs16le 输出.pcm任意音频 生成 16K/16-bit/单声道 标准 PCM// 不仅仅是.mp3 支持其他的格式都支持 .flac .aac .mp4 ffmpeg-i111.mp3-fs16le-ar16000-ac1output.pcm-i 111.mp3输入你原始的文件。这里不仅仅是 mp3 支持基本上电脑能播放的格式都可以支持直接转成规定格式的 pcm无论是 .wav、.ogg、.flac、.aac还是视频格式 .mp4、.avi、.mkv 。-f s16le16bit 位深小端单片机标准格式。强制输出格式为 s16le有符号 16 位小端格式。这可以让 FFmpeg 剥离掉所有文件头如 WAV 头只留下纯电压数字数字流。单片机读取后可以直接赋值给 int16_t 数组。-ar 16000设置采样率为 16kHz 。-ac 1设置声道数为单声道。output.pcm输出文件名。任意音频 转成 8k 电话音质 PCMffmpeg-iinput.mp3-ar8000-ac1-fs16le output_8k.pcm3.4.2 压缩比如 sbcffmpeg-i输入文件-acodecsbc-ab64k-ar16000-ac1输出.sbc# SBCffmpeg-i111.mp3-acodecsbc-ab64k-ar16000-ac1111s.sbc# ADPCM 它能把 16 位的数据变成 4 位4-bit。ffmpeg-i111.mp3-acodecadpcm_ima_wav-ar16000-ac1output_adpcm.wav# opusffmpeg-i111.mp3-acodeclibopus-b:a16k-ar16000-ac1output.opus-b:a 16k把声音码率比特率压到 16 Kbps每秒只需要 2 KB 的流量。Opus 的压缩率是很强的2 KB/s 的声音听起来依然非常清晰。但是单片机想要解压它需要跑非常复杂的数学公式浮点运算/高内存占用3.4.3 把 PCM 转成 WAV调测单片机录音功能时需要用到当我们使用 麦克风咪头和 ADC 录制用户说话时候单片机录下来并存在 Flash 里的数据是 没有格式信息的裸数据PCM把这个文件拉到电脑上电脑是打不开的。我们可以用 FFmpeg 转成标准 WAV 来听听录音质量。ffmpeg-fs16le-ar16000-ac1-imcu_record.pcm out.wav这里要注意参数顺序-f s16le -ar 16000 -ac 1这三个参数被提到了 输入文件 -i 的前面这是在告诉 FFmpeg 这是单片机裸数据格式“这个 mcu_record.pcm 没有任何文件头它是用单片机按照有符号16位、16kHz、单声道录出来的。你必须强行用这个规格去读取它 ” 。-i mcu_record.pcm单片机录的音output.wav电脑可播放。3.4.4 查看音频文件查看采样率 位深声道码率编码格式ffmpeg-i111.mp3示例3.4.5 播放音频文件对于常规的音频文件直接 使用ffplay工具播放即可此类文件 文件头自带参数不需要手动之指定格式 ffplay 文件名.mp3 ffplay 文件名.wav对于裸的 PCM # 命令1省略声道参数ffplay.exe-fu8-ar8000444.pcm# 命令2显式指定单声道ffplay.exe-fu8-ar8000-ch_layoutmono444.pcm上面对于指定参数的解释如下-f u8-f format指定输入文件封装 / 采样格式 :u8 无符号 8 位原始音频s8 8bit 采集后软件去直流s16le 有符号 16 位小端 PCM,小端存储MCU 标准字节序s16be 大端几乎不用仅老式设备。.-ar audio rate音频采样率8000 8kHz每秒采集 8000 个声音采样点常用还有 16k 16000.-ch_layout mono声道布局配置替代老旧废弃的 -ac 1mono 单声道音频只有 1 路声道嵌入式 MIC 录音全部用单声道3.4.6 小结FFmpeg 官方文档现在主推新写法比如我们上面的一条语句ffmpeg-i111.mp3-acodecsbc-ab64k-ar16000-ac1111s.sbc新写法会写成如下ffmpeg-i111.mp3-c:asbc-b:a64k-ar16000-ac1out.sbc在语音方面新老写法改变的地方就 2 个指定音频编码器老写法-acodec sbc新写法-c:a sbc-acodec变成了-c:a设置音频码率老写法-ab 64k老写法-b:a 64k-ab变成了-b:a总结来说语音开发记住这 5 个写法就够了-c:a编码器sbc /opus/adpcm /pcm告诉 FFmpeg 用什么算法来压缩或处理声音-b:a码率32k / 64k告诉 FFmpeg 一秒钟的数据量要限制在多大只有在用压缩编码器时才需要它原始 PCM 裸数据不需要它-ar采样率16K / 8K告诉 FFmpeg 一秒钟截取多少个声音电压点它直接决定了单片机定时器中断的频率-ac声道1 单声道基本上嵌入式语音写 1 就行了-f指定输出格式s16le 16bit PCM告诉 FFmpeg 直接剥离所有文件头输出纯采样数据直接 bin2hex 烧录芯片结语本文我们了解了一些关于语音开发的基础知识了解了语音采集播放实际应用的大概流程方案以及介绍了一款很有用的音视频工具 FFmpeg 及其在语音开发时候的常用命令希望对大家有所帮助后期如果有一些实际的应用案例博主也会来给大家记录分享。好了本文就到这里。谢谢大家