本文档说明如何将真实的豆包API集成到Tolan后端服务中。
✅ 已完成: 豆包API集成代码已完成,支持真实API和模拟API自动切换
客户端音频 → 后端WSS → 连接池 → 豆包API客户端 → 豆包服务器
↓
客户端播放 ← 后端WSS ← 连接池 ← 豆包API客户端 ← 豆包响应
负责豆包API的消息编码和解码:
generate_header() - 生成协议头parse_response() - 解析响应消息实现豆包API的完整客户端:
connect() - 建立连接并初始化会话send_audio() - 发送PCM音频数据receive_audio() - 接收OGG/Opus音频数据close() - 优雅关闭连接管理豆包API连接的生命周期:
在 backend/.env 文件中配置:
# 必需配置
DOUBAO_API_KEY=your_api_key_here
DOUBAO_APP_ID=your_app_id_here
# 可选配置
DOUBAO_API_URL=wss://openspeech.bytedance.com/api/v3/realtime/dialogue
DOUBAO_OUTPUT_FORMAT=ogg_opus
格式: PCM
采样率: 16000 Hz
位深: 16 bit (Int16)
声道: 单声道
字节序: 小端序
格式: OGG封装的Opus音频
采样率: 24000 Hz
压缩: 高效压缩
特点: 浏览器原生支持
| Event | 类型 | 说明 |
|---|---|---|
| 1 | StartConnection | 开始连接 |
| 2 | FinishConnection | 结束连接 |
| 100 | StartSession | 开始会话 |
| 102 | FinishSession | 结束会话 |
| 200 | AudioData | 音频数据 |
| Event | 说明 | 处理方式 |
|---|---|---|
| 400 | 音频数据 | 转发给客户端播放 |
| 401 | 对话结束 | 停止接收 |
| 其他 | 控制消息 | 日志记录 |
client = RealtimeDialogClient(
api_key="your_key",
app_id="your_app_id"
)
# 连接会自动:
# 1. 建立WebSocket连接
# 2. 发送StartConnection请求
# 3. 发送StartSession请求
await client.connect()
# 接收客户端PCM数据
pcm_audio = await websocket.receive_bytes()
# 转发给豆包(会自动压缩)
await client.send_audio(pcm_audio)
# 持续接收豆包响应
while True:
audio_data = await client.receive_audio()
if audio_data:
# 转发给客户端
await websocket.send_bytes(audio_data)
else:
# 对话结束
break
# 优雅关闭
await client.close()
# 会自动:
# 1. 发送FinishSession请求
# 2. 发送FinishConnection请求
# 3. 关闭WebSocket
# 不配置豆包API密钥
python main.py
看到日志:
[WARNING] 豆包API密钥未配置,创建模拟连接
[SUCCESS] 连接 #0 创建成功 (模拟)
# 配置.env文件
echo "DOUBAO_API_KEY=your_key" > .env
echo "DOUBAO_APP_ID=your_app_id" >> .env
# 启动服务
python main.py
看到日志:
[INFO] 连接豆包API: wss://openspeech.bytedance.com/...
[SUCCESS] 豆包API连接成功,LogID: xxx
[SUCCESS] 豆包会话已建立: session_xxx
[SUCCESS] 连接 #0 创建成功 (真实API)
# 1. 启动后端
cd backend
python main.py
# 2. 启动前端(新终端)
cd frontend
npm run dev
# 3. 浏览器访问
open http://localhost:5173
# 4. 测试对话
# - 按住录音按钮说话
# - 松开按钮等待回复
# - 查看延迟指标
curl http://localhost:8000/health
输出:
{
"connection_pool": {
"initialized": true,
"pool_size": 10,
"idle": 8,
"active": 2
}
}
tail -f logs/app_*.log
关键日志:
[INFO] 连接豆包API: wss://...
[SUCCESS] 豆包会话已建立
[DEBUG] 发送音频到豆包: 1024 bytes
[DEBUG] 收到豆包音频: 2048 bytes
错误:
[ERROR] 连接 #0 创建失败: 401 Unauthorized
解决:
错误:
[ERROR] 连接豆包API失败: Connection refused
解决:
错误:
[ERROR] StartSession响应错误
解决:
系统具有自动降级机制:
try:
# 尝试创建真实API连接
client = RealtimeDialogClient(...)
await client.connect()
except Exception as e:
# 失败则创建模拟连接
logger.warning("回退到模拟连接")
client = MockConnection()
好处:
# 开发环境
CONNECTION_POOL_SIZE=5
# 生产环境
CONNECTION_POOL_SIZE=20 # 根据并发量调整
# 推荐: OGG/Opus(高压缩率,低带宽)
DOUBAO_OUTPUT_FORMAT=ogg_opus
# 备选: PCM(无压缩,高质量,高带宽)
DOUBAO_OUTPUT_FORMAT=pcm
遇到问题?
logs/app_*.log/health 端点祝集成顺利! 🚀