随着 AIGC 和虚拟人技术的发展,越来越多企业和开发者希望构建一个“会说话、会动、能互动”的数字人系统。本文将手把手演示如何结合 WebRTC(实时通信)、Pion(Go语言 WebRTC 实现)、HeyGem.ai(开源数字人生成平台),搭建一个可实时语音驱动数字人视频生成的闭环系统,核心使用:
WebRTC:实现实时语音上传与视频下行Pion(Go语言 WebRTC 库):实现服务端音视频处理HeyGem.ai:负责语音合成 + 表情口型驱动的视频生成
🔄 系统能力概览
能力模块实现技术用户输入小程序 / 浏览器语音 + WebRTC实时通信Pion WebRTC (Go)语音识别 (ASR)Whisper / Duix.ai对话生成 (LLM)ChatGPT / GLM / Tongyi文本转语音 (TTS)HeyGem.ai /v1/invoke视频生成HeyGem.ai /easy/submit视频推送WebRTC video track via Pion
🔮 工程流程图
🛠️ 核心技术实现
1. 前端语音採集 + WebRTC
通过 getUserMedia({audio: true}) 採集音频创建 RTCPeerConnection,将 audio track 加入连接与服务端 Pion SDP/ICE 交换
2. 服务端 Pion 接收音频
peerConnection.OnTrack(func(track *webrtc.TrackRemote, receiver *webrtc.RTPReceiver) {
if track.Kind() == webrtc.RTPCodecTypeAudio {
go func() {
var pcmData []byte
for i := 0; i < 50; i++ {
pkt, _, _ := track.ReadRTP()
pcmData = append(pcmData, pkt.Payload...)
}
// 下一步 ASR 识别
}()
}
})
3. ASR + LLM + TTS 调用 HeyGem.ai
// 假设用户说了一段话,ASR 识别后:
replyText := callLLM(callASR(pcmData))
// 调用 HeyGem 合成语音
voice, _ := heygemSynthesize(replyText, reference)
os.WriteFile("reply.wav", voice, 0644)
// 调用 HeyGem 合成视频
heygemGenerateVideo("http://127.0.0.1/reply.wav", "http://127.0.0.1/avatar.mp4", "task001")
后续通过 /easy/query?code=task001 查询视频合成进度。
4. 用 Pion 推送视频到前端
videoTrack, _ := webrtc.NewTrackLocalStaticSample(
webrtc.RTPCodecCapability{MimeType: webrtc.MimeTypeVP8}, "video", "pion")
peerConnection.AddTrack(videoTrack)
f, _ := os.Open("output.mp4")
buf := make([]byte, 1400)
for {
n, _ := f.Read(buf)
if n == 0 { break }
videoTrack.WriteSample(media.Sample{Data: buf[:n], Duration: time.Second / 30})
}
🔐 其他扩展
功能技术解决表情/指令控制DataChannel 传送 viseme / action json多人室间SFU (如 mediasoup),Redis分组上下文/记忆LangChain Memory or SessionContext
📝 总结
通过本文提供的技术模型和实例,你已经能很方便地用 WebRTC + Pion + HeyGem.ai 实现一个可以被语音调用、自动生成声音和影像的数字人完整连通系统。
如果需要我帮你完全写出这套 demo 程序,可以指定需要部分(前端、Pion、HeyGem 接入),我可以给出完整源码和启动方案。