.. _py_voice_active_gpt:
18. 与 GPT 进行语音对话
============================
本示例结合了 :ref:`py_stt`、:ref:`py_tts` 和一个基于 GPT 的 LLM,
创建了一个完全语音交互的机器人。PiCrawler 监听唤醒词,理解您的语音,
以 AI 生成的对话回复,并根据上下文执行物理动作。
.. note::
本项目依赖 **VoiceActiveCrawler** 类。请确保 ``voice_active_crawler.py``
文件存在于 examples 目录中。同时创建包含 ``OPENAI_API_KEY`` 的
``secret.py`` 文件。如果尚未获取 API 密钥,请参阅 :ref:`py_online_llm`
(OpenAI 部分)了解详细步骤。
**运行代码**
.. raw:: html
.. code-block::
cd ~/picrawler/examples
sudo python3 18_voice_active_crawler_gpt.py
运行后,机器人初始化:
- STT 引擎用于语音识别
- TTS 引擎(Piper)用于语音回复
- LLM 客户端(GPT-4o-mini)用于 AI 对话
- 唤醒词检测器
机器人会用欢迎消息问候您。说出唤醒词(例如 "Hey Buddy")开始对话。
按 **Ctrl+C** 退出。
**代码**
.. note::
您可以**修改/重置/复制/运行/停止**\ 以下代码。但在此之前,您需要进入源代码
路径,如 ``picrawler\examples``。修改代码后,可以直接运行以查看效果。
.. raw:: html
.. code-block:: python
from picrawler.llm import OpenAI as LLM
from secret import OPENAI_API_KEY as API_KEY
from voice_active_crawler import VoiceActiveCrawler
llm = LLM(
api_key=API_KEY,
model="gpt-4o-mini",
)
# 机器人名称
NAME = "Buddy"
# 启用图像(需要多模态模型)
WITH_IMAGE = True
# 设置模型和语言
TTS_MODEL = "en_US-ryan-low"
STT_LANGUAGE = "en-us"
# 启用键盘输入
KEYBOARD_ENABLE = True
# 启用唤醒词
WAKE_ENABLE = True
WAKE_WORD = ["hey buddy"]
ANSWER_ON_WAKE = "Hi there"
WELCOME = f"Hi, I'm {NAME}. Wake me up with: " + ", ".join(WAKE_WORD)
INSTRUCTIONS = """
You are a Raspberry Pi-based robotic spider developed by SunFounder, named Picrawler...
## Actions You Can Perform:
["forward", "backward", "turn left", "turn right", "sit", "stand", "wave", "push up", "dance", "look left", "look right", "look up", "look down"]
"""
vad = VoiceActiveCrawler(
llm, name=NAME, with_image=WITH_IMAGE,
stt_language=STT_LANGUAGE, tts_model=TTS_MODEL,
keyboard_enable=KEYBOARD_ENABLE, wake_enable=WAKE_ENABLE,
wake_word=WAKE_WORD, answer_on_wake=ANSWER_ON_WAKE,
welcome=WELCOME, instructions=INSTRUCTIONS,
)
if __name__ == '__main__':
vad.run()
**工作原理**
#. VoiceActiveCrawler 是什么?
``VoiceActiveCrawler`` 是一个高级类,将四个子系统整合到一个语音交互管道中:
- **STT** — 语音识别(听取您的语音)
- **LLM** — AI 对话(GPT 处理您说的话)
- **TTS** — 语音合成(朗读 AI 回复)
- **动作** — 物理运动(机器人执行命令)
#. 使用唤醒词作为触发器
.. code-block:: python
WAKE_ENABLE = True
WAKE_WORD = ["hey buddy"]
启用后,机器人持续监听唤醒词。只有检测到唤醒词后,机器人才会开始对话。
这避免了对背景噪音的响应。
#. 连接 LLM
.. code-block:: python
from picrawler.llm import OpenAI as LLM
from secret import OPENAI_API_KEY as API_KEY
llm = LLM(api_key=API_KEY, model="gpt-4o-mini")
``picrawler.llm`` 模块提供 OpenAI 兼容的客户端。推荐使用 ``gpt-4o-mini``:
快速、实惠,支持多模态输入(文本+图像)。
#. 多模态模型的视觉功能
.. code-block:: python
WITH_IMAGE = True
启用后,机器人会从摄像头拍照并与语音问题一起发送。LLM 可以"看见"机器人
所见的景象。
#. 用指令设置机器人个性
``INSTRUCTIONS`` 字符串是发送给 LLM 的\ **系统提示**\ ,定义了机器人的身份、
个性、可用动作列表和回复格式。
#. 管道概览
1. 机器人监听唤醒词
2. 通过 STT 录制语音
3. 识别的文本发送给 LLM(可选带摄像头图像)
4. LLM 返回文本回复和动作列表
5. 机器人通过 TTS 朗读回复并执行动作
6. 循环回到监听状态
#. 三种 LLM 后端
相同的 ``VoiceActiveCrawler`` 管道支持不同 LLM 后端:
.. list-table::
:header-rows: 1
* - 特性
- GPT (18)
- Doubao (19)
- Ollama (20)
* - 运行环境
- 云端
- 云端
- 本地
* - API 密钥
- 需要
- 需要
- 不需要
* - 语言
- 英语
- 中文
- 英语
* - 视觉
- 支持
- 支持
- 较少
- :ref:`py_voice_doubao` — 相同云端方案,适配中文,使用字节跳动的豆包模型。
- :ref:`py_voice_ollama` — 完全在本地硬件运行,无需网络或 API 密钥。