本文最后更新于:2020年3月21日 晚上
原帖地址
一、 前期准备
- 树莓派一个
- 小音箱一对
获取所在位置天气
这里选择墨迹天气获取实时天气信息,地址:
http://tianqi.moji.com/
进入墨迹天气的页面,墨迹天气会根据你的ip加载相应地区的天气。
这次我们主要抓取温度、天气、湿度、风力、空气质量和天气提示这几个数据。
这种小爬虫我们就使用requests和BeautifulSoup这两个超级好用的库可以快速实现。
二、 环境
首先树莓派安装python3,python3-pip和requests、beautifulsoup4两个库及mplayer软件。
| sudo apt install python3 -y sudo apt install python3-pip -y pip3 install requests pip3 install beautifulsoup4 sudo apt-get install mplayer -y
|
至于Requests和Beautiful Soup的用法这里就先不多说了,大家可以去看他们的中文文档。
- Requests中文wendnag
- Beautiful Soup中文文档
使用mplayer实现语音播放,通过以下命令安装mplayer:
用法很简单输入以下命令即可播放本地音乐:
mplayer \xxx\xxx\xxx.mp3(绝对地址)
如果是在线音乐也可以用mplayer直接通过URL播放:
mplayer "URl"(URL外面一定要用双引号圈起来)
三、 文字转语音
刚开始想通过python的库实现本地文字转语音,在windows系统下没有问题,但树莓派3上中文无法转换。后来就找到了百度的文字转换语音API,地址:http://yuyin.baidu.com/#try
还可以选各种声音,调节语速。虽然它没有给出直接的api接口,但是我们利用Chrome浏览器的开发者模式可以找到api。
打开开发者模式,点击播放的按钮,在network里就可以找到刚刚发出的请求。
http://tts.baidu.com/text2audio?idx=1&tex=1&cuid=baidu_speech_demo&cod=2&lan=zh&ctp=1&pdt=1&spd=5&per=4&vol=5&pit=5
就我们要找的百度文字转语音API,其中per是参数是语音的类型,spd是语速,vol是音量,而tex则是需要转换的文字。通过以下代码就可以实现将特定的文字转换为语音。
| import os url = u'http://tts.baidu.com/text2audio?idx=1&tex={0}&cuid=baidu_speech_' \ u'demo&cod=2&lan=zh&ctp=1&pdt=1&spd=4&per=4&vol=5&pit=5'.format(text) os.system('mplayer "%s"' % url)
|
四、 代码
numtozh()函数专门转换数字为中文。最后所有的代码整合起来就是这样啦。
| touch weather_voice.py
nano weather_voice.py
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
import os import re import time import requests from datetime import datetime, timedelta from bs4 import BeautifulSoup
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit' '/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safar' 'i/537.36', }
def numtozh(num): num_dict = {1: '一', 2: '二', 3: '三', 4: '四', 5: '五', 6: '六', 7: '七', 8: '八', 9: '九', 0: '零'} num = int(num) if 100 <= num < 1000: b_num = num // 100 s_num = (num - b_num * 100) // 10 g_num = (num - b_num * 100) % 10 if g_num == 0 and s_num == 0: num = '%s百' % (num_dict[b_num]) elif s_num == 0: num = '%s百%s%s' % (num_dict[b_num], num_dict.get(s_num, ''), num_dict.get(g_num, '')) elif g_num == 0: num = '%s百%s十' % (num_dict[b_num], num_dict.get(s_num, '')) else: num = '%s百%s十%s' % (num_dict[b_num], num_dict.get(s_num, ''), num_dict.get(g_num, '')) elif 10 <= num < 100: s_num = num // 10 g_num = (num - s_num * 10) % 10 if g_num == 0: g_num = '' num = '%s十%s' % (num_dict[s_num], num_dict.get(g_num, '')) elif 0 <= num < 10: g_num = num num = '%s' % (num_dict[g_num]) elif -10 < num < 0: g_num = -num num = '零下%s' % (num_dict[g_num]) elif -100 < num <= -10: num = -num s_num = num // 10 g_num = (num - s_num * 10) % 10 if g_num == 0: g_num = '' num = '零下%s十%s' % (num_dict[s_num], num_dict.get(g_num, '')) return num
def get_weather(): res = requests.get('http://tianqi.moji.com/', headers=headers) soup = BeautifulSoup(res.text, "html.parser") temp = soup.find('div', attrs={'class': 'wea_weather clearfix'}).em.getText() temp = numtozh(int(temp)) weather = soup.find('div', attrs={'class': 'wea_weather clearfix'}).b.getText() sd = soup.find('div', attrs={'class': 'wea_about clearfix'}).span.getText() sd_num = re.search(r'\d+', sd).group() sd_num_zh = numtozh(int(sd_num)) sd = sd.replace(sd_num, sd_num_zh) wind = soup.find('div', attrs={'class': 'wea_about clearfix'}).em.getText() aqi = soup.find('div', attrs={'class': 'wea_alert clearfix'}).em.getText() aqi_num = re.search(r'\d+', aqi).group() aqi_num_zh = numtozh(int(aqi_num)) aqi = aqi.replace(aqi_num, aqi_num_zh).replace(' ', ',空气质量') info = soup.find('div', attrs={'class': 'wea_tips clearfix'}).em.getText() sd = sd.replace(' ', '百分之').replace('%', '') aqi = 'aqi' + aqi info = info.replace(',', ',') today = datetime.now().date().strftime('%Y年%m月%d日') text = '早上好!今天是%s,天气%s,温度%s摄氏度,%s,%s,%s,%s' % \ (today, weather, temp, sd, wind, aqi, info) return text
def text2voice(text): url = 'http://tts.baidu.com/text2audio?idx=1&tex={0}&cuid=baidu_speech_' \ 'demo&cod=2&lan=zh&ctp=1&pdt=1&spd=4&per=4&vol=5&pit=5'.format(text) os.system('mplayer "%s"' % url)
def main(): text = get_weather() print(text) mp3path2 = os.path.join(os.path.dirname(__file__), '2.mp3') os.system('mplayer %s' % "http://m7.music.126.net/20200321204545/92ef85b98df3233ebcf66b41529b1e0c/ymusic/714d/2975/d488/bcfd91fa30f23266c7151fbf43052634.mp3") text2voice(text)
if __name__ == '__main__': main()
|
五、 定时任务
输入如下命令添加定时任务。
crontab -e
每天8点语音天气。假设你的weather_voice.py
绝对路径为/home/pi/Documents/weather_voice.py
,则文末添加一句:
0 8 * * * /usr/bin/python3 /home/pi/Documents/weather_voice.py