一个基于 FastAPI 的语音/文本助手应用,内置会话持久化、历史全文搜索与可选联网检索。前端为简洁的网页 UI,后端调用 OpenAI 模型生成回复,支持中文语音合成与浏览器语音识别(受浏览器支持限制)。
- 聊天与上下文记忆:会话保存在本地 SQLite,连续对话有上下文。
- 可选联网检索:勾选“联网搜索”时,优先使用 Tavily(需
TAVILY_API_KEY),失败/未配置时回退 DuckDuckGo 摘要。 - 历史搜索:基于 SQLite FTS5 的全文搜索接口。
- 语音支持:
- 文字转语音:浏览器
SpeechSynthesis合成中文播报。 - 语音转文字:Chrome 的
webkitSpeechRecognition(若支持)。
- 文字转语音:浏览器
- 前后端一体:静态页面通过 FastAPI 直接挂载在根路径。
app/
main.py # FastAPI 入口与路由
db.py # SQLite/FTS5 持久化
services/
llm.py # OpenAI Chat API 调用
search.py # Tavily / DuckDuckGo 搜索
static/
index.html # 简洁网页 UI(中文)
app.js # 前端逻辑(聊天、语音、历史搜索)
styles.css # 样式
requirements.txt # 依赖清单
- Python 3.10+
- 可联网(如需联网检索)
- 浏览器:Chrome/Safari(语音功能取决于浏览器支持)
- 克隆并进入项目目录:
cd OwnerRobert- 创建虚拟环境并安装依赖:
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt- 配置环境变量(至少需要 OpenAI 密钥):
export OPENAI_API_KEY="你的OpenAI密钥"
# 可选:
export MODEL="gpt-4o-mini" # 默认即为 gpt-4o-mini
export PERSONA="calm, helpful" # 默认人设风格
export SYSTEM_PROMPT="You are a helpful voice assistant. Be concise and friendly."
export TAVILY_API_KEY="你的Tavily密钥" # 启用高质量联网检索- 启动服务:
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000- 打开浏览器访问:
http://localhost:8000/
- 在输入框键入消息,点击“发送”。
- 可填写
persona(如:calm, helpful)影响风格。 - 勾选“联网搜索”开启检索增强。
- 点击麦克风图标尝试语音输入(取决于浏览器)。
- 下方“搜索历史”支持全文关键字检索以往消息记录。
- 数据文件位于
data/app.db(启动后自动创建)。 - 表结构:
conversations、messages、messages_fts(FTS5 虚拟表),并带触发器保持 FTS 同步。
- 路径:
POST /api/chat - 请求体:
{
"message": "你好",
"persona": "calm, helpful", // 可选
"conversation_id": "uuid", // 可选,不传则新建
"enable_search": true // 可选,默认 false
}- 响应体:
{
"conversation_id": "uuid",
"reply": "你好!很高兴帮你。"
}示例:
curl -X POST http://localhost:8000/api/chat \
-H 'Content-Type: application/json' \
-d '{"message":"你好","enable_search":false}'- 路径:
GET /api/history/search?q=关键词&limit=10 - 响应:
{ "results": [ { "id": 1, "conversation_id": "...", "role": "user", "content": "...", "created_at": "..." } ] }OPENAI_API_KEY:必填,用于调用 OpenAI。MODEL:可选,默认gpt-4o-mini。PERSONA:可选,默认calm, helpful。SYSTEM_PROMPT:可选,系统提示词前缀。TAVILY_API_KEY:可选,提供更稳定与结构化的联网检索。
- 浏览器无语音识别:部分浏览器不支持
webkitSpeechRecognition,可手动输入。 - 429/鉴权错误:检查
OPENAI_API_KEY是否配置正确及调用配额。 - 联网检索失败:未设置
TAVILY_API_KEY时自动回退 DuckDuckGo;网络问题可稍后重试。 - 数据位置:删除
data/app.db会清空历史记录。
- 生产环境建议使用:
uvicorn app.main:app --host 0.0.0.0 --port 8000 --workers 2 - 置于反向代理(如 Nginx)后以启用 HTTPS。
- 将环境变量通过系统服务或容器安全注入;不要硬编码。
本项目遵循 LICENSE 文件所述许可。