modify: ip音柱插件

This commit is contained in:
2026-09-04 14:51:12 +08:00
parent 5ab68d6002
commit 5ec90a5575
12 changed files with 256 additions and 6 deletions
+8 -1
View File
@@ -59,7 +59,7 @@ async def _check_offline_devices(interval: float):
from .models.orm import BoardHeartbeat
from sqlalchemy import select
stmt = select(BoardHeartbeat).where(BoardHeartbeat.is_online)
stmt = select(BoardHeartbeat).where(BoardHeartbeat.is_online) # type: ignore
result = await session.execute(stmt)
records = result.scalars().all()
@@ -116,6 +116,11 @@ class AiboxSophonAdapterPlugin(Plugin):
doubao_cfg = config.get("doubao_analysis", {})
doubao_enabled = doubao_cfg.get("enabled", True)
# ip 音柱 TTS 播放开关
ip_sound_column_cfg = config.get("ip_sound_column", {})
ip_sound_column_enabled = ip_sound_column_cfg.get("enabled", True)
ip_sound_column_volume = ip_sound_column_cfg.get("volume", 50) # 播放音量 0-100
# 告警转发配置
alarm_fwd_cfg = config.get("alarm_forward", {})
alarm_fwd_enabled = alarm_fwd_cfg.get("enabled", False)
@@ -152,6 +157,8 @@ class AiboxSophonAdapterPlugin(Plugin):
set_global_var("upload_root", upload_root_path)
set_global_var("alarm_max_records", alarm_max)
set_global_var("doubao_analysis_enabled", doubao_enabled)
set_global_var("ip_sound_column_enabled", ip_sound_column_enabled)
set_global_var("ip_sound_column_volume", ip_sound_column_volume)
set_global_var("alarm_forward_enabled", alarm_fwd_enabled)
set_global_var("alarm_forward_url", alarm_fwd_url)
set_global_var("alarm_forward_video_url", alarm_fwd_video_url)
+6
View File
@@ -45,6 +45,12 @@ alarm_max_records: int = 0 # 0 表示不限制
# 豆包 AI 分析开关
doubao_analysis_enabled: bool = True
# ip 音柱 TTS 播放开关
ip_sound_column_enabled: bool = True
# ip 音柱 TTS 播放音量(0-100)
ip_sound_column_volume: int = 50
# 告警转发配置
alarm_forward_enabled: bool = False
alarm_forward_url: str = "http://dg.datagoo.cn:60014/open-api/event-alarm/receive"
+1 -1
View File
@@ -106,7 +106,7 @@ async def board_ping(request: BoardPingRequest, worker_id: str = "") -> dict:
stream_id = media["MediaName"]
source_url = media["MediaUrl"].replace("/Link", link_path)
try:
await stream_manager.start_stream(f"/{stream_id}", source_url)
await stream_manager.start_stream(f"/{stream_id}", source_url) # type: ignore
except Exception as e:
logger.warning(f"[Heartbeat] 通道 {stream_id} 拉流失败: {e}")
+1 -1
View File
@@ -49,7 +49,7 @@ async def list_alarms(
total = count_result.scalar() or 0
# 分页数据
stmt = select(AlarmRecord).order_by(desc(AlarmRecord.created_at))
stmt = select(AlarmRecord).order_by(desc(AlarmRecord.created_at)) # type: ignore
if conditions:
from sqlalchemy import and_
stmt = stmt.where(and_(*conditions))
+56 -2
View File
@@ -70,6 +70,41 @@ class _FileStream:
assert self._file is not None, "必须在 with 上下文内使用"
return self._file.seek(offset, whence)
# ============================================================
# 辅助函数 - 播放 tts 语音
# ============================================================
async def ip_sound_column_tts_play(zenoh_session, payload: dict) -> dict:
"""
播放 ip 音柱 tts 语音
可通过配置 ip_sound_column.enabled 关闭。失败时返回 {"command": ..., "result": -1}。
Args:
zenoh_session: Zenoh 会话(用于调用 ip_sound_column Worker)
payload: 请求体字典,包含 command / volume / play_count / queue / sync_response /
play_interval / tts_pitch / tts_speed / tts_voice_name / tts_text
"""
from .global_var import ip_sound_column_enabled
if not ip_sound_column_enabled:
logger.info("[TTS] ip_sound_column 播放已关闭 (ip_sound_column.enabled=false)")
return {"command": payload.get("command", ""), "result": -1}
async with Client(session=zenoh_session, logger=logger) as client:
try:
result = await client.call(
worker_type="ip_sound_column",
subject="ip_sound_column.tts",
method="POST",
payload=payload,
timeout=10.0,
retries=1,
)
return result
except Exception as e:
logger.error(f"[TTS] ip_sound_column 调用失败: {type(e).__name__}: {e}")
return {"command": payload.get("command", ""), "result": -1}
# ============================================================
# 辅助函数 — 告警处理各步骤拆分为独立函数
@@ -463,10 +498,29 @@ async def alarm_report(
Result=AlarmReportResult(Code=0, Desc="Doubao 分析判定为 False,忽略告警")
)
# 2. 写入本地数据库(按 AlarmId 去重 + 裁剪旧记录)
from .global_var import ip_sound_column_volume
# 2. ip 音柱 TTS 播放(可通过配置开关关闭),失败时仅记录日志,不影响主流程
tts_payload = {
"command": "play_local_tts",
"volume": ip_sound_column_volume,
"play_count": 1,
"queue": True,
"sync_response": False,
"play_interval": 2,
"tts_pitch": 50,
"tts_speed": 50,
"tts_voice_name": "xiaoyan",
"tts_text": f"告警: {full_data.get('Summary', '')}",
}
tts_result = await ip_sound_column_tts_play(request.app.state.zenoh_session, tts_payload)
if tts_result.get("result") != 0:
logger.warning(f"[AlarmReport] ip_sound_column TTS 播放失败: {tts_result}")
# 3. 写入本地数据库(按 AlarmId 去重 + 裁剪旧记录)
await _save_alarm_record(full_data)
# 3. 转发外部平台(先上传视频,再上报)
# 4. 转发外部平台(先上传视频,再上报)
await _forward_alarm_to_external(full_data)
return AlarmReportResponse(