mapleafgo cbccb07398 feat(audio): 添加音频播放进度监控和停滞检测
为诊断 TTS 音频播放卡死问题,在 PlayWav 函数中添加实时播放进度监控:

- 每秒打印当前播放位置、进度百分比和播放时间
- 检测播放停滞(位置不变时打印警告)
- 改进日志输出,显示总样本数和预计时长
- 移除 select case 中的多余花括号

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-08 16:38:35 +08:00
2024-11-19 18:34:38 +08:00
2025-03-12 19:13:35 +08:00
2024-12-19 11:40:38 +08:00
2025-03-10 10:42:39 +08:00
2024-11-01 17:40:34 +08:00
2025-01-08 10:46:29 +08:00
2025-09-25 18:07:59 +08:00
2025-09-25 18:07:59 +08:00
2025-03-17 15:38:35 +08:00
2024-11-01 17:40:34 +08:00
2025-03-17 10:16:15 +08:00
2025-07-11 17:41:36 +08:00
2025-03-12 19:15:19 +08:00

边缘盒子

topic 中的 location 指景区编码, point 指景区内具体点位

1. 接收启动

Topic: server/${location}/${point}/play

Payload:

{
  // 设备超时时长(s)
  "timeout": 30,
  // 是否需要整体电源控制
  "power": true,
  // 游戏中背景音乐(支持 file:// 本地文件地址、 http(s):// 远程文件地址)
  "bgm": "",
  // 整体设备音量(0-1)
  "volume": 0.5,
  // 屏幕默认打印(设备待机时展示文本)
  "default-print": "",
  // 文本转语音整体控制
  "tts": {
    // 开始播报语音
    "start": "",
    // 超时自动停止时播报语音
    "timeout": "",
    // 结束播报语音
    "end": "",
    // 终止播报语音
    "stop": "",
    // 固定节点播报语音
    "timer": [
      {
        // 时间节点(s)
        "time": 10,
        // 语音文字
        "value": ""
      },
      ...
    ]
  },
  // 屏幕打印控制
  "print": [
    {
      // 时间节点(s)
      "time": 10,
      // 展示文字
      "text": "",
      // 持续时长(s)
      "duration": 10
    },
    ...
  ],
  // 根据具体游戏特定
  "game": {}
}

游戏节点报文

例: 入口欢迎播报

{
  "volume": 1,
  "tts": {
    "start": "欢迎前来挑战!"
  }
}

2. 事件反馈

状态变更

Topic: device/${location}/${point}/status

Payload:

0

0 待机; 1 使用中; -1 状态异常

3. 接收指令

终止

Topic: server/${location}/${point}/command

Payload:

stop

终止后台

Topic: server/${location}/${point}/command

Payload:

stop-bg

查询状态

Topic: server/${location}/${point}/command

Payload:

status

设备接收到该指令会立即向 device/${location}/${point}/status 发送一次当前状态

4. 待机执行

Topic: server/${location}/${point}/wait

Payload:

{
  // 执行的时间区间(需要系统配置正确时区)
  "cron": "17:20-21:35 1-5 * *",
  // 执行项
  "items": [
    {
      // 执行的时间区间
      "cron": "17:20-21:35 1-5 * *",
      // 间隔时间(s), 类型>2时, 该项无效, default 0
      "interval": 0,
      // 持续时长(s), 待机任务执行时持续的时长。为 0 表示 音频、视频、TTS 按播放时长,继电器、网页、投影仪、激光秀持续整个时间段。 default 0
      "duration": 0,
      // 事件类型(0: 音频; 1: 视频; 2: TTS; 3: 继电器; 4: 网页; 5: 投影仪; 6: 激光秀;) default 0
      "type": 2,
      // Game 指令执行时是否暂停。default false
      "pause": true,
      // 待机任务执行时是否锁定设备。default false
      "lock": false,
      // 事件数据(TTS为文字, 继电器为端口号,激光秀为节目名,投影仪忽略该参数, 其他都为地址链接。支持 file:// 本地文件地址、 http(s):// 远程文件地址)
      "data": "",
    },
    ...
  ]
}

同一个类型的待机任务只能有一个,当有新的任务到达时会覆盖之前的任务

配置时区

sudo timedatectl set-timezone Asia/Shanghai

Cron Format

The format consists of four fields separated by whitespace:

time dow dom month

Where:

  • time: Time range in 24-hour format (HH:MM[:SS]-HH:MM[:SS]) or * for all day. Seconds are optional.
  • dow: Day of week (0-6, where 0=Sunday)
  • dom: Day of month (1-31)
  • month: Month (1-12)

Multiple rules can be combined using semicolons (;).

Each field (except time) supports:

  • Single values: "5"
  • Lists: "1,3,5"
  • Ranges: "1-5"
  • Asterisk: "*" for any/all values
Description
巫山三峡龙脊项目工程机控制
Readme 7.9 MiB
v1.0.2 Latest
2026-04-09 13:10:20 +08:00
Languages
Go 83.9%
Python 16.1%