当前位置: 首页 > ai >正文

数字人打断对话的逻辑

1 专门的打断接口

fay 在控制端提供了一个“打断”接口,允许外部通过调用 HTTP API 直接中断正在进行的播报。在 gui/flask_server.py 中注册了 /to-stop-talking 路由,该接口接收到 POST 请求后会根据 username 获取对应的对话流,并调用 stream_manager.new_instance().clear_Stream_with_audio(username) 清空文本流和音频队列GitHub。其中 clear_Stream_with_audio 会内部调用 _clear_Stream_internal_clear_audio_queue 来清除当前的输出并设置停止生成标志GitHub。接口返回状态“已停止说话”,同时利用 util.printInfo 记录日志,使管理后台或调用方能够监控到打断操作GitHub。

这一专门接口的设计方便了数字人在交互中途被外部控制中断,例如产品 UI 按下“停止播报”按钮时即可调用此 API,一次性结束当前播报并保证内部队列清零。

2 文字消息打断

fay 支持在文本交互中通过特殊标记来打断当前对话。文本流由 StreamManager 管理,在 write_sentence 方法内部会检查写入的句子是否包含 _ (下划线加空格)GitHub。当检测到该标记时,系统会:

  • 调用 _clear_Stream_internal(username) 清空当前用户的文本缓存GitHub。

  • 调用 _clear_audio_queue(username) 清空音频队列并设置停止生成标志GitHub。

  • stop_generation_flags 置为 False,为后续的新对话重启生成GitHub。

这一机制使得客户端只需在发送文本内容前加上 _ 标记,就能让机器人立即停止前一次回答并开始处理新问题。例如发送 _ 重新说一遍天气预报 会打断正在播报的内容,数字人重新回答新问题。利用这种标记式打断,可以避免后台额外的接口调用,简化客户端逻辑。

3 语音消息打断

语音交互过程中,fay 会根据当前播报状态和用户说话检测决定是否采集音频。当数字人在播音时或未被唤醒时,系统通过 can_listen 开关判断是否允许拾音;如果 wake_word_enabledFalseself.__fay.speaking == True,则将 can_listen 置为 False 丢弃录音GitHub。一旦允许拾音,Recorder 会实时计算输入音量,利用动态阈值判断用户是否正在讲话。若检测到音量超过阈值且当前未处理语音,则启动 ASR,清空历史缓存并累积新的音频数据GitHub。在用户结束讲话后,__aLiNls.end() 停止录音并将累积的音频发送给语音识别GitHub。

这种逻辑保证了“人声插入优先级高于数字人播报”:当监听到用户开始讲话并超过阈值时,系统会停止自动播放并转入录音/识别流程。若数字人正在说话且没有唤醒标记,则丢弃录音,以免背景噪音误触发GitHub。通过实时检测动态阈值,语音打断既敏感又能防止误触。

4 唤醒打断

除了插入式打断,fay 还支持通过唤醒词打断自动播放。Recorder 在完成一次语音识别后会检查识别文本中是否包含配置的唤醒词列表。当 wake_word_enabledTruewake_word_typecommon 时,如果当前还未匹配唤醒词,系统会遍历唤醒词列表检查识别文本;若匹配成功,则记录“唤醒成功”,将 wakeup_matched 设为 True,同时通过 auto_play_lockfay_core.can_auto_play 置为 FalseGitHub。随后调用 stream_manager.new_instance().clear_Stream_with_audio(self.username) 清空流和音频队列,并用 Interact("auto_play", 2, {...}) 推送“在呢,你说?”提示GitHub。

若配置了“前置唤醒词”模式,系统还会判断文本是否以唤醒词开头;匹配后会截取唤醒词后的内容作为问题并直接交由 on_speaking 处理,同样先清空流和音频队列GitHub。这种唤醒打断适合需要先说出唤醒词再提问的场景,确保数字人在播报时不会误听周围对话。

总结

fay 的数字人打断逻辑通过 接口级打断文本标记打断语音检测打断唤醒打断 四种方式构建了完整的“中断机制”。专门的 /to-stop-talking API 可直接清空队列,文本中的 _ 标记让客户端无需额外请求即可中断;语音端利用动态阈值和当前播报状态判断是否拾音,从而让用户随时“插话”;唤醒词功能则在自动播放模式下提供了一种先叫醒再打断的途径。这些策略结合保证了数字人交互的灵活性,也避免了系统误被噪音或无关语句打断。

http://www.xdnf.cn/news/20123.html

相关文章:

  • 本地 Ai 离线视频去水印字幕!支持字幕、动静态水印去除!
  • python-虚拟试衣
  • LVS、Nginx与HAProxy负载均衡技术对比介绍
  • 任意齿形的齿轮和齿条相互包络工具
  • Linux常见命令总结 合集二:基本命令、目录操作命令、文件操作命令、压缩文件操作、查找命令、权限命令、其他命令
  • Process Explorer 学习笔记(第三章3.2.5):状态栏信息详解
  • PyTorch 训练显存越跑越涨:隐式保留计算图导致 OOM
  • 机器学习周报十二
  • 基于Echarts+HTML5可视化数据大屏展示-旅游智慧中心
  • CC-Link IE FB 转 DeviceNet 实现欧姆龙 PLC 与松下机器人在 SMT 生产线锡膏印刷环节的精准定位控制
  • docker 安装kafaka常用版本
  • 错误波形曲线
  • Qt信号与槽机制全面解析
  • Redis 事务:餐厅后厨的 “批量订单处理” 流程
  • 两条平面直线之间通过三次多项式曲线进行过渡的方法介绍
  • 雅菲奥朗SRE知识墙分享(七):『可观测性的定义与实践』
  • C++两个字符串的结合
  • 本地 Docker 环境 Solr 配置 SSL 证书
  • SQL与数据库笔记
  • Windows搭建WebDAV+Raidrive,实现磁盘映射
  • CentOS安装或升级protoc
  • 【学习笔记】解决 JWT 解析报错:Claims claims = JwtUtil.parseJWT(...) Error Code 401(token过期)
  • 开讲啦|MBSE公开课:第五集 MBSE中期设想(下)
  • Process Explorer 学习笔记(第三章3.2.4):找出窗口对应的进程
  • Python+DRVT 从外部调用 Revit:批量创建梁
  • PiscCode轨迹跟踪Mediapipe + OpenCV进阶:速度估算
  • VIVADO的IP核 DDS快速使用——生成正弦波,线性调频波
  • 【FastDDS】Discovery ( 04-STATIC Discovery Settings)
  • yolov8环境配置:从安装到卸载,从入门到放弃。
  • std::complex