利用爬蟲和樹莓派3打造自己的語音天氣鬧鐘
博客地址:woodenrobot.me
翻出吃灰很久的樹莓派,又把這個語音天氣鬧鐘的程序優化了一下。
---------------------------分割線2017.07.15---------------------------
終於擠出時間修復了一個大bug,竟然沒有一個人說程序運行不正常。看來大家都是只收藏不行動啊。現在最新版直接把代碼拷走,安裝好依賴庫,本地運行就可以實現每天定時播報語音天氣了!( 逃
---------------------------分割線2017.02.22---------------------------
前言
前不久又一次一個人在他鄉過了生日,悄悄買了一台樹莓派3送給自己做生日禮物。終於算是實現了大學以來一直的一個小願望。買回來之後當然不能讓他落灰,於是就利用自己的爬蟲技術+樹莓派+小音箱實現了一個定時鬧鐘外加語音天氣播報功能。
準備
- 樹莓派3
- 小音箱
環境
python 3.4
獲取所在位置天氣
這裡選擇墨跡天氣獲取實時天氣信息,地址: 墨跡天氣
進入墨跡天氣的頁面,墨跡天氣會根據你的ip載入相應地區的天氣。 這次我們主要抓取溫度、天氣、濕度、風力、空氣質量和天氣提示這幾個數據。n這種小爬蟲我們就不用Scrap那種重型武器啦,使用requests和BeautifulSoup這兩個超級好用的庫可以快速實現(Ps:這兩個庫是Python的第三方庫,需要自己安裝。pip install requests、pip install BeautifulSoup4分別使用這兩條命令安裝。)。
import renimport requestsnfrom datetime import datetimenfrom bs4 import BeautifulSoupnnnheaders = {n User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKitn /537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safarn i/537.36,n }nnres2 = requests.get(http://tianqi.moji.com/, headers=headers)nnsoup = BeautifulSoup(res2.text, "html.parser")ntemp = soup.find(div, attrs={class: wea_weather clearfix}).em.getText()nweather = soup.find(div, attrs={class: wea_weather clearfix}).b.getText()nsd = soup.find(div, attrs={class: wea_about clearfix}).span.getText()nsd_num = re.search(rd+, sd).group()nsd = sd.replace(sd_num, sd_num_zh)nwind = soup.find(div, attrs={class: wea_about clearfix}).em.getText()naqi = soup.find(div, attrs={class: wea_alert clearfix}).em.getText()naqi_num = re.search(rd+, aqi).group()naqi = aqi.replace(aqi_num, aqi_num_zh)ninfo = soup.find(div, attrs={class: wea_tips clearfix}).em.getText()nsd = sd.replace( , 百分之).replace(%, )naqi = aqi + aqinntoday = datetime.now().date().strftime(%Y年%m月%d日)ntext = 早上好!今天是%s,天氣%s,溫度%s攝氏度,%s,%s,%s,%s % n (today, weather, temp, sd, wind, aqi, info)n
至於Requests和Beautiful Soup的用法這裡就先不多說了,大家可以去看他們的中文文檔。
- Requests中文文檔
- Beautiful Soup中文文檔
命令行播放語音
使用mplayer實現語音播放,通過以下命令安裝mplayer:
sudo apt-get install mplayern
用法很簡單輸入以下命令即可播放本地音樂:
mplayer xxxxxxxxx.mp3(絕對地址)n
如果是在線音樂也可以用mplayer直接通過URL播放:
mplayer "URL"(URL外面一定要用雙引號圈起來)n
文字轉語音
剛開始想通過 python 的庫實現本地文字轉語音,在 windows 系統下沒有問題,但樹莓派3上中文無法轉換。後來就找到了百度的文字轉換語音API,地址:http://yuyin.baidu.com/#tryn還可以選各種聲音,調節語速。雖然它沒有給出直接的api介面,但是我們利用Chrome瀏覽器的開發者模式可以找到api。
打開開發者模式,點擊播放的按鈕,在network里就可以找到剛剛發出的請。nhttp://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 osn nurl = uhttp://tts.baidu.com/text2audio?idx=1&tex={0}&cuid=baidu_speech_ n udemo&cod=2&lan=zh&ctp=1&pdt=1&spd=4&per=4&vol=5&pit=5.format(text)nos.system(mplayer "%s" % url)n
實現定時播放語音
我們使用crontab來實現每天定時啟動程序。
30 07 * * * /usr/bin/python3 /home/pi/Documens/Python/weather_voice.pyn
Ps:注意crontab中的路徑要使用絕對路徑。n具體的crontab用法就不在這裡一一講解了,大家隨便搜索一下就有很多。
結尾
中間還遇到了一些小bug,比如說語音轉文字的過程中數字只能一個一個的念出來,做為一個完美主義者肯定不能忍受這個,12攝氏度給我播報成一二攝氏度怎麼行!!!所以就寫了一個小函數專門轉換數字為中文。最後所有的代碼整合起來就是這樣啦。
# -*- coding: utf-8 -*-n# @Time : 2017/1/15 15:16n# @Author : woodenrobotnnnimport osnimport renimport timenimport requestsnfrom datetime import datetime, timedeltanfrom bs4 import BeautifulSoupnnnheaders = {n User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKitn /537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safarn i/537.36,n }nnndef numtozh(num):n num_dict = {1: 一, 2: 二, 3: 三, 4: 四, 5: 五, 6: 六, 7: 七,n 8: 八, 9: 九, 0: 零}n num = int(num)n if 100 <= num < 1000:n b_num = num // 100n s_num = (num-b_num*100) // 10n g_num = (num-b_num*100) % 10n if g_num == 0 and s_num == 0:n num = %s百 % (num_dict[b_num])n elif s_num == 0:n num = %s百%s%s % (num_dict[b_num], num_dict.get(s_num, ), num_dict.get(g_num, ))n elif g_num == 0:n num = %s百%s十 % (num_dict[b_num], num_dict.get(s_num, ))n else:n num = %s百%s十%s % (num_dict[b_num], num_dict.get(s_num, ), num_dict.get(g_num, ))n elif 10 <= num < 100:n s_num = num // 10n g_num = (num-s_num*10) % 10n if g_num == 0:n g_num = n num = %s十%s % (num_dict[s_num], num_dict.get(g_num, ))n elif 0 <= num < 10:n g_num = numn num = %s % (num_dict[g_num])n elif -10 < num < 0:n g_num = -numn num = 零下%s % (num_dict[g_num])n elif -100 < num <= -10:n num = -numn s_num = num // 10n g_num = (num-s_num*10) % 10n if g_num == 0:n g_num = n num = 零下%s十%s % (num_dict[s_num], num_dict.get(g_num, ))n return numnnndef get_weather():n # 下載墨跡天氣主頁源碼n res = requests.get(http://tianqi.moji.com/, headers=headers)n # 用BeautifulSoup獲取所需信息n soup = BeautifulSoup(res.text, "html.parser")n temp = soup.find(div, attrs={class: wea_weather clearfix}).em.getText()n temp = numtozh(int(temp))n weather = soup.find(div, attrs={class: wea_weather clearfix}).b.getText()n sd = soup.find(div, attrs={class: wea_about clearfix}).span.getText()n sd_num = re.search(rd+, sd).group()n sd_num_zh = numtozh(int(sd_num))n sd = sd.replace(sd_num, sd_num_zh)n wind = soup.find(div, attrs={class: wea_about clearfix}).em.getText()n aqi = soup.find(div, attrs={class: wea_alert clearfix}).em.getText()n aqi_num = re.search(rd+, aqi).group()n aqi_num_zh = numtozh(int(aqi_num))n aqi = aqi.replace(aqi_num, aqi_num_zh).replace( , ,空氣質量)n info = soup.find(div, attrs={class: wea_tips clearfix}).em.getText()n sd = sd.replace( , 百分之).replace(%, )n aqi = aqi + aqin info = info.replace(,, ,)n # 獲取今天的日期n today = datetime.now().date().strftime(%Y年%m月%d日)n # 將獲取的信息拼接成一句話n text = 早上好!今天是%s,天氣%s,溫度%s攝氏度,%s,%s,%s,%s % n (today, weather, temp, sd, wind, aqi, info)n return textnnndef text2voice(text):n url = http://tts.baidu.com/text2audio?idx=1&tex={0}&cuid=baidu_speech_ n demo&cod=2&lan=zh&ctp=1&pdt=1&spd=4&per=4&vol=5&pit=5.format(text)n # 直接播放語音n os.system(mplayer "%s" % url)nnndef main():n # 獲取需要轉換語音的文字n text = get_weather()n print(text)n # 獲取音樂文件絕對地址n mp3path2 = os.path.join(os.path.dirname(__file__), 2.mp3)n # 先播放一首音樂做鬧鐘n os.system(mplayer %s % mp3path2)n # 播報語音天氣n text2voice(text)nnif __name__ == __main__:n main()n
推薦閱讀:
※爬取34萬專欄文章:304篇10K+高贊文章匯總
※寫爬蟲很簡單但也很難(附某美女站爬蟲源碼)
※從零開始寫Python爬蟲 --- 爬蟲應用:IT之家熱門段子(評論)爬取
※新媒體人必會的傻瓜式爬蟲工具:上手 Web Scraper 的 5 個步驟
TAG:树莓派RaspberryPi | 爬虫 |