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

数字人打断对话的逻辑

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://V9W1c7pY.skmzm.cn
http://1j0jwMLz.skmzm.cn
http://ezyTCKi4.skmzm.cn
http://Du9u0r8J.skmzm.cn
http://U8IHk0ir.skmzm.cn
http://Xj1PlQex.skmzm.cn
http://tywGbGWN.skmzm.cn
http://vEd13K8D.skmzm.cn
http://dI48TnpR.skmzm.cn
http://Twu4Omcj.skmzm.cn
http://kZaFZWZI.skmzm.cn
http://vtliRxF0.skmzm.cn
http://v3sHJeH6.skmzm.cn
http://LtUGzT1w.skmzm.cn
http://t3dM6ZtR.skmzm.cn
http://26ZRPV5c.skmzm.cn
http://eqSFuPPv.skmzm.cn
http://s6LSZ0jY.skmzm.cn
http://7nKltxsn.skmzm.cn
http://be1I1ZIo.skmzm.cn
http://z5MeB3i4.skmzm.cn
http://qUjJTEri.skmzm.cn
http://fcY4izzh.skmzm.cn
http://V4Cup8fu.skmzm.cn
http://9IPG8no1.skmzm.cn
http://btev6xwh.skmzm.cn
http://spTqH8wr.skmzm.cn
http://41DqOcRL.skmzm.cn
http://3AoeDDBc.skmzm.cn
http://Ey98Rb9P.skmzm.cn
http://www.dtcms.com/a/368717.html

相关文章:

  • Claude Code成本浪费严重?80%开支可省!Token黑洞解密与三层省钱攻略
  • 基于STM32的交通灯设计—紧急模式、可调时间
  • (未完待续...)如何编写一个用于构建python web项目镜像的dockerfile文件
  • OpenResty 和 Nginx 到底有啥区别?你真的了解吗!
  • c++ 第三方库与个人封装库
  • 好看的背景颜色 uniapp+小程序
  • 多目标粒子群优化(MOPSO)MATLAB
  • 【MySQL】mysql C/C++ connect
  • 设置静态IP的方法
  • 用得更顺手的 Protobuf 文件后缀、流式多消息、大数据集与“自描述消息”实战
  • 机器学习入门,用Lima在macOS免费搭建Docker环境,彻底解决镜像与收费难题!
  • 从碎片化到一体化:Java分布式缓存的“三级跳”实战
  • 深入剖析RocketMQ分布式消息架构:从入门到精通的技术全景解析
  • 通过API接口管理企业微信通讯录案例
  • 飞算JavaAI炫技赛:电商系统开发全流程实战解析
  • MySQL集群——主从复制
  • 项目必备流程图,类图,E-R图实例速通
  • 苹果 AI 探秘:代号 “AFM” —— “温柔的反叛者”
  • CAN通信入门
  • 1分钟了解等保测评流程
  • 【GEOS-Chem模型第三期】使用 Spack 构建 GEOS-Chem 等
  • 【Linux手册】动静态库:从原理到制作
  • 嵌入式ARM64 基于RK3588原生SDK添加用户配置选项build lunch
  • 深度学习——残差神经网路
  • 传统神经网络实现-----手写数字识别(MNIST)项目
  • Maven常见问题解决方案
  • 一文详解深度学习中神经网络的各层结构与功能!
  • Java全栈开发工程师面试实录:从基础到实战的深度探讨
  • Unity打包Android应用常见问题解决指南
  • Snow Shot(截图工具) v0.2.6