# audio_tran **Repository Path**: MR-wind/audio_tran ## Basic Information - **Project Name**: audio_tran - **Description**: 实时监听摄像头音频流,通过 ASR 语音识别转写文字,匹配敏感词后自动触发告警并上报海康威视平台。 - **Primary Language**: Go - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-17 - **Last Updated**: 2026-06-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Audio Tran - 实时音频监控与敏感词识别系统 实时监听摄像头音频流,通过 ASR 语音识别转写文字,匹配敏感词后自动触发告警并上报海康威视平台。 ## 系统架构 ``` ┌──────────────┐ RTSP ┌──────────────┐ │ 摄像头 │──────────────▶│ Recorder │ │ (音频流) │ │ (录音/降噪) │ └──────────────┘ └──────┬───────┘ │ WAV 分段 ▼ ┌──────────────┐ stdin/stdout ┌──────────────┐ │ ASR Client │◀───────────────────▶│ ASR Worker │ │ (Go 进程) │ │ (Python 进程) │ └──────┬───────┘ │ FunASR 模型 │ │ 识别文本 └──────────────┘ ▼ ┌──────────────┐ │KeywordMatcher│ │ (敏感词匹配) │ └──────┬───────┘ │ 命中 ▼ ┌──────────────┐ HTTP POST ┌──────────────┐ │ 海康威视平台 │◀──────────────│ CallbackClient│ │ (告警接收) │ │ (告警上报) │ └──────────────┘ └──────────────┘ ``` ### 核心模块 | 模块 | 文件 | 职责 | |------|------|------| | Recorder | `recorder.go` | RTSP 音频流录制、降噪、VAD 切段、WAV 写入 | | ASR Client | `asr.go` | 管理 Python ASR 工作池,调度识别任务 | | ASR Worker | `asr_service/worker.py` | Python 进程,加载 FunASR 模型执行语音识别 | | KeywordMatcher | `keyword.go` | 敏感词匹配(精确/模糊/拼音/数字四种模式) | | CallbackClient | `callback.go` | 海康威视协议告警上报 | | API | `api.go` | HTTP 接口服务(敏感词管理、设备管理、告警查询) | | Database | `database.go` | SQLite 数据库(告警记录、分段记录、摄像头、敏感词) | | Retention | `retention.go` | 定时清理过期音频文件和数据库记录 | ### 敏感词匹配策略 按优先级依次匹配,命中即停止: 1. **精确匹配** — Aho-Corasick 多模式匹配 2. **模糊匹配** — 编辑距离(短词严格,长词宽松) 3. **拼音匹配** — 汉字转拼音后匹配(处理谐音字) 4. **数字匹配** — 中文数字与阿拉伯数字互转匹配 ## 编译需求 - **Go**: 1.26+ - **Python**: 3.10+(ASR 功能需要) - **CUDA**: 11.8+ / 12.1(GPU 加速需要,可选) - **NVIDIA 驱动**: >= 535(GPU 模式需要) ## 快速开始 ### Windows 开发环境 ```bash # 编译运行 go build -o audio_tran.exe . ./audio_tran.exe -config config.yaml # 交叉编译 Linux 版本 set GOOS=linux set GOARCH=amd64 set CGO_ENABLED=0 go build -ldflags="-s -w" -o audio_tran . ``` ### Linux 部署 #### 方式一:一键打包(推荐) 在有网络的 Linux 机器上执行: ```bash # 3060 等新显卡(CUDA 12.1) chmod +x asr_service/build_3060.sh ./asr_service/build_3060.sh # 1080Ti 等老显卡(CUDA 11.8) chmod +x asr_service/build_1080ti.sh ./asr_service/build_1080ti.sh ``` 产出 `audio_tran_linux_cu121.tar.gz` 或 `audio_tran_linux_cu118.tar.gz`。 #### 方式二:从 Windows 打包 Linux 版本 ```bash # 双击运行 asr_service/build_3060_win.bat ``` #### 部署到生产服务器 ```bash tar -xzf audio_tran_linux_cu121.tar.gz cd release_linux chmod +x *.sh audio_tran ./install.sh # 首次运行:安装 Python 依赖 ./start.sh # 启动服务 ``` ### 生产环境要求 - Linux x86_64 - Python 3.10+(`sudo apt install python3.10 python3.10-venv`) - NVIDIA 驱动 >= 535(GPU 模式) - 摄像头支持 RTSP 音频流 ## 配置说明 `config.yaml` 完整示例: ```yaml # 摄像头列表 cameras: - placeName: "cam01" # 场所名称(唯一标识) deviceName: "大门摄像头" # 设备名称 url: "rtsp://admin:pass@192.168.1.100:554/Streaming/Channels/101" startTime: "08:30:00" # 监听开始时间 endTime: "18:00:00" # 监听结束时间 speaker: "IPTalkChan1" # 海康对讲通道 cameraIndexCode: "cam01_code" # 海康摄像头索引码 srcIndex: "src01" # 海康资源索引 srcParentIndex: "parent01" # 海康父资源索引 srcName: "IPTalkChan1" # 海康资源名称 # 音频输出目录 output_dir: "output" # 服务器IP(用于拼接音频下载地址) server_ip: "192.168.1.100" # HTTP服务端口 http_port: 9333 # 音频分段时长(秒) segment_sec: 30 # 是否启用音频降噪 denoise: false # 是否启用VAD(语音活动检测,在静音处自动切段) vad_mode: true # ASR语音识别开关 asr_enabled: true # ASR服务目录 asr_dir: "asr_service" # 每个GPU启动的ASR worker数量 workers_per_gpu: 2 # 海康威视回调配置 hik_callback: enabled: true url: "http://hik-server/api/callback" cookie: "your_cookie" src_type: "talk" event_type: 70000001 # 音频文件保留天数 retention_days: 7 # SQLite数据库路径 db_path: "data/audio_tran.db" ``` ## API 接口 ### 敏感词管理 | 接口 | 方法 | 说明 | |------|------|------| | `/api/forbid/issues` | POST | 下发敏感词列表 | | `/api/forbid/rollback` | GET | 回滚到上次敏感词 | | `/api/forbid/query` | GET | 查询当前敏感词 | #### 下发敏感词 ```bash curl -X POST http://localhost:9333/api/forbid/issues \ -H "Content-Type: application/json" \ -d '[ { "keyWordGroup": "敏感词组1", "keyWord": ["敏感词A", "敏感词B"] }, { "keyWordGroup": "敏感词组2", "keyWord": ["敏感词C"] } ]' ``` ### 设备管理 | 接口 | 方法 | 说明 | |------|------|------| | `/api/device/status` | GET | 查询摄像头状态 | | `/api/listener/issues` | POST | 下发摄像头配置 | #### 下发摄像头配置 ```bash curl -X POST http://localhost:9333/api/listener/issues \ -H "Content-Type: application/json" \ -d '[ { "placeName": "cam01", "deviceName": "大门摄像头", "url": "rtsp://admin:pass@192.168.1.100:554/stream", "speaker": "IPTalkChan1", "cameraIndexCode": "cam01_code", "srcIndex": "src01", "srcParentIndex": "parent01", "srcName": "IPTalkChan1" } ]' ``` ### 告警查询 | 接口 | 方法 | 说明 | |------|------|------| | `/api/alarm/query` | POST | 分页查询告警记录 | | `/api/alarm/resend` | POST | 重发失败告警 | | `/api/download/{camera}/{file}` | GET | 下载音频文件 | #### 查询告警 ```bash curl -X POST http://localhost:9333/api/alarm/query \ -H "Content-Type: application/json" \ -d '{ "page": 1, "size": 20, "startTime": "2026-01-01 00:00:00", "endTime": "2026-12-31 23:59:59", "status": 1, "placeName": "cam01" }' ``` 查询参数(均为可选): | 参数 | 类型 | 说明 | |------|------|------| | page | int | 页码,默认 1 | | size | int | 每页数量,默认 10 | | startTime | string | 开始时间 | | endTime | string | 结束时间 | | deviceName | string | 设备名称 | | keyWord | string | 关键词 | | keyWordGroup | string | 关键词分组 | | placeName | string | 场所名称 | | status | int | 状态:0=待发送,1=成功,2=失败 | ### 统一响应格式 ```json { "code": 0, "msg": "ok", "data": {} } ``` `code` 为 0 表示成功,-1 表示失败。 ## 目录结构 ``` audio_tran/ ├── main.go # 程序入口 ├── config.go # 配置加载 ├── config.yaml # 配置文件 ├── recorder.go # RTSP 录音模块 ├── asr.go # ASR 客户端(Go 侧) ├── keyword.go # 敏感词匹配引擎 ├── callback.go # 海康威视回调 ├── api.go # HTTP API 接口 ├── database.go # 数据库模型与操作 ├── retention.go # 过期文件清理 ├── dsp.go # 音频处理(降噪/VAD) ├── go.mod / go.sum # Go 依赖 ├── asr_service/ │ ├── worker.py # ASR Worker(Python) │ ├── requirements.txt # Python 依赖 │ ├── build.sh # Linux 通用打包脚本 │ ├── build_3060.sh # Linux 3060 打包 │ ├── build_1080ti.sh # Linux 1080Ti 打包 │ └── build_3060_win.bat # Windows 打包 Linux 版 └── release_linux/ # 打包输出目录 ``` ## 日志 日志同时输出到控制台和 `audio_tran.log` 文件,级别为 INFO。 关键日志: ``` 系统启动 # 启动参数 ASR识别结果 camera=cam01 text=... # 识别结果 告警已触发 camera=cam01 keyword=... # 告警触发 海康回调请求报文 body=... # 上报 JSON(调试用) ``` ## 许可证 内部项目,仅供授权使用。