# live_voice_call **Repository Path**: shinerabbit/live_voice_call ## Basic Information - **Project Name**: live_voice_call - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-09-04 - **Last Updated**: 2025-09-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 语音实时通话 - 青青 ## 应用介绍 这款实时语音通话应用,依托豆包语音系列大模型打造。在这里,用户能与虚拟好友乔青青展开模拟通话,畅享真实的交流体验。 乔青青(Doreen),一位 20 岁的射手座新闻传播专业学生,性格率真爽朗、成绩优异,对追星、旅游、唱歌、摄影充满热情。无论是分享日常琐事,还是深入探讨趣味话题,她都能成为你的理想伙伴。而且,用户还能根据喜好,自由选择青青的音色,从清脆甜美的少女音,到活力满满的灵动嗓音,为这场交流增添更多个性化色彩 。 想认识这位多才多艺、热情开朗的青青吗?快来加入她的世界,与她一同探索生活的精彩,追逐梦想的光芒。 ### 效果预览 [视频地址](https://portal.volccdn.com/obj/volcfe/cloud-universal-doc/upload_8c19a086a04ea8097bab34a5cf552e98.mp4) ### 直接体验 [控制台体验](https://console.volcengine.com/ark/region:ark+cn-beijing/application/detail?id=bot-20240805115108-nx28f-nocode-preset) ### 优势 - 沉浸式真人对话体验:生活化的沟通方式,让使用者在与乔青青交流时,仿佛她就在身边,能真切感受到她的爽朗性格,全方位模拟真人互动,深度沉浸。 - 低延时:实现近乎实时的对话响应,彻底告别长时间等待,高度模拟面对面的真实通话体验。 - WebSocket 方案:易于实现和部署,通用性强跨平台兼容性好,高效利用资源,开发灵活性高,成本低。 ### 相关模型 - Doubao-pro-32k:深入还原角色的性格、背景和知识体系,以高度拟人化的方式回应用户提问,提供沉浸式的对话体验。 - Doubao-语音合成:根据用户偏好的音色定制生成拟人化、逼真的角色语音输出。 - Doubao-流式语音识别:将用户的语音提问转写为文本,以便于大模型对用户问题的理解与回复。 ### 流程架构 本项目的整体流程架构如下:  ## 环境准备 - Poetry 1.6.1 版本 - Python 版本要求大于等于 3.8,小于 3.12 - Node 18.0 或以上版本 - PNPM 8.10 或以上版本 - 获取语音技术产品的 APP ID 和 Access Token,获取方式参见【附录】 - 火山方舟 API KEY [参考文档](https://www.volcengine.com/docs/82379/1298459#api-key-%E7%AD%BE%E5%90%8D%E9%89%B4%E6%9D%83) - 火山引擎 AK SK [参考文档](https://www.volcengine.com/docs/6291/65568) - 创建 Doubao-Pro 32K 的endpoint [参考文档](https://www.volcengine.com/docs/82379/1099522) ## 快速开始 本文为您介绍如何在本地快速部署 live voice call 项目。 1. 下载代码库 ```shell git clone https://github.com/volcengine/ai-app-lab.git cd demohouse/live_voice_call ``` 2. 修改配置 - 修改`backend/handler.py` ```python ASR_ACCESS_TOKEN = "{YOUR_ASR_ACCESS_TOKEN}" ASR_APP_ID = "{YOUR_ASR_APP_ID}" TTS_ACCESS_TOKEN = "{YOUR_TTS_ACCESS_TOKEN}" TTS_APP_ID = "{YOUR_TTS_APP_ID}" LLM_ENDPOINT_ID = "{YOUR_ARK_LLM_ENDPOINT_ID}" ``` - 修改本地环境变量注入方舟APIKEY ```shell export ARK_API_KEY={YOUR_API_KEY} ``` 3. 启动服务端 ```shell cd demohouse/live_voice_call/backend python -m venv .venv source .venv/bin/activate pip install poetry==1.6.1 poetry install poetry run python -m handler ``` 4. 启动web端 ```shell cd demohouse/live_voice_call/frontend pnpm install pnpm run dev ``` 5. 访问`http://localhost:8080`即可 ## WebSocket交互协议说明 ### 协议格式 Web端和服务端通过二进制协议进行交互,协议格式如下:
Byte \ Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
0 | Protocol version | Header size | ||||||
1 | Message type | Message type specific flags | ||||||
2 | Message serialization method | Message compression | ||||||
3 | Reserved | |||||||
4 | [Payload, depending on the Message Type] | |||||||
... | ... |
Part | 长度 | 用途 | 取值说明 |
---|---|---|---|
Protocol version | 4 bits | 标记协议版本 | 固定为 0b0001 ,代表协议版本 V1 |
Header size | 4 bits | 标记 Header 大小 | 固定为 0b0001 ,代表 Header 大小为 1 * 4 个字节 |
Message type | 4 bits | 标记消息类型 | 0b0001 - full client request |
常规上行请求消息,payload 为 JSON 格式 | |||
0b0010 - audio only request |
|||
语音上行数据消息,payload 为二进制格式 | |||
0b1001 - full server response |
|||
Message type specific flags | 4 bits | 标记消息附加信息 | 目前固定为 0b0000 ,代表无附加消息 |
Message serialization method | 4 bits | 标记 payload 序列化方式 |
|
Message compression | 4 bits | 标记 payload 压缩格式 |
|
Reserved | 8 bits | 预留字段 | 暂无用途 |
事件类型 | 事件方向 | 完整Payload | 说明 |
---|---|---|---|
BotReady | 下行 |
{ "event": "BotReady", "payload": { "session": "...." } } |
链接建立成功,可以开始对话。如果前端 query 中没有该参数,则会新生成 sid 并返回给前端,用于存储当前对话上下文。 |
BotUpdateConfig | 上行 |
{ "event": "BotUpdateConfig", "payload": { "speaker": "...." } } |
用户更新对话上下文信息,例如音色(下一轮生效)。 |
SentenceRecognized | 下行 |
{ "event": "SentenceRecognized", "payload": { "sentence": "...." } } |
ASR 成功识别用户语音,返回给前端结果。此事件下发后,连接进入 InProcess 状态,在语音输出结束前,不会再接受新的用户语音输入。 |
TTSSentenceStart | 下行 |
{ "event": "TTSSentenceStart", "payload": { "sentence": "...." } } |
当前句子开始语音合成,后续会发送 AudioOnly 事件输出二进制的语音数据。 |
TTSDone | 下行 |
{ "event": "TTSDone", "payload": {} } |
TTS 语音输出完成。此事件下发后,连接重新恢复 Idle 状态,此时可以开始接受新的用户语音输入。 |
BotError | 下行 |
{ "event": "BotError", "payload": { "error": { "code": "...", "message": "..." } } } |
服务端出现错误。 |