一个语音播报天气的Shell脚本

树莓派 杨博, 卫 681次浏览 0个评论

语音脚本写上瘾了,再来一波吧,前一个帖子主要介绍百度TTS的API如何用GET请求来使用,这次我想来向大家介绍Linux下字符串处理处理程序。
灵感在这里http://blog.saymagic.cn/2014/09/22/用一行shell脚本实现天气查询.html

其实我觉得吧,用w3m还不如用Lynx,Lynx还不如用Elinks :arrow: ,我选择排版更简单的Lynx。
原作者提供的思路很巧妙,但是那个天气信息的网页现在已经上不去了。我找了一个新的天气源

lynx -dump http://baidu.weather.com.cn/mweather15d/101220601.shtml

返回结果

###########################此处省略若干行废话#########################
2]分享 [3]安庆|[4]更换城市

08月19日(周五)

[5]机场天气[6]今日详情

     * [7]安庆28日最高温将比今天降8度

     * [8][1_1.png] 逐小时预报
     * [9][2_2.png] 穿衣指数
     * [10][3_3.png] 空气质量

     * 今天 多云 阴 28℃/37℃
     * 明天 雷阵雨 雷阵雨 27℃/36℃
     * 后天 阴 多云 27℃/33℃
     * 周一 小雨 多云 28℃/34℃
     * 周二 多云 多云 27℃/35℃
     * 周三 多云 多云 28℃/36℃
     * 周四 多云 多云 26℃/37℃

   [11]查看15天详情>

今日焦点

   [12][190812193F568681CA6C960A0A9C3723A5731D8A.jpg]
          [13]华南风雨今起减弱 广西云南有大暴雨

     * [14]入汛40场雨 密云水库蓄水创15年新高
###########################此处省略若很多行废话########################

可以看到现在网站的废话是相当多啊 :twisted:
不过Linux有十分强大的字符串处理,大家往后撤退,下面我要开始发功啦!

假设我们需要未来两天的天气,我们可以利用管道和grep正则检索。

[wei@localhost ~]$ lynx -dump http://baidu.weather.com.cn/mweather15d/101220601.shtml| grep -C 1 '* 明天'* 
     今天 多云 阴 28℃/37℃ 
     * 明天 雷阵雨 雷阵雨 27℃/36℃ 
     * 后天 阴 多云 27℃/33℃
[wei@localhost ~]$

是不是显示出来了!不过我们要完成语音播报的话,提交给百度的内容不能有换行。
我们再次利用管道,不过这次换个方法

[wei@localhost ~]$ lynx -dump http://baidu.weather.com.cn/mweather15d/101220601.shtml | grep -C 1 '* 明天'| paste -s
     * 今天 多云 阴 28℃/37℃	     * 明天 雷阵雨 雷阵雨 27℃/36℃	     * 后天 阴 多云 27℃/33℃
[wei@localhost ~]$ 

现在我把三行变为一行了,但是那个*号是不是影响发音?,再把*号去掉。

[wei@localhost ~]$ lynx -dump http://baidu.weather.com.cn/mweather15d/101220601.shtml | grep -C 1 '* 明天'| paste -s | tr -d "*"
      今天 多云 阴 28℃/37℃	明天 雷阵雨 雷阵雨 27℃/36℃	      后天 阴 多云 27℃/33℃
[wei@localhost ~]$ 

貌似中间空得比较大?仔细一看是制表符和一大串空格哇
为了装13,我来换sed程序去掉“\t”,用tr去除多余空格

[wei@localhost ~]$ lynx -dump http://baidu.weather.com.cn/mweather15d/101220601.shtml | grep -C 1 '* 明天'| paste -s | tr -d "*"| sed 's/\t//g'|tr -s [:space:]
 今天 多云 阴 28℃/37℃ 明天 雷阵雨 雷阵雨 27℃/36℃ 后天 阴 多云 27℃/33℃
[wei@localhost ~]$ 

最后发现如果请求中出现空格,则无法返回正确的语音,好吧,那我去掉这一行最开头的空格,将其余的空格换成逗号。

[wei@localhost ~]$ lynx -dump http://baidu.weather.com.cn/mweather15d/101220601.shtml | grep -C 1 '* 明天'| paste -s | tr -d "*"| sed 's/\t//g'|tr -s [:space:]| sed 's/^.//' | tr [:space:] ","
今天,多云,阴,28℃/37℃,明天,雷阵雨,雷阵雨,27℃/36℃,后天,阴,多云,27℃/33℃
[wei@localhost ~]$ 

这下没问题了吧,用百度TTS后发现高低温之间的“/”发不出来,最后修改一下。

[wei@localhost ~]$ lynx -dump http://baidu.weather.com.cn/mweather15d/101220601.shtml | grep -C 1 '* 明天'| paste -s | tr -d "*"| sed 's/\t//g'|tr -s [:space:]| sed 's/^.//' | tr [:space:] ","|tr "/" "~"
今天,多云,阴,28℃~37℃,明天,雷阵雨,雷阵雨,27℃~36℃,后天,阴,多云,27℃~33℃
[wei@localhost ~]$ 

好了,这回可以享受我们的语音天气预报了。
附上我的shell脚本。PS:自行替换里面的网页为你自己所在的城市哦!

#!/bin/sh
line=`lynx -dump http://baidu.weather.com.cn/mweather/101220601.shtml | grep -C 1 '* 明天' |paste -s| sed 's/\t/ /g'|tr -d "*"|tr -s [:space:]|sed 's/^.//'|tr "/" "~"|tr [:space:] ","`
mplayer "http://tts.baidu.com/text2audio?lan=zh&pid=101&ie=UTF-8&text=$line&spd=3"

其实字符串处理这个东西是非常深奥的,我在这里还没有用到awk,awk是功能是非常强大的,要是awk用的好的话,我上面啰嗦那么多,那都是班门弄斧了,可惜我不会用 :!:


本文版权:霜之哀伤 转载请注明一个语音播报天气的Shell脚本
喜欢 (3)or分享 (0)
杨博, 卫
关于作者:
喜欢折腾路由器,懂一点Linux,最近正在学习树莓派...
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址