从零打造树莓派智能助手(一)——让树莓派说话

本期原材料:已经完成基本配置的树莓派3b+一个,小音箱一对

本期内容:利用树莓派和百度语音接口,让树莓派可以说出固定的句子。

前置知识:基本Linux命令行,python基础

参考链接:https://blog.csdn.net/lakeheart879/article/details/52016672

一、安装mpg123

之所以选择mpg123这个mp3播放库,是因为据说maplayer2等其他库存在播放过程中可能会报错之类的问题,有了mpg123之后,可以实现播放mp3文件以及在线播放,这就方便我接入百度的API。安装命令行:

sudo apt-get install mpg123

可以使用下面这个例子实验一下mpg123安装是否成功,

mpg123 xxx.mp3

  

安装成功后可以进入下一步:

二、接入百度语音API

百度语音的地址是:http://yuyin.baidu.com

注册账号,然后创建一个新应用,获得一个id和key,然后用这个id和key获取token,

获取token的过程需要查看百度的文档,实际上就是通过一个申请的通讯获取到,方法很多,我这里给出我的方式,通过python文件获取token:

import requests 

# client_id 为官网获取的AK, client_secret 为官网获取的SK
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=「」&client_secret=「」'
response = requests.get(host)
print("正在获取密码...")
if response:
    print(response.json())

  

可以利用命令行vi编写好python文件,然后在命令行运行,注意AK和SK都是一种Key,在注册的应用界面是给出的,我这里用「」代替了,读者可以带入自己的AK和SK。

获取到的结果是一个json文件,但是不需要解析,很简单,直接在打印的结果中复制你的token即可。

然后就可以通过拼接url的方式来合成语音了,具体的拼接方式是:

mpg123 "http://tsn.baidu.com/text2audio?tex="大家好我是一个机器人"&lan=zh&per=0&pit=9&spd=9&cuid=***&ctp=1&tok=「」"

  

同样的,「」指代token的内容,读者替换成自己的token,tex是要合成的语音内容,per是声音的性别,1是男,0是女,默认是女,pit是音调,spd是语速,调节范围都是1-9。在浏览器打开这个链接,也是可以直接听见声音的。

三、利用python进行封装

然后我们将其写入一个python文件,方便以后我们进行智能助手的配置,下面给出我的程序。

 

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

import os

import sys

# 男生
# url = '\"'+ "http://tsn.baidu.com/text2audio?tex=" + '\"'+ sys.argv[1] + '\"' +"&lan=zh&per=1&pit=7&spd=3&cuid=***&ctp=5&tok=24.96a887117784fe49b73c5f3e6d0e2083.2592000.1575033188.282335-17656521" + '\"'
# print("mpg123 " + "%s"%(url))

# 女生
url = '\"'+ "http://tsn.baidu.com/text2audio?tex=" + '\"'+ sys.argv[1] + '\"' +"&lan=zh&per=0&pit=7&spd=3&cuid=***&ctp=5&tok=24.96a887117784fe49b73c5f3e6d0e2083.2592000.1575033188.282335-17656521" + '\"'

os.system("mpg123 " + "%s"%(url))

 

本来我直接使用别人的代码,结果发现或多或少都有点小问题(主要就是引号的问题),然后改成这样的,所以读者也可以看着改吧,代码很简单。

封装好以后,就可以直接使用命令行调用,我的文件命名为Read.py,那么就可以这样调用,

 

python3 Read.py 今天是一个好天气

 

当然,你可以通过在python文件中设置time模块,就可以实现实时报时功能,封装好之后很多功能都可以在python文件中进行集成化。

然后,最简单的循环播放可以利用命令行实现:

 while true ;do python3 Read.py 我真的很烦; done;

 

四、利用crontab实现定时提醒

 

如果你想做一个智能提醒小助手,可以采用Linux中的crontab命令来实现,我想要它每天早上叫我起床,首先看crontab的命令规则:

 

usage:  crontab [-u user] file
        crontab [-u user] [ -e | -l | -r ]
                (default operation is replace, per 1003.2)
        -e      (edit user's crontab)
        -l      (list user's crontab)
        -r      (delete user's crontab)
        -i      (prompt before deleting user's crontab)
        -s      (selinux context)
 

 

说明:

crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。

-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。

参数说明:

-e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe)
-r : 删除目前的时程表
-l : 列出目前的时程表

  

这里就不详细叙述这个命令的功能了,需要的读者可以自行了解,我们只需要知道如何使用这个命令形成一个定时助手,也就是要利用

crontab -e

 这个语句然后构建一个定时任务,在命令行输入上述命令,可以打开一个编辑文件,在里面按照格式写入想要的信息,具体格式自行百度。

下面举几个例子:

 

每月每天每小时的第 0 分钟执行一次 /bin/ls

0 * * * * /bin/ls

在 12 月内, 每天的早上 6 点到 12 点,每隔 3 个小时 0 分钟执行一次 /usr/bin/backup

0 6-12/3 * 12 * /usr/bin/backup

周一到周五每天下午 5:00 寄一封信给 alex@domain.name

0 17 * * 1-5 mail -s "hi" alex@domain.name < /tmp/maildata

每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分....执行 echo "haha"

20 0-23/2 * * * echo "haha"
 
下面再看看几个具体的例子:

0 */2 * * * /sbin/service httpd restart  意思是每两个小时重启一次apache 

50 7 * * * /sbin/service sshd start  意思是每天7:50开启ssh服务 

50 22 * * * /sbin/service sshd stop  意思是每天22:50关闭ssh服务 

0 0 1,15 * * fsck /home  每月1号和15号检查/home 磁盘 

1 * * * * /home/bruce/backup  每小时的第一分执行 /home/bruce/backup这个文件 

00 03 * * 1-5 find /home "*.xxx" -mtime +4 -exec rm {} \;  每周一至周五3点钟,在目录/home中,查找文件名为*.xxx的文件,并删除4天前的文件。

30 6 */10 * * ls  意思是每月的1、11、21、31日是的6:30执行一次ls命令

  

对于我来说,我让他每天早上八点叫我起床:

可以先编写一个sh文件,sh里面写两句话,第一句是cd到含有python文件的文件夹中,第二句是执行你想执行的python文件(python文件就是把叫你起床的代码写进去),注意:sh里需要指定你python系统路径,给出我的例子:

 

#!/usr/bin/bash
cd /home/pi/Desktop
/usr/bin/python3 clock.py

然后打开crontab -e 即可,如下:

00 8 * * * /home/pi/Desktop/clock.sh >> /home/pi/Desktop/clock.py.log 2>&1

后面的是打印任务log信息到我的桌面。

会是这么简单吗?当然不是,等了一天啥也没有,结果发现log报错了。

/bin/sh: 1: /home/pi/Desktop/clock.sh: Permission denied

 没有权限,这就尴尬了,修改一下crontab的内容,加上/bin/sh ,给他root权限。

00 8 * * * /bin/sh /home/pi/Desktop/clock.sh >> /home/pi/Desktop/clock.py.log 2>&1

 

这回我没再等一整天,而是修改了crontab让他一分钟执行一次,这次也通过了检验。

 

另外还有一种错误,比如树莓派本身时间不对,可以参考下面链接解决问题。

http://shumeipai.nxez.com/2015/06/28/raspberry-pi-date-and-time-correction-method-allowed.html

 

最后改回每天早上八点提醒,如果你特别懒你可以修改为八点到九点每五分钟提醒一次。

这样每天早上都有一个女生叫你起床啦!

 

posted @ 2019-11-03 11:16  hangingter  阅读(2810)  评论(0编辑  收藏  举报