graph TD
subgraph "A. 消息生产与清洗并入库(独立运行,不拥堵)"
Q1["读取config.py中的定时任务"]
Q2["读取config.py中的直播间地址"]
Q3["读取config.py中的MESSAGE_FILTER_SETTINGS"]
A1["直播间获取消息<br>(调用 \\utils\\DouyinLiveWebFetcher)"<br>预热模式:关闭]
A2["手动发送自定义消息"]
A3["定时发送自定义消息"]
B1["构建消息<br>(携带类型: chat, like, follow等)"]
B2["构建消息<br>(携带类型: chat, like, follow, tts_direct,base_talk等)"]
B3["消息滤网[关键词|用户名|类型]类似黑名单"]
C1[(消息池 message pool<br>消息60秒过期机制<br>读取config.py中的# Message Pool Settings)]
Q3 --> B3
Q2 --> A1
Q1 --> A3
A2 --> B2
A3 --> B2
A1 --> B1
B1 --> B3
B2 --> B3
B3 --"消息过滤后进入"--> C1
end
subgraph "B. 消息处理与决策"
C1 --> D1["拉取消息池发送至N8N_DECISION_WEBHOOK并返回消息 id"]
D1 --> E1["根据消息 id 从消息池中取出<br>(在消息池中会相应删除)"]
E1 --> F1{读取config.py中的Maps message types<br>并匹配优先级}
F1 --> G1["消息优先级属于P0?"]
G1 --"是"--> H1["将消息发送至N8N_LLM_WEBHOOK并返回响应"]
G1 --"否"--> G2["消息优先级属于P1?"]
G2 --"是"--> H2["将消息发送至N8N_LLM_WEBHOOK并返回响应"]
G2 --"否"--> G3["消息优先级属于P2?"]
G3 --"是"--> H3["将消息发送至N8N_LLM_WEBHOOK并返回响应"]
G3 --"否"--> G99["消息优先级属于P99?"]
G99 --"是"--> H99["将消息发送至N8N_LLM_WEBHOOK并返回响应"]
H1 --> I1["TTS服务端socket_server.py"]
H2 --> I2["TTS服务端socket_server.py"]
H3 --> I3["TTS服务端socket_server.py"]
H99 --> I99["TTS服务端socket_server.py"]
J999[(持久堆积P99音频块池)]
Z1["音频块推送员<br>独立运行<br>当后续音频池为空时才会推送音频<br>每次完整推送所有音频块"]
I1 --> K1
I2 --> K1
I3 --> K1
I99 --> K1
K1["音频池管理器"]
K1 --> J999
J999 --> Z1
K1 --"音频入音频池后返回拉取消息池并循环"--> D1
end
subgraph "C. TTS播报层,<br>预热模式:关闭"
L1["播放器 (异步+优先级轮询音频流池: P0 > P1 > P2 > P99)"]
K1 --> L1
end
subgraph "音频池区"
J1[(音频池P0)]
J2[(音频池P1)]
J3[(音频池P2)]
J99[(音频池P99)]
K1 --> J1
K1 --> J2
K1 --> J3
K1 --> J99
Z1 --> J99
endtesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttest
评论