直播话术巡检系统(Windows版) — 实时语音转写、关键词检测、场景自动切换、告警推送、大屏可视化。支持 Windows VB-Cable 虚拟声卡音频采集,阿里云 ASR 实时识别。一键启动脚本,自动安装环境。
live-script-monitor-win — 直播话术巡检系统 (Windows 版)是一项面向实际任务的技能,主要用于实时采集直播音频 → ASR 语音转写 → 关键词检测 → 场景自动切换 → 告警推送 → 大屏可视化;一键启动 (核心功能);
创建 Python 虚拟环。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;
若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。
实时采集直播音频 → ASR 语音转写 → 关键词检测 → 场景自动切换 → 告警推送 → 大屏可视化。
双击 start_windows.bat 即可一键启动!
脚本会自动完成:
启动后打开浏览器访问:http://localhost:9999
本 Skill 包不含 FFmpeg、VB-Cable 等大型二进制依赖,首次使用需手动安装以下组件:
winget install Python.Python.3.12
或从 https://www.python.org/downloads/ 下载,安装时勾选 "Add Python to PATH"。
VBCABLE_Setup_x64.exe没有 VB-Cable 也可以启动系统,但无法采集系统音频。
启动脚本 start_windows.bat 会自动尝试安装 FFmpeg(winget 或 imageio-ffmpeg),无需手动操作。如自动安装失败,请手动安装:
winget install Gyan.FFmpeg
或从 https://www.gyan.dev/ffmpeg/builds/ 下载,将 ffmpeg.exe 放到 toolsffmpeg 目录。
scripts/config.yaml,填入你的密钥:aliyun_asr: enabled: true app_key: "你的AppKey" access_key_id: "你的AccessKeyId" access_key_secret: "你的AccessKeySecret"
也可以通过大屏管理后台(右上角齿轮)在线配置。
live-script-monitor-win/ ├── start_windows.bat # ← 一键启动脚本 (双击运行) ├── check_env.bat # 环境检查脚本 (只检查不安装) ├── assets/dashboard/ # 大屏前端 (Vue.js 3 SPA) │ ├── index.html # 主页面 (含弹窗管理后台) │ └── vue.global.prod.js # Vue 本地文件 (不依赖 CDN) ├── scripts/ # Python 后端 │ ├── main.py # 主入口 (LiveMonitorApp) │ ├── config.yaml # 配置文件 (含场景/规则/ASR密钥) │ ├── audio_capture.py # 音频采集 (跨平台: BlackHole/VB-Cable/WASAPI) │ ├── asr_base.py # ASR 抽象基类 + 工厂方法 │ ├── asr_aliyun.py # 阿里云 ASR 驱动 (WebSocket + httpx Token) │ ├── asr_iflytek.py # (预留) 科大讯飞 ASR 驱动 │ ├── asr_tencent.py # (预留) 腾讯云 ASR 驱动 │ ├── asr_baidu.py # (预留) 百度 ASR 驱动 │ ├── rule_engine.py # 规则引擎 (关键词检测/场景切换/告警) │ ├── dashboard_server.py # HTTP+WS 大屏服务 (FastAPI+Uvicorn) │ ├── setup_env.py # 环境检查脚本 (Python 版) │ ├── test_local.py # 本地测试脚本 (无需 ASR/音频) │ ├── requirements.txt # Python 依赖 │ └── .venv/ # Python 虚拟环境 (start_windows.bat 自动创建) ├── tools/ # FFmpeg 存放目录 (自动下载) │ └── ffmpeg/ │ └── ffmpeg.exe # (启动脚本自动安装) ├── recordings/ # 录制输出目录 ├── logs/ # 日志目录 └── references/ # 参考文档
系统音频 ──→ VB-Cable 虚拟声卡 ──→ FFmpeg(dshow) ──→ PCM s16le 16kHz mono ──→ AudioCapture._emit_audio() ──→ ASR.send_audio() ──→ 阿里云 NLS WebSocket ──→ TranscriptionResultChanged(中间结果) ──→ 大屏流式显示 + 规则引擎 ──→ SentenceEnd(最终结果) ──→ 大屏历史记录 + 规则引擎全量检查 ──→ 关键词命中 ──→ 场景切换 + 告警判定 ──→ 大屏推送告警
VBCABLE_Setup_x64.exe打开 Windows 系统设置 → 声音:
或者使用「立体声混音」替代方案:
# 列出 dshow 设备,确认 CABLE Output ffmpeg -list_devices true -f dshow -i dummy # 测试抓 3 秒音频 ffmpeg -f dshow -i "audio=CABLE Output (VB-Audio Virtual Cable)" -f s16le -ac 1 -ar 16000 -t 3 test.raw
系统自动构建的命令:
ffmpeg -f dshow -i "audio=CABLE Output (VB-Audio Virtual Cable)" -f s16le -acodec pcm_s16le -ac 1 -ar 16000 -loglevel error pipe:1
dshow — Windows DirectShow 音频采集audio=CABLE Output (VB-Audio Virtual Cable) — VB-Cable 虚拟声卡完整设备名s16le — 16 位小端 PCMac 1 — 单声道ar 16000 — 16kHz 采样率(阿里云 ASR 要求)asr_provider: aliyun
aliyun_asr:
enabled: true
app_key: "你的AppKey"
access_key_id: "你的AccessKeyId"
access_key_secret: "你的AccessKeySecret"
url: "wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1"
params:
format: pcm
sample_rate: 16000
enable_intermediate_result: true
enable_punctuation_prediction: true
enable_inverse_text_normalization: true
也可以通过大屏管理后台(右上角齿轮)在线配置,保存后自动重启。
使用 httpx 直接调用阿里云 CreateToken REST API,通过 HMAC-SHA1 签名鉴权。不需要安装 aliyun-python-sdk-core。
streamer:
capture_mode: system_audio # 推荐值
audio:
sample_rate: 16000 # 阿里云 ASR 要求 16kHz
channels: 1 # 单声道
format: s16le # 16位小端 PCM
chunk_seconds: 1 # 每片 1 秒,越小延迟越低
| 模式 | 说明 | 适用场景 |
|---|---|---|
system_audio |
系统声卡捕获 (推荐) | Windows 直接采集系统输出音频 |
stream |
拉取 RTMP/FLV 直播流 | 有推流地址时 |
hybrid |
先试拉流,失败切系统声卡 | 不确定推流地址是否可用 |
watch |
监听录制目录文件 | 配合 DouyinLiveRecorder 使用 |
_emit_audio() 会采样检测非零字节比例:
注意:没有声音播放时 VB-Cable 抓到全零是正常现象,不是 Bug。
config.yaml 中 app.scene_mode: auto_keyword 时启用关键词驱动场景切换:
detect_scene_by_keywords 基于 switch_keywords 精确子串匹配| 类型 | 说明 | 触发条件 |
|---|---|---|
absence_alert |
缺失告警 | 时间窗口内关键词命中次数 < min_hits |
frequency_alert |
频次告警 | 时间窗口内核心短语命中次数 < min_hits |
告警去重:同一 scene_id + rule_type + window 组合在 5 分钟内只触发一次。
http://localhost:9999os.execv 原地重启)saveSystemConfig() 自动设 enabled: truevue.global.prod.js,不依赖 CDN)cd scripts .venvScriptspython.exe test_local.py
模拟直播话术数据,验证大屏展示和规则引擎工作正常。
netstat -an | findstr 9999)capture_mode 是否为 system_audioffmpeg -version)| 问题 | 原因 | 修复 |
|---|---|---|
| FFmpeg 报错退出 (code=1) | dshow 设备名不完整 | 确保 audio_capture.py 提取完整设备名含 (VB-Audio Virtual Cable) |
| Vue.js 白屏 | vue.global.prod.js 缺失 | 确认 assets/dashboard/ 目录有该文件 |
| ASR error 40000004 | FFmpeg 没采集到音频导致 ASR 空闲超时 | 检查 VB-Cable 是否安装、音频是否在播放 |
| ASR 填了正确 key 但不生效 | aliyun_asr.enabled 仍为 false |
前端 saveSystemConfig 自动设 enabled:true |
| ASR 连接成功但无转写文字 | TranscriptionResultChanged 过滤条件过严 | 去掉长度过滤,有 result 就输出 |
| VB-Cable 抓到全零数据 | 当前没有声音在播放 | 正常现象,播放音频时会有非零数据 |
| FFmpeg 报找不到设备 | VB-Cable 未安装或名称不匹配 | 检查 dshow 设备列表 |
| capture_mode=hybrid 先拉流等 15 秒 | 拉流必失败才降级 | config.yaml 改 capture_mode: system_audio |
| 场景识别不准 | switch_keywords 不匹配实际话术 | 根据实际直播话术调整 config.yaml |
| 告警规则不执行 | process_text 只在 final 结果时调用 | partial 结果也送入规则引擎 |
| 告警被 dedup 阻止 | dedup 检查在告警判定之前 | dedup 移到告警判定之后 |
| 页面报 {"error":"dashboard not found"} | static_dir 路径不对 | config.yaml: static_dir: ../assets/dashboard |
| FFmpeg 不在 PATH | 安装后未刷新环境变量 | 重启终端或电脑 |
| 中文乱码 | cmd 编码问题 | start_windows.bat 已设置 chcp 65001 |
轻量化打包
Windows 适配修复
CABLE Output (VB-Audio Virtual Cable)start_windows.bat 一键启动脚本