13. 群组自动播报¶
1. 边界与权限¶
自动播报是中心服务进程的内部媒体来源,不注册为普通 UDP 设备,不占用用户 SSID、
设备密码、幽灵会话或任何用户可编辑的呼号。通信记录中的固定发送者快照为
system-broadcast / AUTO / 自动播报。
只有实体组的群主或站点管理员可管理该实体组的音频、计划和执行记录。虚拟组不提供
音频或计划创建入口;其策略只由管理员管理。站点还必须在配置中设置
Broadcast.Enabled: true,否则上传和手动触发返回 503 broadcast_disabled。
2. 时间、静默与话权¶
计划类型为 once、daily、weekly、interval:
once使用 UTCscheduled_at;到期后不再排期。daily使用 IANAtimezone与本地local_time。weekly在 daily 字段基础上使用weekday_mask,位1 << weekday,其中 Sunday=0。interval使用interval_seconds和interval_start_at设定计时 0 点,取整分钟且范围为 60 秒到 30 天;按 0 点递进, 服务恢复或扫描延迟时跳过已经错过的轮次,不补播。此类型不使用local_time、weekday_mask;timezone仅用于解释可选禁播时段。- 所有计划均可提供成对的
blackout_start_time与blackout_end_time,使用计划的timezone和半开区间[start, end)。开始时间晚于结束时间表示跨午夜,例如22:00:00至07:00:00。窗口内的自动触发点直接省略,不生成执行记录,也不改变 间隔计划的原始节拍;手动触发不受禁播时段限制。 - 夏令时不存在的本地时刻跳过;重复的本地时刻只执行第一次。
已有数据库升级后需按部署约定带一次 -auto-migrate 启动,以新增计划表中的禁播时段列;
全新空库会自动初始化。
每次到点都是独立轮次。同一个音频可被多个计划引用,也可以由不同计划引用不同音频; 不会合并、延迟或补播。服务重启、站点运行开关关闭或虚拟互联关闭期间错过的轮次都只 推进到下一次未来时间。
执行前服务端在当前活动通信域原子检查最近已接受语音:任一成员在最近 5 秒有语音帧,
本轮写为 skipped_recent_voice。静默后自动播报作为普通说话人取得现有严格半双工
话权;没有抢占优先级。开始播放后,真实设备同样受严格半双工限制,直到播放结束、
管理员停止或生命周期变更取消。单条音频默认最多 30 秒,硬上限为 60 秒。
3. 虚拟互联策略¶
实体组未被启用的虚拟组互联时,计划正常运行且只投递来源实体组。已关联但虚拟组关闭 的情况也相同。虚拟组实际开启时必须读取持久化策略:
suspend_all:成员实体组全部挂起,不产生媒体或自动播报通信记录。allow_single_source:仅指定的一个成员实体组可以执行计划;其活动域和发送快照包含 该虚拟组全部实体成员。
策略保证一个活动互联域最多有一个自动播报来源。被允许的来源播放期间仍占用整个互联 域的话权。普通语音、文本和该播报均在发送时用同一投递群组快照;关闭状态的虚拟组绝不 扩展历史或新消息的投递范围。
4. 实体组管理 API¶
所有以下接口均为 JWT+Approved,并需要群主或管理员权限。
| Method | Path | 说明 |
|---|---|---|
| GET | /api/groups/:id/broadcast-context |
当前互联、策略与本实体组是否允许播报 |
| GET/POST | /api/groups/:id/broadcast-audios |
音频列表或 multipart 上传 |
| GET/DELETE | /api/groups/:id/broadcast-audios/:audioId |
详情/试听或删除 |
| GET/POST | /api/groups/:id/broadcast-schedules |
计划列表或创建 |
| PATCH/DELETE | /api/groups/:id/broadcast-schedules/:scheduleId |
修改或删除 |
| POST | /api/groups/:id/broadcast-schedules/:scheduleId/run |
手动触发一次 |
| GET | /api/groups/:id/broadcast-runs |
分页执行历史 |
| POST | /api/groups/:id/broadcast-runs/:runId/cancel |
停止已认领或播放中的执行 |
音频上传使用 multipart/form-data,字段为 file 与可选 name。原文件先写入私有
对象存储,再由受控 ffprobe/ffmpeg 处理为 16kHz / mono / Opus VOIP / 60ms 的
播放文件。执行路径只读取已验证的播放文件;不会在到点时转码。列表中的 status 为
processing、ready 或 failed,仅 ready 音频可播放。详情中的 preview_url 为
短时试听 URL。
创建或更新计划的例子:
{
"audio_id": 12,
"name": "晚间点名",
"schedule_type": "daily",
"timezone": "Asia/Shanghai",
"local_time": "20:00:00",
"enabled": true
}
一次计划使用 scheduled_at(RFC3339);每周计划额外提供 weekday_mask。返回计划的
effective_enabled=false 表示计划本身虽可用,但当前正被开启的虚拟组策略挂起。
间隔计划示例:
{
"audio_id": 12,
"name": "每 15 分钟提醒",
"schedule_type": "interval",
"timezone": "Asia/Shanghai",
"interval_seconds": 900,
"interval_start_at": "2026-08-09T00:00:00Z",
"blackout_start_time": "22:00:00",
"blackout_end_time": "07:00:00",
"enabled": true
}
运行状态包括 succeeded、skipped_recent_voice、skipped_domain_busy、
skipped_interconnected、skipped_no_receiver、skipped_site_disabled、cancelled 和
failed。skipped_no_receiver 表示取得话权时,冻结的 UDP/UDP 幽灵接收快照、当前可接收的
WebSocket 会话及在线边缘投影中均没有接收者;服务端会立即释放话权,不进入播放或发送媒体。
error_code 会细分手动停止、计划停用、
音频撤销、群组停用、开启互联、站点紧急停止及服务关闭等原因。手动触发也复用全部资格
和话权校验。
删除音频、停用或删除计划、停用或删除群组、切换互联拓扑、删除用户都会先取消并等待
受影响的当前播放释放。计划和音频为软删除,既有执行历史保留;删除实体组时该组资源和
执行历史按外键顺序硬删除,并在事务提交后清理对象文件。若对象清理暂时失败,响应的
cleanup_pending 或 broadcast_cleanup_pending 为 true,可通过对象审计追踪。
5. 虚拟组与站点运维 API¶
管理员使用 PUT /api/group-links/:id/broadcast-policy 保存策略,例如:
{ "mode": "allow_single_source", "allowed_source_group_id": 1001 }
或全部暂停:
{ "mode": "suspend_all" }
GET /api/group-links/:id 返回 broadcast_policy 和 broadcast_members;列表返回策略摘要。
状态开关不重复询问策略。移除当前唯一来源前必须先更改策略。
站点管理员还可使用:
| Method | Path | 说明 |
|---|---|---|
| GET | /api/broadcast/metrics |
持久化执行统计、调度器与转码队列指标 |
| GET | /api/broadcast/health |
调度器、媒体处理器和运行开关健康快照 |
| PUT | /api/broadcast/runtime |
请求体 { "enabled": false },关闭/开启运行态 |
| POST | /api/broadcast/emergency-stop |
紧急停止当前任务并建立取消栅栏 |
运行态重新开启时,停用期间已经错过的计划不会补发。部署级 Broadcast.Enabled 与持久化
运行态是两层开关:前者决定该能力是否被部署,后者用于日常紧急停用。
6. 通信记录与责任边界¶
播放成功或已发送媒体的执行会写一条带 is_auto_broadcast=true 的通信记录及发送时的
comm_record_delivery_groups 快照。不会把音频复制成通信录音,记录的 audio_path 为空、
audio_size=0;原始文件和播放文件仍只在自动播报音频库。
射频台站设备由相应台站管理员自行接入、配置并对其射频运行负责,平台只向已经审核的 用户提供服务。自动播报音频和计划仅允许平台管理员或实体组群主管理,并由相应管理员 维护和审查播报内容。