树莓派之天气预报语音播报

目录

  • 树莓派之天气预报语音播报
    • 方案选定
    • 项目基调
      • 需求分析
      • 解决方案
    • 具体实施
      • step1天气信息
      • 安装ilang软件
      • json解析和文字组合
      • 定时任务

树莓派之天气预报语音播报

前几天跟同事在聊家里的“小爱同学”可以语音报天气,听起来不错,也想要一个。不过嘛,作为技术宅的本人,如果买一个的话,是不是太Low了,于是想到家里万能的树莓派,实现这个功能应该是问题不大的。开始了折腾。

方案选定

项目基调

原则1:不对树莓派硬件进行大的改动;
原则2:我们一定要用开源或者免费的方案;

需求分析

  1. 要获取天气预报信息
  2. 要组合成相应文字
  3. 文字转语音
  4. 语音播报
  5. 定时执行

解决方案

  • 天气预报:
    天气预报服务供应商有很多,我选的叫和风天气,和小风天气是专为个人开发者、学生、公益组织以及所有非商业环境使用而推出的免费天气数据服务,涵盖了几乎所有基础天气数据。对于我而言,够用就好。
  • 组合成相应文字:
    这部分我们可以用自己的代码来实现
  • 文字转语音:
    文字转语音是我们项目的核心,有两种方向,一是使用在线转,本地播放;优点是声音优美,缺点是依赖服务商,还有多数会要收费,另一个是本地转本地播放;优点是不依赖别人,缺点是声音差点;我做的不是商用,所以音质差点就差点吧,能听懂就行。所以选择ilang方案,本地转换python2.7环境的一个文字转语音项目。
  • 语音播报:
    ilang方案里可以直接播放。
  • 定时执行:
    linux系统里支持定时任务,所以crontab -e 命令可以满足我们的要求

具体实施

step1天气信息

在和风天气网站注册个帐号,拿到key,用post请求就可以得到返回的json格式数据了:
https://free-api.heweather.net/s6/weather/forecast?location=成都&key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
返回数据:
树莓派之天气预报语音播报_第1张图片

安装ilang软件

这里有个前提,因为ilang是基于python2.7的,所以系统中必须要有python2.7;
正常情况下输入以下命令:

sudo apt-get install mpg123
sudo pip install ilangbd

完成后测试

ilang “你好,world!”

注意不要在hdmi接口上听,否则听不到最前面的两个字,所以用音箱直接连树莓派的音频输出吧;
如果还有疑问请参考这篇博客:树莓派使用ilangbd库进行python进行中文文本转语音

json解析和文字组合

好了,现在把它们串起来,下面是python3.4的代码:(我的系统装了python3.4和python2.7两个版本的python)

import json
import os
import requests

postdata = {'location': '成都', 'key': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'}
stra = requests.post('https://free-api.heweather.net/s6/weather/forecast', data=postdata)
json_obj = json.loads(stra.text)
w0 = json_obj['HeWeather6'][0]
wether = w0['daily_forecast'][1]

outstr = '明天天气{0}转{1},温度{2}到{3}摄氏度.'.format(wether['cond_txt_d'], wether['cond_txt_n'], wether['tmp_max'], wether['tmp_min'])
cmdline = 'ilang "' + outstr + '"'
os.system(cmdline)

保存为AnalysisWeather.py,OK,如果不出什么意外,到目前为止,在命令行中输入:

python3 AnalysisWeather.py

应该可以听到它播报出正常的天气语音了;那么我们的工作是不是快结束了呢?还没有,后面还有一个大坑,对那就是crontab。

定时任务

crontab是linux的定时任务,看起来是很OK的对不对。它的坑就是它没有环境变量的支持,所以你的python2,python3的位置,以及其它自己要定义的环境变量都要自行设置,否则就会出一经典的一幕:在命令行里执行的好好的程序,在crontab里死活不执行。不说了,具体的是这样,把上面的命令放到一个shell命令文件里:
alarm.sh:

#!/bin/bash
source /etc/profile
source /home/pi/.bashrc
cd /home/pi/al_clock
python3 AnalysisWeather.py

好了,在命令行再试一下:

/home/pi/al_clock/alarm.sh

有声音就OK了,最后放到crontab里面:

crontab -e
#auto rebort weather with void for
30 7 * * * /home/pi/al_clock/alarmd.sh

每天早上7点半播报天气
大功告成!
我们的口号是:我们要玩树莓派,不要被树莓派玩儿!

你可能感兴趣的:(树莓派)