155 lines
5.4 KiB
Markdown
155 lines
5.4 KiB
Markdown
# PA_horn_speaker
|
||
|
||
Web广播系统 - 吆喝用的喇叭(i人专用)
|
||
|
||
通过Web界面输入文字,利用 edge-tts 将文本转化为语音并播放,支持循环播放和语音文件管理。
|
||
|
||
## 功能特点
|
||
|
||
- **文本转语音**:输入文字即可生成语音
|
||
- **多种声音选择**:支持多种音色,包括普通话、方言、香港、台湾口音
|
||
- **循环播放**:支持设置间隔时间的循环播放模式
|
||
- **语音文件管理**:播放历史、收藏、重命名、删除
|
||
- **主题切换**:支持深色/浅色主题
|
||
- **状态条与日志**:一条状态随时说明喇叭在做什么(待机 / 正在合成 / 正在播报 / 上次没成功),需要时展开看完整日志
|
||
|
||
## 支持的声音
|
||
|
||
| 声音名称 | 类型 |
|
||
|---------|------|
|
||
| 晓晓(温暖女声) | 普通话 |
|
||
| 晓伊(活泼女声) | 普通话 |
|
||
| 云健(激情男声) | 普通话 |
|
||
| 云希(阳光男声) | 普通话 |
|
||
| 云夏(可爱男声) | 普通话 |
|
||
| 云扬(新闻男声) | 普通话 |
|
||
| 辽宁-小贝 | 方言 |
|
||
| 陕西-小妮 | 方言 |
|
||
| 香港-晓佳 | 粤语 |
|
||
| 香港-晓曼 | 粤语 |
|
||
| 香港-云龙 | 粤语 |
|
||
| 台湾-晓陈 | 台语 |
|
||
| 台湾-晓雨 | 台语 |
|
||
| 台湾-云哲 | 台语 |
|
||
|
||
## 安装依赖
|
||
|
||
```bash
|
||
# 安装 Python 依赖
|
||
pip install flask edge-tts
|
||
|
||
# 安装音频播放工具
|
||
sudo apt-get install mpg123
|
||
|
||
# 修复 edge-tts 的 403(微软 2026-10 更换了端点,不修则合成不出语音)
|
||
python3 patch_edge_tts_403.py
|
||
```
|
||
|
||
## 界面
|
||
|
||
控制界面按「极简一页」来组织:一屏只做一件事——写内容、点广播,音频文件与日志收在下方可展开的行里;
|
||
宽屏(≥1000px)时这两块自动变成右侧常显的一栏。
|
||
|
||
配色遵循一条规则:**颜色只表示喇叭是否在响**。待机时整个界面是无彩的(只有灰绿中性色),
|
||
只有正在播报时才会出现唯一的朱红——页面顶端一条横线、状态点、以及变成「停止广播」的主按钮。
|
||
深浅两套主题,右上角切换,首次打开跟随系统。
|
||
|
||
## 使用方法
|
||
|
||
### 启动服务
|
||
|
||
```bash
|
||
python app.py
|
||
```
|
||
|
||
服务将在 `http://localhost:5000` 启动。
|
||
|
||
### 访问方式
|
||
|
||
打开浏览器访问 `http://你的IP:5000`
|
||
|
||
### 使用步骤
|
||
|
||
1. 在文本框中输入广播内容(最多500字)
|
||
2. 选择喜欢的声音
|
||
3. 可选:勾选"循环播放"并设置间隔时间
|
||
4. 点击"开始广播"按钮
|
||
5. 播放完成的语音会自动保存到历史列表
|
||
|
||
## 技术栈
|
||
|
||
- **后端**:Flask
|
||
- **语音合成**:edge-tts
|
||
- **音频播放**:mpg123
|
||
- **前端**:HTML + CSS + JavaScript
|
||
|
||
## 项目结构
|
||
|
||
```
|
||
PA_horn_speaker/
|
||
├── app.py # Flask 应用主文件
|
||
├── player.sh # 循环播放脚本
|
||
├── patch_edge_tts_403.py # 修复 edge-tts 合成 403 的补丁脚本
|
||
├── templates/
|
||
│ └── index.html # 前端页面模板
|
||
├── static/
|
||
│ └── style.css # 样式文件
|
||
├── cache/ # 语音文件缓存目录
|
||
│ └── metadata.json # 文件元数据
|
||
├── LICENSE # 许可证
|
||
└── README.md # 项目说明
|
||
```
|
||
|
||
## API 接口
|
||
|
||
| 接口 | 方法 | 说明 |
|
||
|-----|------|------|
|
||
| `/` | GET | 首页 |
|
||
| `/speak` | POST | 生成并播放语音 |
|
||
| `/stop` | GET | 停止播放 |
|
||
| `/files` | GET | 获取语音文件列表 |
|
||
| `/play-file` | POST | 播放已保存的语音文件 |
|
||
| `/rename-file` | POST | 重命名文件 |
|
||
| `/toggle-favorite` | POST | 收藏/取消收藏 |
|
||
| `/delete-file` | POST | 删除文件 |
|
||
| `/status` | GET | 查询喇叭是否正在播报、播的哪一条、循环间隔 |
|
||
|
||
## 已知问题:合成语音报 403(2026-10)
|
||
|
||
**现象**:输入文字后点「开始广播」没有声音,日志中 `edge_tts` 报
|
||
`WSServerHandshakeError: 403, message='Invalid response status'`。
|
||
|
||
**原因**:微软在 2026 年 10 月把 Edge Read Aloud 的合成端点从
|
||
`speech.platform.bing.com` 迁到了 `api.msedgeservices.com`。旧端点在
|
||
2026-10-10 起于多数地区开始返回 403,2026-10-12 起全球(含美国)全线 403。
|
||
edge-tts 7.2.8 尚未跟进,因此这不是本机、网络或时钟的问题——可以这样确认:
|
||
`--list-voices` 仍然正常返回、系统时钟已 NTP 同步、换一台机器同样 403。
|
||
|
||
**修复**:
|
||
|
||
```bash
|
||
python3 patch_edge_tts_403.py # 打补丁
|
||
python3 patch_edge_tts_403.py --verify # 实际合成一段音频确认
|
||
```
|
||
|
||
补丁会把 `edge_tts/constants.py` 里的 `WSS_URL` 指向新端点,运行前会自动备份原文件。
|
||
注意:**重新安装或升级 edge-tts 会覆盖 `constants.py`,补丁随之丢失,重跑一次脚本即可。**
|
||
其它参数:`--check` 只看当前状态,`--revert` 还原成官方原始端点。
|
||
|
||
上游进展见 [rany2/edge-tts#490](https://github.com/rany2/edge-tts/issues/490),
|
||
对应修复 PR 为 [#491](https://github.com/rany2/edge-tts/pull/491)。
|
||
|
||
## 注意事项
|
||
|
||
1. 需要联网使用(edge-tts 需要访问 Microsoft 服务)
|
||
2. 音频输出使用 ALSA 设备 `plughw:audiocodec,0`,可根据实际设备调整
|
||
3. 缓存目录最多保存10个文件,收藏的文件不会被自动清理
|
||
4. 合成失败会自动重试 3 次(新端点对同一 IP 有限流),仍失败则返回错误提示,不会再把空音频文件当成正常广播;缓存里已损坏(0 字节)的文件也不会被播放
|
||
|
||
## APK 文件
|
||
|
||
项目包含 Android 端 APK 文件:`小喇叭_1.0.0.apk`
|
||
|
||
---
|
||
|
||
Made with ❤️ for 社恐人士 |