Crontab 简单实现树莓派语音闹钟

树莓派实验室按:这是来自 hyhmnn投稿。是时候关掉你的手机闹铃了,用树莓派外接一个音箱就可以 Make 一款科技感和实用性兼备的“AI 闹钟”。这里用到了 Linux 的计划任务、百度语音 API、天气 API。

不看天气的死宅(不爱带包),出门遇到下雨天就尴尬了,在学校还好可以蹭伞,到外面就不行了。
一开始的解决办法就是将爬到的天气信息发到微信上GETWeaInfo
结果有个很大的问题就是,网络要是断了,或者程序不运行了,就要重新载终端上扫二维码登录(太麻烦了)。
于是乎~就有了下面的想法——用树莓派做个天气闹钟。下面开始了!

播放mp3

前提:树莓派安装系统(我装的是最小化的Raspbian jessie)),ssh连接,wifi连接How to set up WiFi..网上都有…音响(基本都可以,没有就用耳机先代替),LED。


sudo apt-get update

sudo apt-get install maplayer2

#更新源

#安装mplayer(用他来播放MP3)

mplayer xxx.mp3

#测试一下

如果有声ok,没有参考林佳楠的博客

配置运行环境

前提:用的python3
安装python3


sudo apt-get install build-essential libsqlite3-dev sqlite3 bzip2 libbz2-dev libssl-dev openssl libgdbm-dev liblzma-dev libreadline-dev libncursesw5-dev

#安装依赖包

wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz

#下载源码包,你也可以换其他的

tar zxf Python-3.6.1.tgz

#解压

cd Python-3.6.1/

./configure --prefix=/usr/loacl/python3

make

sudo make install

echo $?

#如果是0就是正确的,非零仔细看报错信息去百度google(我没有遇到,不好解答)

sudo ln -s /usr/local/python3/bin/python3 /usr/bin/python3

安装virtualenv


sudo pip install virtualenv

mkdir naozhong

cd naozhong

virtualenv - p /usr/bin/python3 naoz

#/usr/bin/python3 是你安装python3可执行路径(不知道就运行$ which pytho3),

source naoz/bin/activate

#前面会出现(dirname)

#deactivate (退出)

virtulaenv的作用&&详细使用
安装需要用到的库


pip install requests

pip install beautifulsoup4

pip install baidu-aip

#安装失败,因为依赖的库pillow安装失败

#那就装一些pillow的依赖包

sudo apt-get install libtiff5-dev

    libjpeg8-dev

    zlib1g-dev

    libfreetype6-dev

    liblcms2-dev

    libwebp-dev

    tcl8.6-dev

    tk8.6-dev

    python-tk



#我试下来需要一个一个安装,

#能安装就安装,不能的就跳过。

#再次 pip install pillow&&pip install baidu-aip



pip install rpi.gpio

#遇到问题error:command 'arm-linux-gnueabihf-gcc' failed with exit status 1

sudo apt-get install python3-dev

sudo apt-get install libevent-dev

#再次pip install rpi.gpio

代码

灯闪亮

vim LEDShining.py

# -*- coding: utf-8 -*-

import RPi.GPIO as GPIO

import time



#init GPIO

GPIO.setmode(GPIO.BOARD)

GPIO.setup(11, GPIO.OUT)

def LED_shining():

    try:

        GPIO.output(11, 1)

        time.sleep(0.5)

        GPIO.output(11, 0)

        time.sleep(0.5)

    except:

        print('')

def main():

    for tmp_a in range(60):

        LED_shining()

    GPIO.cleanup()

if __name__ == '__main__':

    main()

led正极接在11引脚上,负极我放在GND

获取天气并用百度语音转mp3文件

vim wulala.py

# -*- coding: utf-8 -*-

from aip import AipSpeech

import requests

import re

from bs4 import BeautifulSoup

import time

'''

爬取天气网-无锡

http://www.weather.com.cn/weather/101190201.shtml

'''

def getHtmlText(url,code='utf-8'):

    try:

        r = requests.get(url)

        r.raise_for_status()

        r.encoding = code

        return r.text

    except:

        return ''

def makeSoup(html):

    wstr = ''

    if html == '':

        return '哎呀~今天我也不知道无锡天气了'

    else:

        soup = BeautifulSoup(html,'html.parser')

        soup1 = soup.find_all('li',attrs = {'class':'on'})[1]

        str1 = re.findall(r'>(.*)</',str(soup1))

        b = ''

        try:

            slist = re.findall(r'^(.*)</span>(.*)<i>(.*)$',str1[4])

            for x in range(len(slist[0])):

                b += slist[0][x]

        except:

            b = str1[4]

        if '/' in b:

            b = b.replace('/','-')

        str1[4] = '无锡的温度是'+b

        #print(str1[4])

        str1[6] = '小风风是'+str1[6]

        for i in str1:

            if i != '':

                wstr = wstr +i

        if '雨' in wstr:

            wstr += '今天别忘记带雨伞哦!'

        #print(wstr)

        return wstr

'''

用百度的AIP

把文字变成mp3文件

'''

def stringToMp3(strings_txt):

    strings_txt = '起床呀~懒虫~起床啊~死肥宅~起床啦~要上班啦!今天是' + strings_txt

    APPID = '9***3**8'

    APIKey = 'QC*****UK*****nP***b'

    SecretKey = 'e8***6******25*****56'



    aipSpeech = AipSpeech(APPID,APIKey,SecretKey)

    result = aipSpeech.synthesis(strings_txt,'zh','1',\

                                {'vol':8,

                                'per':4,

                                'spd':5})

    if not isinstance(result,dict):

        with open('test_tmp.mp3','wb') as f:

            f.write(result)



'''

执行的主函数

'''

def main():

    url = 'http://www.weather.com.cn/weather/101190201.shtml'

    html=getHtmlText(url)

    stringToMp3(makeSoup(html))



if __name__ == '__main__':

    main()

去创建新应用,看开发文档,查看key,复制进去,就可以使用百度语音api了。
百度语音合成-开发文档
天气网选择你的城市,把main函数下的url改了,如果html结构都是一样的,那就都可以执行,如果不一样需要更改makeSoup函数了。

最后设置定时运行

首先看时区(中国的是CST)、时间对不对

date

时区不对:


sudo dpkg-reconfigure tzdata

#选择亚洲-上海就可以了

时间不对:

sudo ntpd -s -d

定时

crontab -e

第一次运行需要指定您的编辑器(随意选)
在最后添加


50,53,55 7 * * * /home/pi/naozhong/naoz/bin/python3 /home/pi/naozhong/LEDShining.py

45 7 * * * /home/pi/naozhong/naoz/bin/python3 /home/pi/naozhong/wulala.py > /home/pi/naozhong/wulala.log 2>&1

50,53,55 7 * * * `mplayer /home/pi/naozhong/tmp.mp3`

前面的python3,就是virtualenv下的python
后面的文件也需要使用绝对路径
mpalyer命令有’`’这个符合不要忘记加上

这是一篇发布于 7年 前的文章,其中的信息可能已经有所发展或是发生改变,请了解。


13 评论

  1. 运行后出现错误,貌似是溢出,怎么解决?广州的天气…
    “`
    Traceback (most recent call last):
    File “wx.py”, line 74, in
    main()
    File “wx.py”, line 71, in main
    stringToMp3(makeSoup(html))
    File “wx.py”, line 25, in makeSoup
    soup1 = soup.find_all(‘li’,attrs = {‘class’:’on’})[1]
    IndexError: list index out of range
    “`

  2. mplayer 播放音频有很严重的卡顿,不知大伙有没有这个情况,本地和在线地址都试过了,卡的有点难以接受

发表评论

你的邮件地址不会公开


*