数字人打断对话的逻辑
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_enabled
为 False
且 self.__fay.speaking == True
,则将 can_listen
置为 False
丢弃录音GitHub。一旦允许拾音,Recorder
会实时计算输入音量,利用动态阈值判断用户是否正在讲话。若检测到音量超过阈值且当前未处理语音,则启动 ASR,清空历史缓存并累积新的音频数据GitHub。在用户结束讲话后,__aLiNls.end()
停止录音并将累积的音频发送给语音识别GitHub。
这种逻辑保证了“人声插入优先级高于数字人播报”:当监听到用户开始讲话并超过阈值时,系统会停止自动播放并转入录音/识别流程。若数字人正在说话且没有唤醒标记,则丢弃录音,以免背景噪音误触发GitHub。通过实时检测动态阈值,语音打断既敏感又能防止误触。
4 唤醒打断
除了插入式打断,fay 还支持通过唤醒词打断自动播放。Recorder
在完成一次语音识别后会检查识别文本中是否包含配置的唤醒词列表。当 wake_word_enabled
为 True
且 wake_word_type
为 common
时,如果当前还未匹配唤醒词,系统会遍历唤醒词列表检查识别文本;若匹配成功,则记录“唤醒成功”,将 wakeup_matched
设为 True
,同时通过 auto_play_lock
将 fay_core.can_auto_play
置为 False
GitHub。随后调用 stream_manager.new_instance().clear_Stream_with_audio(self.username)
清空流和音频队列,并用 Interact("auto_play", 2, {...})
推送“在呢,你说?”提示GitHub。
若配置了“前置唤醒词”模式,系统还会判断文本是否以唤醒词开头;匹配后会截取唤醒词后的内容作为问题并直接交由 on_speaking
处理,同样先清空流和音频队列GitHub。这种唤醒打断适合需要先说出唤醒词再提问的场景,确保数字人在播报时不会误听周围对话。
总结
fay 的数字人打断逻辑通过 接口级打断、文本标记打断、语音检测打断 与 唤醒打断 四种方式构建了完整的“中断机制”。专门的 /to-stop-talking
API 可直接清空队列,文本中的 _
标记让客户端无需额外请求即可中断;语音端利用动态阈值和当前播报状态判断是否拾音,从而让用户随时“插话”;唤醒词功能则在自动播放模式下提供了一种先叫醒再打断的途径。这些策略结合保证了数字人交互的灵活性,也避免了系统误被噪音或无关语句打断。