HOME | Links | About | Read

用树苺派播报天气

Table of Contents

前言

上周一个早晨,在骑车上班路上,突然下起了大雨,我被淋成了落汤鸡,要是每天有语音播报当天的天气该多好。拉开抽屉,角落里躺着一个树苺派,在搜索框输入树苺派 语音天气,还真的有。

科大迅飞sdk

先确保树苺派正常连接音响播放声音,下载科大讯飞sdk, 我使用它免费的在线合成语音,稍微改了下sample程序,使它可以从某个文本读取内容并合成声音文件。

实现脚本

生成当前时间的文字

现在要解决的如何生成文本,下面的shell脚本生成了当前时间的文字。

shell脚本内容

#!/bin/bash
num2cn=(零 一 二 三 四 五 六 七 八 九 十)
hour=`date +%H`
if [ $(( $hour/10 )) -ge 2 ];then
    echo -e ${num2cn[${hour}/10]}"${num2cn[10]}\c"
elif [ $(( $hour/10 )) -eq 1 ];then
    echo -e ${num2cn[10]}"\c"
fi
if [ $(( $hour%10 )) -ne 0 ];then
echo -e ${num2cn[${hour}%10]}"\c"
fi
echo -e "点 \c"

min=`date +%M`
if [ $(( $min/10 )) -ge 2 ];then
    echo -e ${num2cn[${min}/10]}"${num2cn[10]}\c"
elif [ $(( $min/10 )) -eq 1 ];then
    echo -e ${num2cn[10]}"\c"
fi
if [ $(( $min%10 )) -ne 0 ];then
echo -e ${num2cn[${min}%10]}"\c"
fi
echo -e "分,\c"

得到当天天气

获取天气json

免费的天气预报api ,用curl命令可以得到想要的天气信息,因为接口的调用有一些限制,所以我设置了时间间隔。下面代码以杭州为例子,得到的信息为json格式,存入本地文本weather.txt。

ret=`curl -o weather.txt -s -w %{http_code} http://www.sojson.com/open/api/weather/json.shtml?city=%E6%9D%AD%E5%B7%9E`
if [ $ret -ne 200 ];then
sleep 6
ret=`curl -o weather.txt -s -w %{http_code} http://www.sojson.com/open/api/weather/json.shtml?city=%E6%9D%AD%E5%B7%9E`
fi

用jq取得需要的内容

得到了json信息,我们需要取出我们想要的信息,这里用到了jq命令 ,可以很方便的解析json格式的文本。下面的代码,取出当日的的天气提示信息并储存到变量notice中。

notice=`cat wether.txt | jq '.data.forecast[0]' | jq '.notice' | tr -d '"'`
echo -e "$notice \c"

定时运行

脚本首先生成需要的天气预报文本信息,调用科大迅飞的接口生成语音文件,然后用linux系统的播放命令播放语音文件。通过以上内容,就可以完成这样一个脚本,最后在linux系统crontab设置定时运行,就大工告成了。

10 7 * * 1-5 /home/pi/demo/start.sh

结束

一开始觉得不太可能完成,慢慢搜索几次后,发现并不难,调用几个接口处理下就完成了,虽然觉得有些简单,但觉得还是记录下过程。