在我們運(yùn)行Python程序之前,我們需要安裝兩個(gè)庫(kù):語音識(shí)別和PyAudio。要安裝這兩個(gè)庫(kù),需要在終端窗口中運(yùn)行以下兩個(gè)命令:
$ sudo pip install SpeechRecognition
$ sudo pip install PyAudio
如果您在安裝PyAudio時(shí)遇到問題,可以使用以下系列安裝它說明:
$ sudo apt-get install git
$ sudo git clone http://people.csail.mit.edu/hubert/git/pyaudio.git
$ sudo apt-get install libportaudio0 libportaudio2 libportaudiocpp0 portaudio19-dev
$ sudo apt-get install python-dev
$ cd pyaudio
$ sudo python setup.py install
一旦安裝了這兩個(gè)庫(kù),您就需要禁用Raspberry Pi上的板載音頻驅(qū)動(dòng)程序,因?yàn)樗赡軙?huì)干擾PyAudio。為此,首先打開一個(gè)新終端并運(yùn)行以下命令:
$ cd /etc/modprobe.d
$ sudo nano alsa-blacklist.conf
Nano是終端的簡(jiǎn)單文本編輯器,加載時(shí)只需要輸入一行:
blacklist snd_bcm2835
按Ctrl + X退出nano并使用文件名alsa-blacklist.conf保存文件。這個(gè)簡(jiǎn)單的文件禁用了Raspberry Pi的Broadcom音頻系統(tǒng),因此Pi上唯一可用的音頻系統(tǒng)是USB聲卡。
語音控制冰箱列表如何工作
Python腳本首先導(dǎo)入語音識(shí)別模塊,該模塊用于將口語單詞轉(zhuǎn)換為字符串。導(dǎo)入模塊后,我們創(chuàng)建一個(gè)對(duì)象r,它是一個(gè)語音識(shí)別器對(duì)象,用于記錄麥克風(fēng)的音頻,然后請(qǐng)求轉(zhuǎn)換。在定義了語音識(shí)別對(duì)象之后,我們還定義了變量,包括項(xiàng)目列表,命令,當(dāng)前項(xiàng)目以及包含已解析命令的數(shù)組。
import speech_recognition as sr
r = sr.Recognizer()
items = dict()
command = “”
item = “”
初始配置完成后,下一個(gè)要執(zhí)行的代碼塊就是主循環(huán)。循環(huán)中的第一個(gè)任務(wù)是通過打印單詞“Speak”通知用戶發(fā)言,然后創(chuàng)建一個(gè)名為“audio”的音頻對(duì)象,它保存我們的麥克風(fēng)流。
while(1):
with sr.Microphone() as source:
print(“Speak:”)
audio = r.listen(source)
當(dāng)麥克風(fēng)檢測(cè)到聲音并完成錄制時(shí)(當(dāng)聲級(jí)低于閾值時(shí)錄制停止),它會(huì)將錄制的音頻傳遞給識(shí)別器對(duì)象。執(zhí)行此操作后,r將使用Google服務(wù)嘗試將音頻轉(zhuǎn)換為句子,然后將其傳遞給名為speechString的變量。所有這些代碼都在try/except塊中完成,以防音頻被理解或服務(wù)不可用。收到的字符串也被解析為prasedCommands,其中分隔符是空格。因此,如果說“添加培根”這個(gè)詞,結(jié)果將是parsedCommands [0]將是“add”而parsedCommands [1]將是“bacon”。
try:
speechString =r.recognize_google(audio)
parsedCommands = speechString.split(“ ”)
except sr.UnknownValueError:
print(“Could not understand audio”)
except sr.RequestError as e:
print(“Could not request results; {0}”.format(e))
if(len(parsedCommands) 》 0):
command = parsedCommands[0]
if(len(parsedCommands) 》 1):
item = parsedCommands[1]
現(xiàn)在我們擁有我們解析的命令和項(xiàng)目,我們可以將它們添加到我們的項(xiàng)目列表中。但是,為了保持清潔,我們會(huì)執(zhí)行以下幾項(xiàng)檢查:
如果該項(xiàng)目已存在且已添加,則增加項(xiàng)目值
如果該項(xiàng)目不存在且添加了該項(xiàng)目,則將該項(xiàng)目添加到列表中
如果該項(xiàng)目已存在且已刪除,則如果總計(jì)大于1則減去1
/li》
如果該項(xiàng)目已存在,則說明已刪除,并且只剩下項(xiàng)目,刪除項(xiàng)目
如果該項(xiàng)目不存在,忽略命令
if(command == “add”):
if item in items:
items[item] = str(int(items[item]) + 1)
else:
items[item] = str(1)
print(item + “ added”)
if(command == “remove”):
if item in items:
if(int(items[item]) 》 1):
items[item] = str(int(items[item]) - 1)
else:
try:
items.pop(item, None)
except:
pass
print(item + “ removed”)
這個(gè)簡(jiǎn)單腳本中的最后一個(gè)命令是“display”,它將變量項(xiàng)的內(nèi)容打印到顯示中。
if(command == “display”):
print(items)
完整代碼
import speech_recognition as sr
r = sr.Recognizer()
items = dict()
command = “”
item = “”
while(1):
with sr.Microphone() as source:
print(“Speak:”)
audio = r.listen(source)
try:
speechString =r.recognize_google(audio)
parsedCommands = speechString.split(“ ”)
except sr.UnknownValueError:
print(“Could not understand audio”)
except sr.RequestError as e:
print(“Could not request results; {0}”.format(e))
if(len(parsedCommands) 》 0):
command = parsedCommands[0]
if(len(parsedCommands) 》 1):
item = parsedCommands[1]
if(command == “add”):
if item in items:
items[item] = str(int(items[item]) + 1)
else:
items[item] = str(1)
print(item + “ added”)
if(command == “remove”):
if item in items:
if(int(items[item]) 》 1):
items[item] = str(int(items[item]) - 1)
else:
try:
items.pop(item, None)
except:
pass
print(item + “ removed”)
if(command == “display”):
print(items)
command = “”
item = “”
days = “”
parsedCommands.clear()
此項(xiàng)目以Raspberry Pi為中心,除麥克風(fēng)和顯示器外不需要任何電路或硬件。雖然可以使用普通的顯示器或電視顯示器,但它對(duì)于安裝來說并不是很實(shí)用,因此在這個(gè)項(xiàng)目中,我得到了一個(gè)小型的3.5英寸Raspberry Pi顯示器,分辨率為480x320。雖然這對(duì)于正常使用而言太小,但它非常適合命令行工作,如果通過網(wǎng)絡(luò)編程和使用此Pi(使用SSH),則可以從任何具有Internet連接的PC上運(yùn)行Python程序。
-
python
+關(guān)注
關(guān)注
56文章
4792瀏覽量
84628 -
樹莓派
+關(guān)注
關(guān)注
116文章
1706瀏覽量
105609
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論