跳到正文
Sin

ASR & TTS 语音交互 AI 助手服务

语音交互

开发 1 分钟阅读

基于 NestJS 构建的全链路语音交互 AI 助手后端服务,集成语音识别 (ASR)、大模型对话 (LLM)、语音合成 (TTS) 三大能力,实现「用户语音输入 → 智能回复 → 语音输出」的端到端语音交互体验。

类别技术
后端框架NestJS 11、TypeScript 5.7、Node.js
AI / LLMLangChain (Chain 组合模式)、OpenAI Compatible API
语音服务腾讯云 ASR (语音识别)、腾讯云 TTS (语音合成)
实时通信WebSocket (ws)、SSE (Server-Sent Events)
架构模式事件驱动 (EventEmitter2)、依赖注入 (DI)、模块化设计
前端原生 HTML5 (MediaRecorder API、MediaSource API、EventSource)
工具链pnpm、ESLint、Prettier、Jest

src/
├── app.module.ts # 根模块,导入所有功能模块
├── main.ts # 入口,启动 HTTP 服务 + WebSocket
├── ai/ # AI/LLM 模块
│ ├── ai.controller.ts # SSE 端点,流式对话接口
│ ├── ai.service.ts # LangChain Chain 编排
│ └── ai.module.ts # 依赖注入配置
├── speech/ # 语音处理模块
│ ├── speech.controller.ts # REST API,语音识别接口
│ ├── speech.service.ts # 腾讯云 ASR 集成
│ ├── tts-relay.service.ts # WebSocket 中继,TTS 流式合成
│ └── speech.module.ts # 依赖注入配置
├── commom/ # 公共工具
│ └── stream-events.ts # 事件类型定义
└── public/ # 前端 Demo 页面
├── asr-ai-stream.html # 完整语音交互 Demo
└── asr.html # 语音识别测试页

  • 端点:POST /speech/asr
  • 通过 REST API 接收音频文件 (OGG-Opus 格式),转 Base64 后调用腾讯云 ASR 接口完成语音转文本

  • 端点:GET /ai/chat/stream?query=...&ttsSessionId=...
  • 协议:SSE (Server-Sent Events)
  • 基于 LangChain 的 PromptTemplate → ChatOpenAI → StringOutputParser Chain 组合模式
  • 实现 Token 级别的流式响应,降低用户等待感知
  • 传入 ttsSessionId 时自动触发 TTS 语音合成管线

  • 端点:WebSocket /speech/tts/ws
  • 设计 WebSocket Relay 中继架构:服务端作为中间层,桥接客户端与腾讯云 TTS WebSocket
  • 实现会话管理、待发送队列缓冲、HMAC-SHA1 签名鉴权、断线重连等机制
  • 将腾讯云返回的二进制音频流实时转发给客户端播放

用户录音 → POST /speech/asr → 腾讯云 ASR → 返回文本
GET /ai/chat/stream (SSE) → LangChain 流式生成回复
EventEmitter2 发布 AI_TTS_STREAM_EVENT
TTS Relay Service → 腾讯云 TTS WebSocket → 二进制音频流
WebSocket 转发至客户端 → MediaSource 实时播放

  • 事件驱动架构:通过 EventEmitter2 发布 AI_TTS_STREAM_EVENT 事件,将 AI 流式输出与 TTS 合成解耦,各模块独立演进
  • WebSocket Relay 模式:设计中继服务模式管理客户端与腾讯云的双向 WebSocket 连接,处理连接生命周期、消息缓冲与转发
  • 流式处理全链路:AI 响应以 SSE 流式下发 → 触发 TTS 事件 → WebSocket 流式返回音频 → 客户端 MediaSource 实时播放,端到端延迟低
  • HMAC 签名鉴权:手动实现腾讯云 WebSocket API 的 HMAC-SHA1 签名认证流程
  • NestJS 模块化设计:遵循 DI 注入、Factory Provider、模块隔离等 NestJS 最佳实践

变量名说明
SECRET_ID腾讯云 SecretId
SECRET_KEY腾讯云 SecretKey
APP_ID腾讯云应用 ID
TTS_VOICE_TYPETTS 音色类型
OPENAI_API_KEYOpenAI API Key
OPENAI_BASE_URLOpenAI API Base URL (兼容接口)
MODEL_NAME使用的模型名称

Terminal window
# 安装依赖
pnpm install
# 启动开发服务
pnpm run start:dev
# 访问 Demo 页面
# http://localhost:3000/asr-ai-stream.html
# http://localhost:3000/asr.html