教程:VENTUNO Q/本地 AI 语音助手:修订间差异
导入 VENTUNO Q 中文教程 |
导入 VENTUNO Q 中文教程 |
||
| 第6行: | 第6行: | ||
如果您可以构建一个可以'''本地'''完成所有这些操作的智能扬声器,该怎么办? | 如果您可以构建一个可以'''本地'''完成所有这些操作的智能扬声器,该怎么办? | ||
https://cdn.jsdelivr.net/gh/arduino/docs-content@main/content/hardware/ventuno/boards/ventuno-q/tutorials/use-cases/local-ai-assistant/assets/thumbnail-ai-assist.png | |||
本应用说明将指导您创建一个离线的、隐私优先的语音助手。使用 Arduino® VENTUNO™ Q 及其内置神经处理单元 (NPU),我们将在边缘运行大型语言模型 (LLM) 和高保真文本转语音。设置后无需云、无需订阅、无需互联网。 | 本应用说明将指导您创建一个离线的、隐私优先的语音助手。使用 Arduino® VENTUNO™ Q 及其内置神经处理单元 (NPU),我们将在边缘运行大型语言模型 (LLM) 和高保真文本转语音。设置后无需云、无需订阅、无需互联网。 | ||
| 第20行: | 第22行: | ||
# '''大型语言模型(LLM)''':操作的大脑。它读取您转录的文本并使用本地 <code>genie:qwen3-4b</code> 模型生成智能响应。 | # '''大型语言模型(LLM)''':操作的大脑。它读取您转录的文本并使用本地 <code>genie:qwen3-4b</code> 模型生成智能响应。 | ||
# '''Kokoro TTS(自定义Brick)''':一种高保真、自定义集成的文本转语音引擎,可将 LLM 的文本响应转换回音频波形,以便通过 USB 扬声器播放。 | # '''Kokoro TTS(自定义Brick)''':一种高保真、自定义集成的文本转语音引擎,可将 LLM 的文本响应转换回音频波形,以便通过 USB 扬声器播放。 | ||
https://cdn.jsdelivr.net/gh/arduino/docs-content@main/content/hardware/ventuno/boards/ventuno-q/tutorials/use-cases/local-ai-assistant/assets/system-arch.png | |||
<span id="goals"></span> | <span id="goals"></span> | ||
| 第61行: | 第65行: | ||
将 USB 扬声器和 USB 麦克风连接到 VENTUNO Q 上的 USB-A 端口。 | 将 USB 扬声器和 USB 麦克风连接到 VENTUNO Q 上的 USB-A 端口。 | ||
https://cdn.jsdelivr.net/gh/arduino/docs-content@main/content/hardware/ventuno/boards/ventuno-q/tutorials/use-cases/local-ai-assistant/assets/usb-audio-new.png | |||
<span id="2-powering-the-board"></span> | <span id="2-powering-the-board"></span> | ||
| 第68行: | 第74行: | ||
同时运行多个人工智能模型需要稳定、强劲的电源。 | 同时运行多个人工智能模型需要稳定、强劲的电源。 | ||
https://cdn.jsdelivr.net/gh/arduino/docs-content@main/content/hardware/ventuno/boards/ventuno-q/tutorials/use-cases/local-ai-assistant/assets/power-options.gif | |||
强烈建议使用通过桶形插孔或端子块连接的 '''12V 至 24V 直流电源''' 为 VENTUNO Q 供电。 | 强烈建议使用通过桶形插孔或端子块连接的 '''12V 至 24V 直流电源''' 为 VENTUNO Q 供电。 | ||
| 第82行: | 第90行: | ||
下载应用程序的 <code>.zip</code> 文件并将其导入到您的 Arduino App Lab 工作区: | 下载应用程序的 <code>.zip</code> 文件并将其导入到您的 Arduino App Lab 工作区: | ||
[https://github.com/mcmchris/keyword-asr-local-llm-kokoro-tts/releases/download/v1.0.2/Keyword-ASR-Local-LLM-Kokoro-TTS.zip | [https://github.com/mcmchris/keyword-asr-local-llm-kokoro-tts/releases/download/v1.0.2/Keyword-ASR-Local-LLM-Kokoro-TTS.zip | ||
https://cdn.jsdelivr.net/gh/arduino/docs-content@main/content/hardware/ventuno/boards/ventuno-q/tutorials/use-cases/local-ai-assistant/assets/download-app-new.png | |||
] | |||
* '''本地LLM + Kokoro TTS:''' ([https://github.com/mcmchris/keyword-asr-local-llm-kokoro-tts/releases/download/v1.0.2/Keyword-ASR-Local-LLM-Kokoro-TTS.zip Download Link]) - 终极离线体验。使用自定义Brick进行高保真离线语音合成。 | * '''本地LLM + Kokoro TTS:''' ([https://github.com/mcmchris/keyword-asr-local-llm-kokoro-tts/releases/download/v1.0.2/Keyword-ASR-Local-LLM-Kokoro-TTS.zip Download Link]) - 终极离线体验。使用自定义Brick进行高保真离线语音合成。 | ||
下载完成后,导入到ArduinoApp Lab,如下: | 下载完成后,导入到ArduinoApp Lab,如下: | ||
https://cdn.jsdelivr.net/gh/arduino/docs-content@main/content/hardware/ventuno/boards/ventuno-q/tutorials/use-cases/local-ai-assistant/assets/import-app.png | |||
<span id="1-project-ai-models"></span> | <span id="1-project-ai-models"></span> | ||
| 第97行: | 第109行: | ||
我们的助手需要知道何时开始倾听。对于唤醒词,您有两种选择: | 我们的助手需要知道何时开始倾听。对于唤醒词,您有两种选择: | ||
https://cdn.jsdelivr.net/gh/arduino/docs-content@main/content/hardware/ventuno/boards/ventuno-q/tutorials/use-cases/local-ai-assistant/assets/keyword-spotting.png | |||
<span id="option-a-the-custom-ventuno-wake-word-recommended"></span> | <span id="option-a-the-custom-ventuno-wake-word-recommended"></span> | ||
| 第117行: | 第131行: | ||
在您的关键字识别Brick上,选择要使用的模型: | 在您的关键字识别Brick上,选择要使用的模型: | ||
https://cdn.jsdelivr.net/gh/arduino/docs-content@main/content/hardware/ventuno/boards/ventuno-q/tutorials/use-cases/local-ai-assistant/assets/kws-model.png | |||
<blockquote> | <blockquote> | ||
| 第130行: | 第146行: | ||
在您的大型语言模型 (LLM) Brick 上,'''下载'''模型 <code>Qwen 3-4B Instruct</code>。 | 在您的大型语言模型 (LLM) Brick 上,'''下载'''模型 <code>Qwen 3-4B Instruct</code>。 | ||
https://cdn.jsdelivr.net/gh/arduino/docs-content@main/content/hardware/ventuno/boards/ventuno-q/tutorials/use-cases/local-ai-assistant/assets/llm-model.png | |||
<blockquote> | <blockquote> | ||
| 第143行: | 第161行: | ||
在您的自动语音识别模型 (ASR) Brick 上,'''下载'''模型 <code>Whisper Small (quantized)</code>。 | 在您的自动语音识别模型 (ASR) Brick 上,'''下载'''模型 <code>Whisper Small (quantized)</code>。 | ||
https://cdn.jsdelivr.net/gh/arduino/docs-content@main/content/hardware/ventuno/boards/ventuno-q/tutorials/use-cases/local-ai-assistant/assets/asr-model.png | |||
<blockquote> | <blockquote> | ||
| 第225行: | 第245行: | ||
当 Linux 后端处理繁重的人工智能任务时,VENTUNO Q 的嵌入式微控制器 (MCU) 负责实时硬件控制,具体来说,驱动板载 8×13 LED 矩阵。 | 当 Linux 后端处理繁重的人工智能任务时,VENTUNO Q 的嵌入式微控制器 (MCU) 负责实时硬件控制,具体来说,驱动板载 8×13 LED 矩阵。 | ||
https://cdn.jsdelivr.net/gh/arduino/docs-content@main/content/hardware/ventuno/boards/ventuno-q/tutorials/use-cases/local-ai-assistant/assets/LED-matrix.png | |||
由于 Python 和 C++ 在板上的不同环境中运行,因此它们通过 <code>Bridge</code> 实用程序使用远程过程调用 (RPC) 进行通信。Python脚本充当“大脑”,广播状态机的当前步骤,而C++草图充当“肌肉”,监听这些状态变化以触发相应的视觉动画。 | 由于 Python 和 C++ 在板上的不同环境中运行,因此它们通过 <code>Bridge</code> 实用程序使用远程过程调用 (RPC) 进行通信。Python脚本充当“大脑”,广播状态机的当前步骤,而C++草图充当“肌肉”,监听这些状态变化以触发相应的视觉动画。 | ||
2026年9月28日 (一) 06:01的最新版本
简介
Alexa 或 Google Home 等语音助手非常方便,但它们严重依赖云计算。每次您说话时,您的声音都会被记录下来,通过互联网发送,在大型数据中心进行处理,然后发回。
如果您可以构建一个可以本地完成所有这些操作的智能扬声器,该怎么办?
本应用说明将指导您创建一个离线的、隐私优先的语音助手。使用 Arduino® VENTUNO™ Q 及其内置神经处理单元 (NPU),我们将在边缘运行大型语言模型 (LLM) 和高保真文本转语音。设置后无需云、无需订阅、无需互联网。
系统架构: Arduino App Lab Brick
Arduino App Lab 通过称为 Bricks 的模块化块使复杂的 AI 工作流程变得简单。为了构建我们的助手,我们将把这些特定组件链接在一起:
- 麦克风:从 USB 麦克风捕获原始音频的硬件接口。
- 关键字识别 (KWS):一种轻量级、始终在线的 AI 模型,专门监听唤醒词。
- 自动语音识别 (ASR):唤醒后,此 Brick 会将您的口头命令转录为文本。
- 大型语言模型(LLM):操作的大脑。它读取您转录的文本并使用本地
genie:qwen3-4b模型生成智能响应。 - Kokoro TTS(自定义Brick):一种高保真、自定义集成的文本转语音引擎,可将 LLM 的文本响应转换回音频波形,以便通过 USB 扬声器播放。
目标
本教程的主要目标是:
- 构建一个功能齐全、能够进行自然对话的离线语音助手。
- 了解如何在单个 Arduino App Lab 应用程序中互连标准和自定义 AI 应用程序 Brick。
- 了解如何在运行繁重的本地 LLM 时有效管理硬件资源(CPU、NPU 和 RAM)。
硬件与软件要求
硬件要求
- Arduino® VENTUNO™ Q (x1)
- USB-A 扬声器或耳机 (x1)
- USB-A 麦克风 (x1)(或组合耳机/扬声器)
- Arduino® USB-C Power Supply (65W)\*
\*可以使用 7-24 V 范围内且 ≥ 3 A 的其他电源。有关更多信息,请参阅User Manual - Power Section。
软件要求
- Arduino App Lab
- Edge Impulse Studio account(可选,适用于自定义关键字模型)
注意:
您可以使用相同的Arduino帐户登录Edge Impulse Studio。
AI助手系统设置
1. 硬件设置
将 USB 扬声器和 USB 麦克风连接到 VENTUNO Q 上的 USB-A 端口。
2. 为董事会提供动力
同时运行多个人工智能模型需要稳定、强劲的电源。
强烈建议使用通过桶形插孔或端子块连接的 12V 至 24V 直流电源 为 VENTUNO Q 供电。
在这个特定的语音助手应用程序中,系统消耗大约 11 W 的功率。但是,如果您计划扩展应用程序或连接额外的高功率 USB 外围设备,功耗可能会激增。因此,建议使用额定大于 60W 的电源,以确保最大稳定性并防止繁重任务处理期间出现断电。
系统概览
项目下载
下载应用程序的 .zip 文件并将其导入到您的 Arduino App Lab 工作区:
- 本地LLM + Kokoro TTS: (Download Link) - 终极离线体验。使用自定义Brick进行高保真离线语音合成。
下载完成后,导入到ArduinoApp Lab,如下:
1. 项目AI模型
关键词发现模型
我们的助手需要知道何时开始倾听。对于唤醒词,您有两种选择:
选项 A:自定义“Ventuno”唤醒词(推荐)
我们训练了一个高度优化的关键字识别模型,可以对 “Ventuno” 一词做出反应。
- 转到这个公共 Edge Impulse 项目:Ventuno Keyword Model。
- 将项目克隆到您自己的 Edge Impulse 帐户。
- 将您的 Edge Impulse 帐户与 Arduino App Lab 环境配对。在关键字识别 Brick 配置中选择此模型。
- 在Python代码中,使用:
spotter.on_detect("Ventuno", on_keyword_detected)。
选项 B:默认“Hey Arduino”唤醒词
如果您不想使用自定义关键字,则可以使用内置模型。
- 在关键字识别Brick配置中选择默认模型。
- 在Python代码中,将检测行更改为:
spotter.on_detect("hey_arduino", on_keyword_detected)。
在您的关键字识别Brick上,选择要使用的模型:
注意:
在Custom AI Models guide了解更多信息。
本地大语言模型
在您的大型语言模型 (LLM) Brick 上,下载模型 Qwen 3-4B Instruct。
警告:
运行App前请务必下载,如果缺少模型将导致运行失败。
自动语音识别模型
在您的自动语音识别模型 (ASR) Brick 上,下载模型 Whisper Small (quantized)。
警告:
运行App前请务必下载,如果缺少模型将导致运行失败。
2. 理解代码
该应用程序依靠状态机架构来管理不同的人工智能模型,而不会导致电路板崩溃。系统在四种状态之间移动:IDLE (0)、LISTENING (1)、PROCESSING (2) 和 SPEAKING (3)。
让我们看看使该应用程序顺利运行的关键概念和可配置设置:
1. 自定义Bricks集成
该项目利用了自定义Bricks功能。由于高级 Kokoro TTS 模型不是标准内置Brick的一部分,因此它直接捆绑到bricks/kokoro_tts/目录下的项目中。这允许 Python 后端像任何本机组件一样无缝导入它 (from kokoro_tts import KokoroTTS)。
说明:
了解有关自定义 Brick 的更多信息 Blog Post
2. 麦克风架构和硬件管理
如果关键字识别(始终监听)和 ASR(监听命令)同时访问音频流,则它们可能会发生冲突。我们实例化两个单独的 Microphone 对象来安全地处理这个问题。
此外,运行 8GB LLM 模型会导致内存总线上出现大量数据流量。为了防止资源匮乏和容器崩溃,我们在 LLM 唤醒之前引入了重要的硬件延迟:
# Releasing audio channels safely before waking up the NPU
time.sleep(1.5)
mic_asr.stop()
这 1.5 秒的睡眠就像一个红绿灯,让 CPU 有足够的时间在 LLM 消耗内存带宽之前和平地关闭麦克风连接。
3. 上下文注入和时区配置
本地法学硕士无法访问互联网来检查当前时间。为了解决这个问题,我们使用了一种称为上下文注入的技术。该脚本读取硬件时钟,并在向法学硕士询问答案之前显式地将当前时间注入到不可见的提示中。
由于 Python 脚本在隔离容器内运行,因此默认为 UTC 时间。您必须使用ZoneInfo模块配置您的本地时区,以便助手提供准确的本地时间。
# Configurable Timezone: Change "America/Santo_Domingo" to your local timezone
time_zone = ZoneInfo("America/Santo_Domingo")
local_time = datetime.now(time_zone)
formatted_time = local_time.strftime("%I:%M %p, %A, %B %d, %Y")
注意:
您可以在 Time Zone Database 中找到您的特定时区字符串。
4. 音频输出配置(ALSA路由)
Kokoro TTS Brick 生成临时 .wav 文件,我们使用带有 plughw 标志的原生 ALSA aplay 命令。这会强制音频传输到特定的硬件端口,并自动动态转换采样率。
# Configurable Audio Output: Change '1,0' to match your specific hardware
os.system(f"aplay -D plughw:1,0 {wav_path} -q")
注意:
要查找您的设备号码,请打开 Arduino App Lab 终端并输入
aplay -l。如果您的耳机列为card 1和device 0,您将使用plughw:1,0。
5. MCU角色和RPC桥
当 Linux 后端处理繁重的人工智能任务时,VENTUNO Q 的嵌入式微控制器 (MCU) 负责实时硬件控制,具体来说,驱动板载 8×13 LED 矩阵。
由于 Python 和 C++ 在板上的不同环境中运行,因此它们通过 Bridge 实用程序使用远程过程调用 (RPC) 进行通信。Python脚本充当“大脑”,广播状态机的当前步骤,而C++草图充当“肌肉”,监听这些状态变化以触发相应的视觉动画。
在Python方面(main.py):
每当 AI 管道转换到新阶段(例如,从监听到处理)时,Python 都会通过 Bridge 发送带有新状态整数的 RPC 调用:
# Broadcast the state change to the MCU
# 0 = IDLE, 1 = LISTENING, 2 = PROCESSING, 3 = SPEAKING
Bridge.call("set_state", 1)
在 C++ 方面 (sketch.ino):
MCU 在其设置阶段为 set_state 命令注册一个侦听器。当它从Python接收到RPC有效负载时,它会更新currentState变量,该变量会立即改变LED矩阵的渲染逻辑以匹配助手的行为(例如从扫描动画切换到语音波形)。
#include <Arduino_RouterBridge.h>
int currentState = 0;
// Function triggered remotely by Python
void setSystemState(int state) {
// Constrain ensures we only receive valid states (0-3)
currentState = constrain(state, 0, 3);
if (currentState == 1) {
scanPos = 0.0; // Reset scanner position when starting to listen
}
}
void setup() {
// ... Matrix initialization ...
Bridge.begin();
// Map the "set_state" RPC call to our C++ function
Bridge.provide("set_state", setSystemState);
}
void loop() {
// Render different animations based on the state sent by Python
if (currentState != 0) {
renderMatrix();
} else {
matrix.clear(); // Clear the screen in IDLE mode
}
delay(30); // ~33 FPS for smooth animations
}
人工智能助手演示
现在您的VENTUNO Q已开机并且项目已导入,是时候运行应用程序并与您的AI助手进行交互了!请按照以下简单步骤操作:
- 检查模型: 确保已下载所有 AI 模型(请参阅Project AI Models)。
- 运行应用程序:单击ArduinoApp Lab中的运行按钮。
警告:
第一次可能需要一段时间。正在安装自定义 Brick 依赖项。
- 唤醒助手: 对着 USB 麦克风清楚地说出您配置的唤醒词(例如“Ventuno”)。
- 等待视觉提示: 等待 LED 矩阵亮起,扫描动画开始。此动画是您的硬件确认,自动语音识别 (ASR) 处于活动状态并正在录制。
- 说出你的命令:自然地提出你的问题或说出你的命令(例如,“日本的首都是什么?”或“告诉我一个小笑话”)。
- 听听回应: 当法学硕士思考时,LED 矩阵会减慢扫描速度。一旦响应准备好,矩阵将切换到有机语音波形动画,您将通过 USB 扬声器听到助手的智能语音。
故障排除
即使是最聪明的助手有时也会遇到问题。以下是最常见的问题以及解决方法:
- 应用程序立即崩溃并显示
no microphone device found:
该应用程序需要活动音频输入流才能启动关键字识别程序块。在单击 Arduino App Lab 中的“运行”按钮之前,请确保您的 USB 麦克风已牢固插入 USB-A 端口。
- 助理忽略唤醒词“Ventuno”:
如果您说“Ventuno”,但 LED 矩阵从未亮起,则系统可能会监听默认的“Hey Arduino”触发器。如果自定义模型配置不正确,就会发生这种情况。返回 关键词发现模型 部分,并确保您已在关键字识别 Brick 配置中选择克隆的 Edge Impulse 模型。
- 法学硕士回应,但你什么也没听到:
如果 LLM 生成响应,但音频无法通过耳机或扬声器播放,则 Linux 正在将 .wav 文件路由到错误的硬件地址。打开 App Lab 终端,运行 aplay -l,然后更新 Python 脚本中的 plughw:1,0 参数以匹配您的特定 USB 音频设备卡和设备编号。
- “AI思考”期间主板重启或应用程序崩溃:
如果系统在 ASR 完成且 LLM 开始处理后立即崩溃,则表明您遇到了电源限制。将 8GB 模型加载到内存时,NPU 会产生电流尖峰。确保使用强大的直流电源(12V-24V,>60W)为 VENTUNO Q 供电。
- 助理给出了错误的时间:
Python 容器默认以 UTC 运行。如果助手告诉您伦敦的时间而不是您当地城市的时间,请找到 Python 脚本中的 ZoneInfo("America/Santo_Domingo") 行并将其更新为您当地的 IANA timezone。
总结
通过将 VENTUNO Q 的硬件功能与自定义 Brick 相结合,我们成功构建了一个完全在您桌面上的强大语音助手。您学习了如何编排多个 AI 模型、处理内存带宽限制、配置系统级时区以及路由 ALSA 音频硬件。
后续步骤
现在您已经有了本地人工智能大脑,您可以将其提升到一个新的水平:
- 利用
Bridge RPC让您的语音助手根据您的语音命令控制物理继电器、LED 或电机。 - 创建自定义 Brick 以集成 Spotify 支持或 Google Assistant SDK 来控制您的家用电器。
- 尝试使用 Cloud LLM Brick 让您的 AI 助手从互联网收集更新信息。
- 调整Python代码中的
system_prompt,为你的助手提供独特的个性或特定的规则约束。
原文:https://docs.arduino.cc/tutorials/ventuno-q/local-ai-assistant/ 本页为 Arduino 官方教程的中文翻译,供内部查阅。命令与代码保持原文。
]