数字人AI 应用语音多模态音视频后端【免费下载链接】OpenAvatarChat项目地址https://gitcode.com/gh_mirrors/op/OpenAvatarChat点击查看免费下载本技术指南以 OpenAvatarChat 仓库中 Qwen-Omni Handler 参考文档中文版见 docs/reference/handlers/llm/qwen-omni.md为核心系统讲解如何通过阿里云百炼BailianAPI 接入 Qwen-Omni 的 Speech2Speech语音进、语音出实时对话能力包括完整配置、manual 模式下的本地 SileroVAD 语音活动检测、SenseVoice 回显机制、数字人模块二选一LiteAvatar / MuseTalk并深入到llm_handler_qwen_omni.py源码层面剖析连接管理、事件回调、音视频输入、自动重连与心跳保活等实现原理。读完本文你将能够独立配置并启动一套以 Qwen-Omni 为大脑、支持视频输入的多模态数字人对话系统并理解其底层运行机制。一、Handler 定位与适用场景在 OpenAvatarChat 的模块化 Handler 架构中整体分类可参考 Handler 概览QwenOmni属于LLM Handler类别其特殊之处在于它通过百炼提供的OmniRealtimeConversation实时接口将传统流水线中语音识别ASR、大语言模型LLM、语音合成TTS三个环节合并为一次端到端Speech2Speech的实时交互模型直接输出 24kHz 的 PCM 音频流。按照参考文档的说明该 Handler 有以下两个关键现状当前仅支持 manual 模式VAD语音活动检测不由服务端完成而是由本地的 SileroVAD 模型执行配合InterruptHandler实现用户打断manual 模式下模型自带 ASR 结果质量差且不可靠因此配置中额外挂载了 SenseVoice 模块仅用于回显对话记录生成 HUMAN_TEXT 流给前端展示用户说了什么而不会用于驱动对话流程。与之对应的预置配置为 chat_with_qwen_omni.yamlREADME 预置模式表 中将其标记为ASR / LLM / TTS均由 Qwen-Omni 承担、Avatar 为 lite-avatar 的完整单模型方案。二、Manual 模式下的完整 Handler 链路与数据流从 chat_with_qwen_omni.yaml 的handler_configs可以看到这套系统由如下 Handler 共同组成RtcClientWebRTC 客户端接入负责浏览器与服务的实时音频/视频通道InterruptHandler接收INTERRUPT信号并执行流取消实现用户随时打断SileroVad本地语音活动检测负责切分用户开始说话 / 结束说话SenseVoice仅用于回显把用户语音转写为文本推给前端QwenOmni对话大脑接收音频与摄像头视频流式返回音频与文本LiteAvatar / MuseTalk二选一数字人渲染消费 Qwen-Omni 输出的音频驱动形象。从源码的get_handler_detail见 llm_handler_qwen_omni.py可以看到该 Handler 声明的输入输出契约方向数据类型说明输入HUMAN_AUDIO用户麦克风音频SileroVAD 切割后逐段送入输入CAMERA_VIDEO摄像头视频帧可选受enable_video_input控制输出HUMAN_TEXT用户语音回显文本由 SenseVoice 或模型转写产生输出AVATAR_AUDIO数字人音频24kHz 单声道 float32供 Avatar Handler 驱动口型输出AVATAR_TEXT数字人字幕文本增量 delta 流manual 模式的运行节奏是SileroVAD 检测到说话起始后持续积累音频 → 检测到human_speech_end后Handler 一次性commit整段音频并请求模型create_response→ 模型流式返回音频/文本增量 →response.done事件写入结束标记结束本轮 Turn。三、完整配置解析3.1 配置总览chat_with_qwen_omni.yaml 全文如下含注释这是可直接复制运行的完整配置default: logger: log_level: INFO service: host: 0.0.0.0 port: 8282 cert_file: ssl_certs/localhost.crt cert_key: ssl_certs/localhost.key chat_engine: model_root: models concurrent_limit: 1 handler_search_path: - src/handlers handler_configs: RtcClient: module: client/rtc_client/client_handler_rtc connection_ttl: 900 # 打断处理器 - 接收 INTERRUPT 信号并执行流取消 InterruptHandler: module: logic/interrupt/interrupt_handler SileroVad: module: vad/silerovad/vad_handler_silero speaking_threshold: 0.5 start_delay: 2048 end_delay: 5000 buffer_look_back: 5000 speech_padding: 512 SenseVoice: enabled: True module: asr/sensevoice/asr_handler_sensevoice model_name: iic/SenseVoiceSmall QwenOmni: enabled: true module: llm/qwen_omni/llm_handler_qwen_omni model_name: qwen-omni-turbo-realtime # api_key: # 默认 os.getenv(DASHSCOPE_API_KEY) voice: Serena enable_video_input: true video_frame_interval_ms: 1000 enable_text_output: true input_audio_format: PCM_16000HZ_MONO_16BIT output_audio_format: PCM_24000HZ_MONO_16BIT enable_turn_detection: false enable_input_transcription: false transcription_model: gummy-realtime-v1 # MuseTalk 与 LiteAvatar 通过配置自由选择默认使用 LiteAvatar # AvatarMusetalk: # module: avatar/musetalk/avatar_handler_musetalk # fps: 20 # batch_size: 2 # avatar_video_path: src/handlers/avatar/musetalk/MuseTalk/data/video/yongen.mp4 # avatar_model_dir: models/musetalk/avatar_model # force_create_avatar: false # debug: false LiteAvatar: module: avatar/liteavatar/avatar_handler_liteavatar avatar_name: 20250408/sample_data fps: 25 debug: false enable_fast_mode: false use_gpu: true3.2 QwenOmni 配置参数详解配置文件中的参数与源码中QwenOmniConfig定义见 llm_handler_qwen_omni.py一一对应参数默认值说明model_nameqwen-omni-turbo-realtime百炼实时多模态模型名api_keyos.getenv(DASHSCOPE_API_KEY)鉴权密钥可在配置中直接填写或通过环境变量DASHSCOPE_API_KEY注入二者都没有则加载失败voiceChelsie输出音色可选Chelsie/Serena/Ethan/Cherryenable_video_inputfalse是否开启摄像头视频输入多模态看图/看人能力video_frame_interval_ms1000下限 500视频帧发送间隔防止拥塞按百炼 Omni 文档建议不要低于 500msenable_text_outputfalse是否流式输出数字人字幕文本AVATAR_TEXTinput_audio_formatPCM_16000HZ_MONO_16BIT上行音频格式16kHz 单声道 16bit PCMoutput_audio_formatPCM_24000HZ_MONO_16BIT下行音频格式24kHz 单声道 16bit PCMenable_turn_detectionfalse服务端 VAD 模式目前尚未支持务必保持 false 不要修改enable_input_transcriptionfalse模型自带输入转写开关manual 模式下效果差默认关闭改用 SenseVoice 回显transcription_modelgummy-realtime-v1服务端转写模型仅在开启输入转写时生效关键约束提醒video_frame_interval_ms在代码中通过ge500做了下限校验enable_turn_detection配置注释明确写着目前暂未支持服务端 vad 模式……不要修改。3.3 周边模块参数速览SileroVad实现在 vad_handler_silero.pyspeaking_threshold: 0.5判定说话概率阈值start_delay / end_delay: 2048/5000为起止延迟msbuffer_look_back: 5000回看窗口speech_padding: 512语音前后填充共同决定一句语音的切割粒度直接影响 Qwen-Omni 收到的语音段落完整性。SenseVoice实现在 asr_handler_sensevoice.pymodel_name: iic/SenseVoiceSmallModelScope 上的 SenseVoice 小模型仅做回显转写。数字人二选一LiteAvatar默认avatar_name: 20250408/sample_datafps: 25use_gpu: trueenable_fast_mode: falseMuseTalk注释备用fps: 20batch_size: 2必须大于 2avatar_video_path指定驱动视频avatar_model_dir指定模型目录force_create_avatar是否强制重建数字人数据。四、源码级工作原理4.1 连接与会话建立create_context阶段llm_handler_qwen_omni.py会创建OmniRealtimeConversation实例并挂载回调start_context第 562-634 行随后校验dashscope.api_key缺失直接抛错启动音频处理线程与文本处理线程两个后台 workerconversation.connect()建立 WebSocket 连接等待connection_ready_event超时 15s通过update_session下发会话参数输出模态固定为[AUDIO, TEXT]、音色、输入/输出音频格式、输入转写开关、服务端 Turn 检测开关启动心跳线程后返回。注意load阶段第 532-540 行就会校验 API Key——若api_key为空或长度为零会以DASHSCOPE_API_KEY is required for Qwen-Omni handler拒绝加载因此 API Key 是第一硬性前提。4.2 事件回调流式增量如何变成数据包QwenOmniCallback第 281-517 行把 WebSocket 事件分门别类处理response.audio.delta把 base64 音频增量放入recv_audio_queue由音频 worker 解码response.text.delta/response.audio_transcript.delta当enable_text_output开启时文本增量放入recv_text_queue作为字幕流输出conversation.item.input_audio_transcription.completed当enable_input_transcription开启时模型转写结果以HUMAN_TEXT输出manual 模式下默认关闭response.done置is_processing False并向音/文两个队列写入is_end/avatar_text_end结束标记。两个 worker 线程消费队列音频 worker第 650-719 行将 base64 还原为 int16 字节、按 24kHz 换算为 float32/32767.0、reshape 为(1, N)后以AVATAR_AUDIO提交文本 worker第 721-764 行以AVATAR_TEXT提交增量文本。收到结束标记时分别提交一段静音音频240 采样点或空文本并finish_streamTrue向 Avatar Handler 发出本轮结束信号。4.3 音频输入从字节流到 commit_handle_audio_input第 822-879 行是 manual 模式的入口核心若数据是 float32先 clip 到[-1, 1]再乘 32767 转 int16编码为 base64 后conversation.append_audio()逐块追加检测到human_speech_end元数据时执行conversation.commit()提交本段音频并create_response()请求模型作答同时置is_processing True阻止心跳干扰生成过程。4.4 视频输入audio-first 约束与帧节流_handle_video_input第 970-1006 行实现两个设计约束audio-first若本轮尚未开始发送音频current_turn_audio_started为假直接跳过视频帧保证音频通道先于视频建立帧节流距上次发送不足video_frame_interval_ms则丢弃防止 24 帧/秒级视频流造成拥塞。_process_video_frame第 934-966 行将摄像头默认的 BGR 帧反转通道为 RGBclip 到 0-255 后转 uint8再以 JPEGquality75, optimize压缩并 base64 编码最终conversation.append_video()发送——这也是video_frame_interval_ms注释中不要低于 500ms的直接原因。4.5 自动重连与心跳保活长连接场景下断线恢复是稳定性的关键QwenOmniContext内置了一套完整的容错机制第 101-278 行自动重连on_close回调记录断开时间并触发trigger_reconnection重连线程最多尝试 3 次max_reconnect_attempts: 3每次间隔固定 5 秒、单次建立连接超时 15 秒重连成功后会用缓存的session_update_params恢复会话参数心跳保活_heartbeat_loop第 636-648 行每 25 秒在连接存活且未在生成时发送一次update_session作为 keepalive防止服务端回收会话优雅销毁destroy_context第 1010-1086 行置位shutdown_event、禁用重连、关闭会话、清空两个队列并依次 join 心跳/音频/文本/重连线程。五、安装、启动与验证参考 README 的标准流程针对本配置需要# 1. 克隆并初始化子模块 git clone https://github.com/HumanAIGC-Engineering/OpenAvatarChat.git cd OpenAvatarChat git submodule update --init --recursive --depth 1 # 2. 安装依赖本配置含 LiteAvatar 数字人 uv run install.py --config config/chat_with_qwen_omni.yaml # 3. 下载数字人模型 uv run scripts/download_models.py --handler liteavatar # 4. 配置百炼 API Key二选一环境变量或写入 yaml 的 api_key 字段 export DASHSCOPE_API_KEY你的百炼密钥 # 5. 启动服务 uv run src/demo.py --config config/chat_with_qwen_omni.yaml启动前请确认ssl_certs/下存在localhost.crt与localhost.keyWebRTC 需 HTTPS缺失可参考 scripts/create_ssl_certs.sh 生成本配置concurrent_limit: 1即同一时刻仅支持一个并发会话服务默认监听0.0.0.0:8282浏览器通过 RTC 客户端页面访问。六、已知限制与调优建议结合参考文档与源码使用本 Handler 时需注意以下边界仅支持 manual 模式enable_turn_detection必须保持false服务端双工duplex能力尚未接入打断依赖本地InterruptHandler模型自带输入转写不可用enable_input_transcription默认关闭回显文本由 SenseVoice 承担若你不需要字幕回显可保留该行为避免多余推理开销音频格式是硬约定上行 16kHz、下行 24kHz 单声道 16bit PCM对应 SileroVAD 与数字人模块的采样率假设勿随意改动视频帧间隔有下限video_frame_interval_ms低于 500ms 会在配置校验期报错一般 1000ms 已是较为平滑的取值音色需在服务端支持列表内voice仅支持Chelsie/Serena/Ethan/Cherry且与具体模型能力相关变更前请以百炼实际返回为准断线恢复是自愈的最多自动重连 3 次、每次间隔 5s若网络持续不稳定会放弃重连并记录错误日志可通过源码中max_reconnect_attempts等常量按需调整。总而言之QwenOmniHandler 让 OpenAvatarChat 能以单模型、双模态语音视频输入、单链路语音输出的方式搭建实时数字人对话其 manual 模式 本地 VAD SenseVoice 回显 自动重连的组合是理解本项目 Handler 编排与长连接工程化的一个极佳样例。赞分享数字人AI 应用语音多模态音视频后端【免费下载链接】OpenAvatarChat项目地址https://gitcode.com/gh_mirrors/op/OpenAvatarChat点击查看免费下载相关推荐OpenAvatarChat 接入 Qwen-Omni 实时多模态 Handler基于百炼 API 的全链路实战指南OpenAvatarChat 接入 Qwen Omni 实时多模态 Handler基于百炼 API 的全链路实战指南 导读 本文围绕 docs/referen数字人AI 应用语音多模态音视频后端OpenAvatarChat 集成 OpenAI 兼容 LLM Handler配置参数、流式推理与源码实现解析OpenAvatarChat 集成 OpenAI 兼容 LLM Handler配置参数、流式推理与源码实现解析 导读 OpenAvatarChat 通过 LL数字人AI 应用语音多模态音视频后端Sealed Secrets 技术参考FAQ 级深度指南与 kubeseal / 控制器实战解析Sealed Secrets 技术参考FAQ 级深度指南与 kubeseal / 控制器实战解析 本文是 Bitnami Sealed Secrets 项目的数字人AI 应用语音多模态音视频后端上一篇告别繁琐安装用Scoop与PowerShell打造极简Windows命令行工作流下一篇旅行博主必备用Guizang Social Card Skill打造令人惊艳的旅行攻略图文创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考