Skip to content

Latest commit

 

History

History
347 lines (303 loc) · 9.86 KB

README.md

File metadata and controls

347 lines (303 loc) · 9.86 KB

语音实时通话 - 青青

应用介绍

这款实时语音通话应用,依托豆包语音系列大模型打造。在这里,用户能与虚拟好友乔青青展开模拟通话,畅享真实的交流体验。 乔青青(Doreen),一位 20 岁的射手座新闻传播专业学生,性格率真爽朗、成绩优异,对追星、旅游、唱歌、摄影充满热情。无论是分享日常琐事,还是深入探讨趣味话题,她都能成为你的理想伙伴。而且,用户还能根据喜好,自由选择青青的音色,从清脆甜美的少女音,到活力满满的灵动嗓音,为这场交流增添更多个性化色彩 。 想认识这位多才多艺、热情开朗的青青吗?快来加入她的世界,与她一同探索生活的精彩,追逐梦想的光芒。

效果预览

视频地址

直接体验

控制台体验

优势

  • 沉浸式真人对话体验:生活化的沟通方式,让使用者在与乔青青交流时,仿佛她就在身边,能真切感受到她的爽朗性格,全方位模拟真人互动,深度沉浸。
  • 低延时:实现近乎实时的对话响应,彻底告别长时间等待,高度模拟面对面的真实通话体验。
  • WebSocket 方案:易于实现和部署,通用性强跨平台兼容性好,高效利用资源,开发灵活性高,成本低。

相关模型

  • Doubao-pro-32k:深入还原角色的性格、背景和知识体系,以高度拟人化的方式回应用户提问,提供沉浸式的对话体验。
  • Doubao-语音合成:根据用户偏好的音色定制生成拟人化、逼真的角色语音输出。
  • Doubao-流式语音识别:将用户的语音提问转写为文本,以便于大模型对用户问题的理解与回复。

流程架构

本项目的整体流程架构如下:

img.png

环境准备

  • Poetry 1.6.1 版本
  • Python 版本要求大于等于 3.8,小于 3.12
  • Node 18.0 或以上版本
  • PNPM 8.10 或以上版本
  • 火山 TTS API access 参考文档仅对企业客户开放,您可以先完成企业实名认证后接入使用
  • 火山 ASR API access 参考文档仅对企业客户开放,您可以先完成企业实名认证后接入使用
  • 火山方舟 API KEY 参考文档
  • 火山引擎 AK SK 参考文档
  • 创建 Doubao-Pro 32K 的endpoint 参考文档

快速开始

本文为您介绍如何在本地快速部署 live voice call 项目。

  1. 下载代码库

    git clone https://github.com/volcengine/ai-app-lab.git
    cd demohouse/live_voice_call
  2. 修改配置

  • 修改backend/handler.py

    ASR_ACCESS_KEY = "{YOUR_ASR_ACCESS_KEY}"
    ASR_APP_KEY = "{YOUR_ASR_APP_KEY}"
    TTS_ACCESS_KEY = "{YOUR_TTS_ACCESS_KEY}"
    TTS_APP_KEY = "{YOUR_TTS_APP_KEY}"
    LLM_ENDPOINT_ID = "{YOUR_ARK_LLM_ENDPOINT_ID}"
  • 修改本地环境变量注入方舟APIKEY

    export ARK_API_KEY={YOUR_API_KEY}
  1. 启动服务端

    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
  2. 启动web端

    cd demohouse/live_voice_call/frontend
    pnpm install
    pnpm run dev
  3. 访问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]
... ...

前4个字节共32位为Header部分,剩余字节为Payload部分,可以是二进制 或 JSON格式

各部分取值说明如下:

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 序列化方式
  • 0b0000 - 无序列化
  • 0b0001 - JSON 格式
Message compression 4 bits 标记 payload 压缩格式
  • 0b0000 - 无压缩
  • 0b0001 - Gzip 压缩
Reserved 8 bits 预留字段 暂无用途

Payload一览

当MessageType为FullClientRequest或FullServerResponse时,Payload部分为JSON数据,格式如下:

{
    "event": "事件类型",
    "payload": {
      // 事件内容,根据不同的事件类型区分...
    }
}
事件类型 事件方向 完整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": "..."
        }
    }
}
                    
服务端出现错误。

交互时序示意

img_1.png

附录