|
|
há 1 ano atrás | |
|---|---|---|
| .. | ||
| doubao_api | há 1 ano atrás | |
| .gitignore | há 1 ano atrás | |
| ENV_CONFIG.md | há 1 ano atrás | |
| INTEGRATION_GUIDE.md | há 1 ano atrás | |
| QUICKSTART.md | há 1 ano atrás | |
| README.md | há 1 ano atrás | |
| config.py | há 1 ano atrás | |
| connection_pool.py | há 1 ano atrás | |
| error_codes.py | há 1 ano atrás | |
| main.py | há 1 ano atrás | |
| performance.py | há 1 ano atrás | |
| requirements.txt | há 1 ano atrás | |
| start.sh | há 1 ano atrás | |
| utils.py | há 1 ano atrás | |
| websocket_handler.py | há 1 ano atrás | |
这是Tolan语音助手的后端服务,使用FastAPI + WebSocket构建。
cd /Users/wuzilong/work/00code/Tolan/backend
# 使用本机Python环境
pip install -r requirements.txt
创建 .env 文件:
# 豆包API配置(必需)
DOUBAO_API_KEY=your_api_key_here
DOUBAO_APP_ID=your_app_id_here
# 豆包API地址(可选,默认使用官方地址)
DOUBAO_API_URL=wss://openspeech.bytedance.com/api/v3/realtime/dialogue
# 输出音频格式(可选,默认ogg_opus)
DOUBAO_OUTPUT_FORMAT=ogg_opus
# 服务器配置
HOST=0.0.0.0
PORT=8000
DEBUG=False
# 连接池配置
CONNECTION_POOL_SIZE=10
重要说明:
开发环境:
python main.py
生产环境(使用SSL):
python -m uvicorn main:app --host 0.0.0.0 --port 8443 \
--ssl-keyfile=../ssl/key.pem \
--ssl-certfile=../ssl/cert.pem
backend/
├── main.py # FastAPI主应用
├── config.py # 配置管理
├── connection_pool.py # 豆包API连接池
├── websocket_handler.py # WebSocket处理器
├── doubao_api/ # 豆包API模块
│ ├── __init__.py
│ └── realtime_dialog_client.py
├── logs/ # 日志目录(自动创建)
├── requirements.txt # Python依赖
└── README.md
实现豆包API连接池,提供:
from connection_pool import connection_pool
# 初始化连接池
await connection_pool.initialize()
# 获取连接
client = await connection_pool.acquire()
# 使用连接
await client.send_audio(audio_data)
# 归还连接
await connection_pool.release(client)
实现流式会话处理,包括:
from websocket_handler import connection_manager
# 建立连接
session = await connection_manager.connect(websocket, session_id)
# 启动会话
await session.start()
# 处理流式数据
await session.process_stream()
主应用入口,提供:
根路径,返回应用信息
健康检查,返回:
{
"status": "healthy",
"timestamp": 1696752000000,
"connection_pool": {
"initialized": true,
"pool_size": 10,
"idle": 8,
"active": 2
},
"active_sessions": 2
}
实时语音交互端点
消息格式:
控制消息(文本/JSON):
{
"type": "init",
"payload": {
"version": "1.0",
"capabilities": ["pcm", "opus"]
}
}
消息类型:
客户端 → 服务端:
init - 初始化start_recording - 开始录音stop_recording - 停止录音ping - 心跳close - 关闭连接服务端 → 客户端:
init_ack - 初始化确认recording_started - 录音已开始recording_stopped - 录音已停止ai_response_start - AI开始回复ai_response_end - AI回复结束state_change - 状态变更error - 错误消息metrics - 性能指标pong - 心跳响应| 变量名 | 说明 | 默认值 |
|---|---|---|
| DOUBAO_API_KEY | 豆包API密钥 | - |
| DOUBAO_APP_ID | 豆包APP ID | - |
| HOST | 服务器地址 | 0.0.0.0 |
| PORT | 服务器端口 | 8000 |
| CONNECTION_POOL_SIZE | 连接池大小 | 10 |
| LOG_LEVEL | 日志级别 | INFO |
# config.py
CONNECTION_POOL_SIZE = 10 # 连接池大小
CONNECTION_MAX_IDLE_TIME = 300 # 最大空闲时间(秒)
CONNECTION_HEALTH_CHECK_INTERVAL = 60 # 健康检查间隔(秒)
日志文件位于 logs/ 目录:
YYYY-MM-DD HH:mm:ss | LEVEL | message日志级别:
| 错误码 | 说明 | 可恢复 |
|---|---|---|
| CONNECTION_POOL_EXHAUSTED | 连接池已耗尽 | 是 |
| DOUBAO_API_ERROR | 豆包API错误 | 是 |
| INTERNAL_ERROR | 内部错误 | 否 |
{
"type": "error",
"payload": {
"code": "CONNECTION_POOL_EXHAUSTED",
"message": "服务繁忙,请稍后重试",
"severity": "error",
"recoverable": true
}
}
应用会追踪并返回以下指标:
症状: 启动时报错"连接池初始化失败"
解决方案:
症状: 前端无法连接WebSocket
解决方案:
症状: 端到端延迟 > 500ms
解决方案:
# 安装依赖
pip install -r requirements.txt
# 启动开发服务器(自动重载)
python main.py
# 或使用uvicorn
python -m uvicorn main:app --reload
# 查看日志
tail -f logs/app_*.log
# 健康检查
curl http://localhost:8000/health
# 使用HTTPS
python -m uvicorn main:app \
--host 0.0.0.0 \
--port 8443 \
--ssl-keyfile=../ssl/key.pem \
--ssl-certfile=../ssl/cert.pem \
--workers 4
Supervisor:
[program:tolan-backend]
directory=/Users/wuzilong/work/00code/Tolan/backend
command=python -m uvicorn main:app --host 0.0.0.0 --port 8000
autostart=true
autorestart=true
systemd:
[Unit]
Description=Tolan Backend Service
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/Users/wuzilong/work/00code/Tolan/backend
ExecStart=python -m uvicorn main:app --host 0.0.0.0 --port 8000
Restart=always
[Install]
WantedBy=multi-user.target
upstream tolan_backend {
server localhost:8000;
}
server {
listen 443 ssl http2;
server_name api.yourdomain.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location /ws {
proxy_pass http://tolan_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_read_timeout 86400;
}
location / {
proxy_pass http://tolan_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
MIT