下面是一套比较通用、实战中常用的「直播间数字人 TTS 节流/调度」思路。思路分成两层:事件层(如何从海量原始消息里挑出“要说的”)和 播报层(如何把挑出来的事件播得自然、随机、不卡顿)。


1 事件层:先把海量消息“提炼成要说的事”

步骤

目的

实现要点

1.1 分类 & 打标签

区分不同优先级

把事件粗分为:①高价值互动(付费礼物/重大评论)、②一般互动(提问、@)、③低价值通知(进入/点赞…)。不同类别后面用不同节流策略。

1.2 合并 & 去重

减少同质信息

进入消息常见做法:– 设 2–5 秒滑动窗口,把窗口里所有进入合并成一句:「欢迎 A、B、C 等 12 位新朋友」。– 点赞同理,可做「本场点赞数已破 N!」型播报。

1.3 抽样 / 权重随机

保留“热度感”,又不全播

对低价值事件做 概率采样:例如实时在线人数 < 1000 时 100% 播报进入消息;> 1000 时用 p = 1000/在线人数 的概率抽样。或者蓄水池抽样:窗口内随机留下 1–3 条待播。

1.4 打分 / 排队

给调度器一个“先后顺序”

给每条事件算一个 score = (价值×权重) - 时间衰减。用 优先队列(max-heap)丢给播报层。


2 播报层:让数字人口播既不卡、又不机械

2.1 速率节流(Rate Limiter)

  • 令牌桶 / 漏桶:给 TTS 线程设置“每分钟最多 N 条”硬上限,避免极端高峰。

  • 软间隔:相邻两条语音最少间隔 δ 秒(例如 δ = 2s)。保证上一句没说完不会被下一句截断。

2.2 随机化 & 模板多样化

  1. 多句式模板库

    欢迎 {user} 来到直播间!
    {user} 也加入了我们,热烈欢迎~
    很高兴见到 {user} !
    

    播放时随机挑一句,或者根据用户性别/等级做微调。

  2. 插播小惊喜
    每隔 K 条自动插一条固定句式(“喜欢的朋友点点关注哦”),用 randint(5,8) 之类的随机间隔,让节奏更自然。

2.3 任务切换与打断

  • 可中断播报:高优先级事件(大额礼物)实时打断当前播报。实现上可以让 TTS Engine 支持 stop(),然后把当前句子回到队列首,后续重新排。

  • 过时丢弃:如果一条事件在队列里滞留时间 > T (如 10 s),直接丢弃或改成总结式播报,避免“旧闻播报”。