数字人作为广播工具:消息透传接口的作用和实现
随着人工智能大模型和数字人技术的普及,数字人不仅可以与人类进行自然对话,还可以承担更加广泛的传播任务。相比逐字逐句的互动场景,很多企业或组织需要一种单向广播的能力:一次性让数字人发布公告、播报新闻或者引导操作,而不用等待用户回应。Fay 框架通过提供“消息透传”接口,让数字人具备了广播工具的能力。本文从应用场景、接口用法和内部实现三个方面解读这一功能。
一、广播应用场景
数字人的广播能力可以用于多种场景,下面列举几个典型的应用,实际部署时可以根据需要扩展:
-
企业广播通知:公司召开会议、推送人事政策更新、发布行政公告等,只需将文本或录制好的语音通过透传接口发送,数字人便会在各终端统一播报。尤其适合于内部宣传或在线办公场景。
-
新闻播报:媒体机构或自媒体可以定时通过透传接口下发新闻摘要,数字人自动完成音视频播报,营造拟人化的阅读体验。
-
签到/提醒广播:教育培训或会议活动中,可以通过透传接口让数字人循环播报“欢迎签到”、“课程即将开始”等提示,配合二维码或链接实现快速签到。
-
产品宣传和活动推广:在商场、展会或直播间,数字人可以通过透传接口播报产品介绍、限时优惠或抽奖信息,吸引用户注意。
-
值班/排班提示:一些运维或安保场景需要定时提醒值班人员交接班或巡检,透传接口可以让数字人不间断播报排班信息,减少人工记忆成本。
数字人相比传统广播更具“人情味”:可以选择不同的声音风格,还可以在播报同时呈现表情、动作甚至唇形动画,增强沉浸感。
二、Fay 提供的消息透传接口
Fay 在服务端的 flask_server.py
中暴露了一个消息透传接口,URL 路径为 /transparent-pass
,以 POST
方法接收数据。接口兼容表单(form-data
)和 JSON
两种格式,通过 user
、text
和 audio
等字段描述要播报的内容。核心逻辑如下GitHub:
-
服务端首先解析请求数据,
user
指明播报的用户(或数字人姓名),text
为要播报的文字,audio
可选,用于直接传入外部音频文件地址GitHub。 -
然后构造一个
Interact('transparent_pass', 2, {...})
对象,这个对象的interleaver
为transparent_pass
,interact_type
为2
,表示透传模式。data
字典里包含了用户、文本、音频地址以及isfirst
和isend
等控制标志GitHub。 -
日志系统会记录“透传播放:文本/音频”,便于后端监控GitHub。
-
最终调用
fay_booter.feiFei.on_interact(interact)
处理该消息。如果返回success
,则表示透传成功GitHub。
在客户端使用时,可以通过类似下面的 cURL
或 HTTP 请求调用该接口:
POST /transparent-pass
Content-Type: application/json{"user": "Alice", # 指定数字人名称或用户id"text": "各位早上好,今日会议将在十点准时开始,请提前签到。","audio": null, # 可选:如果填入音频URL,数字人将直接播放此音频
}
如果只想播放音频而不合成文字,可以将 text
置空,仅提供 audio
,Fay 会下载音频文件后播放。调用方也可以组合多个透传请求,将一段长文本拆分成多条有序的广播。
三、透传消息在 Fay 内部的处理流程
接口接受到消息后会交由核心模块 FeiFei
处理。FeiFei.on_interact
根据 interact_type
选择不同路径;透传模式的 interact_type
固定为 2。当 __process_interact
检测到 index == 2
时,将执行以下步骤GitHub:
-
从
interact.data
中读取text
;如果存在文本,先调用__process_text_output(text, username, uid)
进行统一的面板推送和日志记录GitHub。 -
再调用
__process_stream_output(text, username, f"type2_{interact.interleaver}")
,按标点切分文本并启动流式播放GitHub。 -
函数返回
'success'
,表示透传处理完成。
这种实现方式保证了透传广播能够复用 Fay 现有的文本输出流程。__process_text_output
会将完整内容推送到 Web 面板或其他界面,方便客户端查看完整信息;__process_stream_output
会使用 StreamTextProcessor
将文本拆成短句,通过 stream_manager
排队播放。这意味着即便是长篇新闻,数字人也会一句一句地播报,而且每句仍然可以配合表情和唇形动作。
透传广播也支持外部音频。FeiFei.say
在播放时会检测 audio
字段,如果存在,则下载该文件并加入音频队列;否则便调用 TTS 合成音频并播放。因此调用方可以灵活选择直接上传已有录音,或仅发送文本让数字人朗读。
四、数据结构与调用封装
Fay 使用一个简单的 Interact
类来封装交互事件,其定义如下GitHub:
-
interleaver
:字符串,表示交互来源,如mic
、text
、socket
、auto_play
或transparent_pass
。 -
interact_type
:整数,1 表示用户输入交互,2 表示透传模式(广播模式)GitHub。 -
data
:字典,存放具体内容,包括用户标识、文本、音频地址、会话版本号等。GitHub
在透传广播中,data
常用的字段包括:
-
user
:数字人的姓名或唯一标识。如果该用户第一次出现,系统会在on_interact
中为其注册。 -
text
:要播报的内容,可为空。 -
audio
:可选,外部音频文件的 URL。如果同时提供文本和音频,音频优先生效。 -
isfirst
/isend
:布尔值,标记当前句子在多句广播中的位置,便于 Fay 内部确定会话边界。 -
session_version
:会话版本号,用于打断旧播报;透传模式一般无需手动指定,系统自动管理。
通过这种统一的封装,Fay 可以在内部不同模块之间传递交互信息,既兼容用户问答又支持广播模式,减少代码重复。
五、实践建议与注意事项
-
单条广播建议同时设置
isfirst=True
与isend=True
,让 Fay 知道这是一个完整会话,避免等待额外结束标记。若要连续播报多句,可以拆分多次调用并设置首尾标志。 -
尽量提供清晰的
user
名称,保证日志可追踪,也方便多数字人环境下区分不同用户的广播任务。 -
合理利用音频字段:文本播报需要调用 TTS,可能受限于语速或字符数,且会产生额外合成费用。已有录音文件则可以直接透传,节省合成时间和成本。
-
透传不返回大模型回复:它是一种单向广播工具,不会触发问答逻辑。如果需要在播报后继续问答,建议分开两个请求或在播报结束后再调用问答接口。
-
与自动播报结合:Fay 内置的自动播报任务可以通过轮询内容数据库推送消息,与透传接口配合可以实现定时播报、新闻自动刷屏等高级能力。
六、结语
Fay 的消息透传接口为数字人提供了高效的广播能力。通过简单的 POST
请求即可让数字人朗读文本或播放录音,而且内部复用流式处理和情绪合成机制,保证每个句子都有自然的停顿和表情。无论是企业通知、新闻推送还是签到提醒,数字人都可以像广播站一样准时播报。未来结合任务调度和多情感合成技术,数字人的广播角色将更加丰富和智能。