21. AI 语音助手小车
本课程将把你的 PiCar-X 变成一台 由AI驱动的轮式语音助手。 机器人能够通过你的语音唤醒,识别你说的话,用情绪化的声音回应, 并通过动作、手势和灯光来“表达”它的情感。
你将构建一个 完全交互式的语音助手小车,使用以下组件:
LLM - 大语言模型(OpenAI GPT 或 豆包 Doubao)。
STT - 语音转文本(语音识别)。
TTS - 文本转语音(语音合成)。
传感器 + 动作 - 超声波、摄像头以及内置的情绪表达动作。
开始之前
请确保你已经完成以下步骤:
安装所有模块(重要) — 安装
robot-hat、vilib、picar-x模块,然后运行脚本i2samp.sh。1. 测试 Piper — 检查 Piper TTS 支持的语言。
2. 测试 Vosk — 检查 Vosk STT 支持的语言。
18. 连接在线 LLM — 这一步 非常重要:获取你的 OpenAI 或 豆包 Doubao API key,或其他支持的 LLM 的 API key。
你还需要具备:
PiCar-X 上可用的 麦克风 和 扬声器。
已在
secret.py中存储的 有效 API key。稳定的网络连接(推荐使用 有线连接 以获得更高稳定性)。
运行示例
中英文两个版本的示例文件都放在同一个目录下:
cd ~/picar-x/example
英文版本 (使用 OpenAI GPT,英文指令):
sudo python3 21.voice_active_car_gpt.py
LLM:
OpenAI GPT-4o-miniTTS:
en_US-ryan-low(Piper)STT: Vosk(
en-us)
唤醒词:
"Hey buddy"
—
中文版本 (使用 豆包 Doubao,中文指令):
sudo python3 21.voice_active_car_doubao_cn.py
LLM:
Doubao-seed-1-6-250615TTS:
zh_CN-huayan-x_low(Piper)STT: Vosk(
cn)
唤醒词:
"你好 滴滴"
备注
你可以在代码中修改 唤醒词 和 机器人名称:
NAME = "Buddy" 或 NAME = "滴滴"
WAKE_WORD = ["hey buddy"] 或 WAKE_WORD = ["你好 滴滴"]
运行效果
当你成功运行这个示例后:
机器人会 等待唤醒词 (例如 “Hey Buddy” / “你好 滴滴”)。
当它听到唤醒词时:
LED 会 闪烁 并保持亮起。
机器人会用愉快的声音 问候你。
随后它开始 实时监听你的声音。
当识别出你说的话后,它会:
将你的语音发送给 LLM (OpenAI 或 豆包 Doubao)。
在处理时 思考 并闪烁 LED。
用 TTS 语音 回复你。
执行 相应的动作 (例如:点头、转向、庆祝)。
如果你靠得太近,超声波传感器会:
自动触发 后退 以保证安全。
打断当前回合并给出警告提示。
示例交互
You: Hey Buddy
Robot: Hi there!
You: Turn left and look around.
Robot: Roger that, turning my head left like a curious cat!
ACTIONS: turn_left, look_left
切换其他 LLM 或 TTS
你可以通过简单修改代码轻松切换到其他 LLM、TTS 或 STT 语言:
支持的 LLM:
OpenAI
豆包 Doubao
Deepseek
Gemini
Qwen
Grok
1. 测试 Piper — 检查 Piper TTS 支持的语言。
2. 测试 Vosk — 检查 Vosk STT 支持的语言。
要切换,只需修改代码的初始化部分:
from picarx.llm import Gemini as LLM
llm = LLM(api_key="YOUR_KEY", model="gemini-pro")
# 设置模型和语言
TTS_MODEL = "en_US-ryan-low"
STT_LANGUAGE = "en-us"
动作与声音参考
以下是 LLM 可以返回的 动作关键词 (位于 ACTIONS: 行之后)及其在机器人上的对应效果。
动作 |
功能说明(per preset_actions.py) |
效果 / 备注 |
|---|---|---|
|
快速左右摆动摄像头水平角度,幅度逐渐减小,然后回到中间。 |
“否”的手势;车轮保持停止。 |
|
上下点头两次,然后回到中间。 |
“是”的手势;车轮保持停止。 |
|
倾斜摄像头,然后方向舵左右摆动两次(±25°),再回中。 |
调皮挥手(使用转向舵机模拟“手臂”)。 |
|
小幅倾斜;交替(转向 ±15°,水平 ±15°)3 次;停止并回中。 |
“拒绝”/防御动作。 |
|
低头;向前/后快速小幅度移动(短暂电机脉冲),然后复位。 |
俏皮可爱的小动作;移动时间很短。 |
|
小幅左右摆动方向舵(±6°)5 次,然后复位。 |
模仿“搓手”动作。 |
|
平滑向右转头 + 低头 + 向右打方向;短暂停顿;摆出“思考”姿势;复位。 |
用于单次“思考”动画。 |
|
三个循环:短暂前进/停止/左转头/左打方向,然后短暂后退/停止/右转头/右打方向。 |
模仿“扭动身体”动作。 |
|
抬头;向右两次转头+打方向,再向左两次;最后回中。 |
欢快庆祝动作。 |
|
多次下压头部,角度和间隔变化;最后长暂停并复位。 |
“伤心”姿态序列。 |
移动与实用功能
动作 |
功能说明 |
备注 |
|---|---|---|
|
以低速前进约 1 秒,然后停止。 |
由 |
|
以低速后退约 1 秒,然后停止。 |
由 |
音效
声音 |
功能说明 |
备注 |
|---|---|---|
|
异步播放 |
通过 |
|
异步播放 |
启动 / 就绪提示音。 |
传感器触发(自动)
超声波接近
触发条件:距离 < 10 cm
副作用:自动
backward+ 本轮禁用图像注入消息:
<<<Ultrasonic sense too close: {distance}cm>>>
生命周期钩子(LED 指示)
before_listen→ 闪烁两次(准备聆听)before_think→ 闪烁(思考中)before_say→ LED 常亮(说话中)after_say→ 等待动作完成 → LED 熄灭on_stop→ 停止动作,关闭设备
故障排查
机器人对唤醒词没有反应
检查麦克风是否正常工作。
确保
WAKE_ENABLE = True。调整唤醒词以匹配你的发音。
扬声器没有声音
验证 TTS 模型设置。
手动测试 Piper 或 Espeak。
检查扬声器连接与音量。
API Key 错误或超时
在
secret.py中检查你的密钥。确保网络连接正常。
确认所用 LLM 受支持。
Picar-X 不移动或不执行动作
检查动作名称是否与
actions_dict匹配。验证电机与舵机连接。
超声波传感器频繁误触发。
检查传感器的安装高度与角度。
在代码中调整
TOO_CLOSE距离阈值。