從零打造樹莓派智能助手(一)——讓樹莓派說話


本期原材料:已經完成基本配置的樹莓派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

 

最后改回每天早上八點提醒,如果你特別懶你可以修改為八點到九點每五分鍾提醒一次。

這樣每天早上都有一個女生叫你起床啦!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM