优先选用和风天气API并搭配espeak或系统say命令实现稳定语音播报,避免限流、编码、后台无声等问题。

用 requests 调天气 API 前先确认是否真免费
很多新手直接搜“天气API”就选了和风、心知或 OpenWeather,但实际调用时才发现:和风 free 版本每天限 1000 次,且城市 ID 必须用它家的 search 接口查,不能直接填“北京”;OpenWeather 要邮箱注册才能拿 appid,且默认只返回 Kelvin 温度,不手动转成摄氏会播成“293.15 度”。
实操建议:
- 优先用中国气象局官方数据源
http://www.nmc.cn/publish/forecast/ASH/(如上海),但它是静态 HTML,得靠BeautifulSoup解析,稳定性差,页面一改就挂 - 更稳的选择是和风:
https://dev.qweather.com/docs/api/weather/weather-now/,传location(城市 ID)和key,返回 JSON 干净,字段名直白,比如now.textDay就是白天天气描述 - 别用百度地图 API——它已下线天气服务,文档还挂着,但请求必返回
{"status":302,"message":"Invalid request"}
语音播报别硬套 pyttsx3,注意中文发音断句
pyttsx3 在 Windows 上用 SAPI5,Win10 默认女声对中文支持尚可,但遇到“18℃,多云转晴,偏北风3-4级”这种长句,容易把“转晴”读成“zhuǎn qíng”而非“zhuàn qíng”,听感奇怪。
实操建议:
- 用
pyttsx3时加停顿:engine.say("今天气温<break time="300ms"></break>十八度"),否则数字和单位粘连(“十八度”变成“十八度”快读像“十八肚”) - Mac 用户避开
nsss驱动,改用espeak:pip install py-espeak,再设engine.setProperty('voice', 'zh'),发音更准 - 别用在线 TTS(如百度语音合成)做每日定时任务——没配好 token 过期逻辑的话,跑三天就静音,错误日志里只有一行
401 Unauthorized,很难排查
自动执行必须绕开“后台无声音设备”的坑
Windows 计划任务、macOS launchd 或 Linux cron 启动 Python 脚本时,默认没有音频会话上下文。哪怕脚本里写了 engine.say("早上好"),也完全没声,且不报错。
实操建议:
- Windows:计划任务中勾选“不管用户是否登录都要运行”,并启用“允许此任务在前台运行”——否则
pyttsx3找不到 SAPI 设备 - macOS:用
say命令替代pyttsx3,它原生支持后台语音:os.system('say -v Ting-Ting "今天天气不错"'),Ting-Ting是系统自带粤语女声,普通话用Mei-Jia - Linux:确保 cron 环境变量含
PULSE_SERVER,最简方案是改用espeak -v zh "温度十五度",不依赖 PulseAudio
定时抓取别只写个 time.sleep(86400)
用死循环 + sleep 模拟“每天一次”,进程一旦被 kill 或机器重启,任务就永久中断,且无法知道上次执行是否成功。
实操建议:
- Windows 用任务计划程序,触发器设为“每天 7:00”,操作为启动
pythonw.exe(避免弹黑窗),起始目录填脚本所在路径 - macOS 写个
plist文件扔进~/Library/LaunchAgents/,用StartCalendarInterval字段指定时间,比 cron 更可靠 - 所有方案都加一行日志:
with open("weather.log", "a") as f: f.write(f"{datetime.now()} OK\n"),下次播不出声时,先看这行有没有写入
真正麻烦的是天气接口限流叠加语音驱动兼容性——这两块任一出问题,都不会抛异常,只会沉默。建议第一次跑通后,手动删掉 log 文件,等第二天看它有没有自动生成。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











