147 lines
3.3 KiB
Markdown
147 lines
3.3 KiB
Markdown
# 企业微信 → Win11 本地 TTS 播报服务
|
||
|
||
通过企业微信长连接(WebSocket)接收智能机器人消息,调用 Windows 11 本地 .NET System.Speech 语音引擎朗读出来。
|
||
|
||
**你发什么,它就说什么。**
|
||
|
||
---
|
||
|
||
## 工作原理
|
||
|
||
```
|
||
你在企业微信给机器人发消息
|
||
→ 企微服务器通过 WebSocket 推送消息给本服务
|
||
→ 调用 Windows 11 .NET System.Speech 语音引擎朗读
|
||
→ 扬声器发声
|
||
→ 回复"已播报"到企微
|
||
```
|
||
|
||
全程**无需公网 IP、域名、回调 URL**,通过长连接主动连接企微,内网直接用。
|
||
|
||
---
|
||
|
||
## 项目结构
|
||
|
||
```
|
||
wework_xiaoai_bot/
|
||
├── app/services/
|
||
│ ├── ws_client.py # WebSocket 客户端(核心)
|
||
│ └── tts.py # Windows 11 本地 TTS 服务
|
||
├── config.py # 配置加载(从 .env 读取)
|
||
├── run.py # 程序入口
|
||
├── requirements.txt # Python 依赖
|
||
├── tests/ # 测试
|
||
├── .env.example # 环境变量模板
|
||
└── README.md
|
||
```
|
||
|
||
---
|
||
|
||
## 前置条件
|
||
|
||
### 1. 企业微信智能机器人
|
||
|
||
在企业微信管理后台创建智能机器人,开启「API 模式」→「长连接」:
|
||
|
||
1. 登录 [企业微信管理后台](https://work.weixin.qq.com)
|
||
2. 进入「应用管理」→「智能机器人」
|
||
3. 创建机器人,开启 API 模式,选择「长连接」
|
||
4. 获取 **Bot ID** 和 **Secret**
|
||
|
||
### 2. Windows 11 系统
|
||
|
||
使用 Windows 11 自带的 .NET System.Speech 语音引擎,无需额外安装语音包。
|
||
|
||
> 如需更好的中文语音,可在 Win11 设置 → 时间和语言 → 语音 → 添加语音包中安装「Microsoft Xiaoxiao」等自然语音。
|
||
|
||
---
|
||
|
||
## 快速开始
|
||
|
||
### 1. 配置
|
||
|
||
```bash
|
||
copy .env.example .env
|
||
```
|
||
|
||
编辑 `.env`,填入你的企微 Bot ID 和 Secret:
|
||
|
||
```env
|
||
WECOM_BOT_ID=你的BotID
|
||
WECOM_BOT_SECRET=你的Secret
|
||
```
|
||
|
||
### 2. 安装依赖
|
||
|
||
```bash
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
### 3. 启动
|
||
|
||
```bash
|
||
python run.py
|
||
```
|
||
|
||
---
|
||
|
||
## 配置说明
|
||
|
||
| 环境变量 | 说明 | 必填 |
|
||
|---------|------|------|
|
||
| `WECOM_BOT_ID` | 企微智能机器人 Bot ID | 是 |
|
||
| `WECOM_BOT_SECRET` | 企微智能机器人 Secret | 是 |
|
||
| `TTS_VOICE_NAME` | 指定语音名称,留空自动选中文语音 | 否 |
|
||
| `TTS_RATE` | 语速 -10(最慢)到 10(最快),默认 0 | 否 |
|
||
| `TTS_ENABLED` | 是否启用 TTS,默认 true | 否 |
|
||
| `TTS_MAX_TEXT_LENGTH` | 最大播报长度,默认 500 | 否 |
|
||
|
||
---
|
||
|
||
## 日志示例
|
||
|
||
正常运行:
|
||
|
||
```
|
||
[INFO] Connecting to wss://openws.work.weixin.qq.com ...
|
||
[INFO] WebSocket connected
|
||
[INFO] Subscribed successfully
|
||
[INFO] Received: 你好世界
|
||
[INFO] TTS success
|
||
```
|
||
|
||
故障时自动重连:
|
||
|
||
```
|
||
[ERROR] Connection lost, reconnecting in 5s...
|
||
[INFO] WebSocket connected
|
||
[INFO] Subscribed successfully
|
||
```
|
||
|
||
---
|
||
|
||
## 技术要点
|
||
|
||
- **长连接**:WebSocket `wss://openws.work.weixin.qq.com`,无需公网 IP
|
||
- **消息加解密**:长连接模式免加解密,ws 协议层自带加密
|
||
- **心跳保活**:WebSocket 层 + 应用层双重心跳,每 30 秒
|
||
- **断线重连**:自动检测断线,5 秒后重连
|
||
- **本地 TTS**:调用 .NET System.Speech 直接驱动声卡,不生成临时文件
|
||
|
||
---
|
||
|
||
## 依赖
|
||
|
||
```
|
||
aiohttp>=3.9.0
|
||
python-dotenv>=1.0.0
|
||
websockets>=13.0
|
||
pytest>=8.0.0
|
||
pytest-asyncio>=0.23.0
|
||
```
|
||
|
||
---
|
||
|
||
## License
|
||
|
||
MIT |