利用爬蟲和樹莓派3打造自己的語音天氣鬧鐘

博客地址:woodenrobot.me

翻出吃灰很久的樹莓派,又把這個語音天氣鬧鐘的程序優化了一下。

---------------------------分割線2017.07.15---------------------------

終於擠出時間修復了一個大bug,竟然沒有一個人說程序運行不正常。看來大家都是只收藏不行動啊。現在最新版直接把代碼拷走,安裝好依賴庫,本地運行就可以實現每天定時播報語音天氣了!( 逃

---------------------------分割線2017.02.22---------------------------

前言

前不久又一次一個人在他鄉過了生日,悄悄買了一台樹莓派3送給自己做生日禮物。終於算是實現了大學以來一直的一個小願望。買回來之後當然不能讓他落灰,於是就利用自己的爬蟲技術+樹莓派+小音箱實現了一個定時鬧鐘外加語音天氣播報功能。

準備

  1. 樹莓派3
  2. 小音箱

環境

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的用法這裡就先不多說了,大家可以去看他們的中文文檔。

  1. Requests中文文檔
  2. Beautiful Soup中文文檔

命令行播放語音

使用mplayer實現語音播放,通過以下命令安裝mplayer:

sudo apt-get install mplayern

用法很簡單輸入以下命令即可播放本地音樂:

mplayer xxxxxxxxx.mp3(絕對地址)n

如果是在線音樂也可以用mplayer直接通過URL播放:

mplayer "URL"(URL外面一定要用雙引號圈起來)n

文字轉語音

剛開始想通過 python 的庫實現本地文字轉語音,在 windows 系統下沒有問題,但樹莓派3上中文無法轉換。後來就找到了百度的文字轉換語音API,地址:yuyin.baidu.com/#n還可以選各種聲音,調節語速。雖然它沒有給出直接的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 | 爬虫 |