利用RP2350微控制器构建完整的语音交互系统
大多数语音助手需要Wi-Fi、云API和强大的处理器。本项目完全在Raspberry Pi Pico 2上运行实用的语音识别和文本转语音功能,该微控制器拥有520 KiB内存和4 MiB闪存。
使用Moonshine Micro,你将构建出固件,实现以下功能:
- 检测语音开始和结束(语音活动检测) - 辨识孤立的字母和数字(例如,说出“bee”时识别出b) - 使用设备本地的神经网络TTS技术将结果回声播放出来
整个流程(包括对数梅尔频谱前端、VAD、SpellingCNN分类器以及神经网络语音合成器)均在设备本地运行,无需联网。从“听到一个字母并将其回声输出”到完成整个过程的端到端延迟约为0.7–1.0秒。
你可以通过两种方式尝试:
•快速入门(推荐先尝试):使用笔记本电脑作为USB麦克风和扬声器,无需焊接。
•独立运行:连接I2S麦克风和I2S放大器,使Pico无需笔记本电脑即可工作。
•额外功能:在Pico 2 W上,通过语音完全配置WiFi。
工作原理
默认应用(moonshine_micro_echo)会持续运行以下流程:
•麦克风(16 kHz PCM)
•MelStreamer(32 ms 跳跃帧)
•TinyVadCNN(语音/非语音识别)
•[语音结束时] 1 秒剪辑
•SpellingCNN(50 类字母/数字/命令模型)
•神经TTS(RVQ解码器 + WORLD-lite 声码器)
•扬声器
VAD、STT 和 TTS 共享约 384 KiB 的张量内存空间,它们并不需要同时使用全部的 RAM。SpellingCNN 通过 CMSIS-NN 在两个核心上运行,可实现约 1.6 倍的速度提升。
词汇表(50 个词项):孤立字母 a–z、数字词(零到九)以及命令词(wifi、ip、yes、no、delete、finish 等)。这并非开放词汇语音系统,我们预计每句语音大约持续 1 秒,对应一个词项。
步骤 1:克隆仓库
本教程假设您拥有 Mac 或 Linux 机器,并使用辅助脚本编译和刷入软件。虽然 Windows 上也可以运行,但此处不包含相关说明。
如果您尚未下载 Pico SDK,还需下载 Arm 工具链以配合使用。请设置环境变量(根据您的设备调整路径):
在搭载 Apple Silicon 的 macOS 系统中,工具链路径可能如下所示:
步骤 2:构建固件
首次构建会编译 TensorFlow Lite Micro 和 Pico SDK,可能需要几分钟时间。后续重建速度会快得多。
生成的文件存放在 build/examples/rp2350/ 目录下,默认的回声应用为 moonshine_micro_echo.uf2。
故障排除:如果出现“无法读取 spec 文件 'nosys."步骤1:配置参数,删除 build/ 目录,并使用 PICO_TOOLCHAIN_PATH 指定为 Arm GNU 13.3(而非 Homebrew 中较新的 arm-none-eabi-gcc)重新配置。
步骤3:刷入 Pico 2
按住 Pico 上的 BOOTSEL 键,插入 USB 线缆后松开 BOOTSEL 键,此时板子应作为 USB 设备挂载。
刷机:
flash.sh 会等待 BOOTSEL 按下并复制 UF2 文件。可选变体包括:echo、test、mic、speaker、echo_hardware、wifi、wifi_hardware。
步骤4:测试功能(通过 USB 桥接,无需额外硬件)
刷入固件后,你的笔记本电脑将作为 Pico 的麦克风和扬声器使用。
重要提示:切勿在桥接运行 monitor.sh 脚本,两者都需要串口支持。
清晰地朗读一个字母或数字(约1秒)。你应该能看到:
并通过笔记本电脑的扬声器听到合成的回应。
桥接是回合制的:当Pico进行分类和讲话时(约0.5–1秒),主机会暂停麦克风录音,以避免播放过时的音频。
macOS提示:如果显式传递--serial参数,请使用/dev/cu.usbmodem*(而非/dev/tty.*)。
步骤5(可选):连接真实的I2S麦克风和扬声器
对于独立设备,使用两个不重叠的GPIO引脚上的Adafruit扩展板:
•麦克风:GP0(数据)、GP1(BCLK)、GP2(LRCLK)——LRCLK必须为BCLK + 1
•放大器:GP10(DIN)、GP11(BCLK)、GP12(LRC)——遵循相邻引脚规则
麦克风(SPH0645至Pico)
将麦克风电源设置为3.3V,而不是5V。
扬声器放大器(MAX98357A至Pico)
将一个4–8Ω的扬声器连接到放大器的正负极。不要接地任一端子(桥接输出)。
逐步配置硬件
对着麦克风说话;Pico会识别并通过扬声器回话,即使没有笔记本电脑在音频路径中。
步骤6(可选):语音Wi-Fi设置(Pico 2 W)
在Pico 2 W上,Wi-Fi固件会通过语音引导你连接网络:
•说“wifi”,设备将扫描附近的网络。
•拼出SSID名称的前几个字母,当唯一时即可解析。
•说“finish”确认,或输入“yes/no”。
•逐个输入密码字符(星号、美元符号、下划线、大写字母、删除键等)。
•连接后说“ip”以听到DHCP地址。
构建并刷入固件:
用于完全独立的WiFi设置(I2S麦克风+扬声器,无笔记本电脑音频):
监控串行输出
在单独的终端中(运行USB桥接时不要使用):
您将看到启动横幅、VAD开始/结束、RESULT信息以及WiFi状态。固件使用USB CDC标准输入输出(UART关闭)。
性能预期:
在RP2350上运行250 MHz(双核固件):
•VAD — 每32毫秒帧约3毫秒
•STT(1秒片段)— 约314毫秒
•TTS(字母回复)— 0.4至0.7秒
•总分类+语音输出时间 — 约0.7–1.0秒
神经TTS运行速度接近实时合成速率。演示模型仅识别孤立的字母和数字,不支持连续语音或北约字母名称(如“alpha”、“bravo”)。
进一步扩展:
•自定义词汇表:Moonshine Micro STT训练。
•模块文档:VAD、STT、Neural TTS。每个都是可重用的CMake库。
•主机单元测试:在没有硬件的情况下,在您的PC上运行模块逻辑:
•完整技术参考:micro/examples/rp2350/README.md,包含内存预算、编译选项和模型详情。
结论
你用一款不到10美元的微控制器实现了完整的语音交互系统:无需依赖云API,即可实现语音检测、字母和数字识别以及语音回复合成。Moonshine Micro 也采用类似的流程来开发更丰富的嵌入式产品(如自定义词汇表、区域特定模型等)。
本文编译自hackster.io





