Python 让 Jarvis 发声详解

有没有想过使用机器人来完成我们的工作是可能的?嗯,是的!当然,在一些高科技小说、惊奇电影甚至漫画书中。所以,系紧安全带,准备好迎接这一精彩的一章,在这一章中,你将真正实现我刚才提到的内容

本章将涵盖以下主题:

我们可以通过各种方式和方法来控制我们的智能家居 Jarvis,其中一些我们在前面已经探讨过,比如通过控制 Jarvis。因此,首先,我们需要准备我们的系统,以便能够进行语音合成;为此,让我们执行以下过程。

首先,转到终端并输入以下命令:

sudo apt-get install alsa-utils

这样做的目的是安装依赖项alsa-utilsalsa-utils包包含各种工具,可用于控制声音驱动程序。

完成此操作后,您需要编辑该文件。为此,我们需要打开该文件。使用以下命令:

sudo nano /etc/modules

完成后,将打开一个文件;在该文件的底部,您需要添加以下行:

snd_bcm2835

你不必过多地解释我们为什么要这么做。它只是用来安排事情的。我可以给你一个解释;然而,在这个激动人心的时刻,我不想让你感到厌烦

此外,如果你运气好,那么有时候,你可能会发现这条线已经出现了。如果是这样的话,就让它在那里,不要碰它

现在,要播放我们需要 Jarvis 说的声音,我们需要一个音频播放器。不,不是你家里的那个。我们正在讨论可以播放它的软件

要安装播放机,我们需要运行以下命令:

sudo apt-get install mplayer

好了,我们已经完成了音频播放器;让我们看看接下来有什么。现在,我们再次需要编辑媒体播放器的文件。我们将使用相同的步骤打开并编辑该文件:

sudo nano /etc/mplayer/mplayer.conf

这将打开该文件。与前面一样,只需添加以下行:

nolirc=yes

最后,我们需要给它一些声音,所以运行以下命令:

sudo apt-get install festvox-rablpc16k

这将为 Jarvis 安装一个 16 kHz 的英国男性语音。我们喜欢英国口音,不是吗

完美的一旦我们完成了前面提到的所有步骤,我们就可以开始了。要测试语音,只需将 USB 扬声器连接到 Raspberry Pi,然后运行以下代码:

import os
from time import sleep
os.system('echo "hello! i am raspberry pi robot"|festival --tts ')
sleep(2)
os.system('echo "how are you?"| festival --tts ')
sleep(2)
os.system('echo "I am having fun."| festival --tts ')
sleep(2)

好吧,让我们看看我们实际做了什么:

import os

您可能已经知道,我们正在导入名为os的库。此库提供了一种使用操作系统相关功能的方法:

os.system('echo "Hello from the other side"|festival --tts ')

在这里,我们使用的是一种称为system()的方法;它的作用是执行一个 shell 命令。你可能想知道这是什么。shell 命令是用户用来访问系统功能以与之交互的命令。现在我们要将文本转换为语音,我们将为这个函数提供两个参数。首先,文本是什么?在我们的例子中,它是Hello from the other side;我们这里的第二个论点是festival --tts。现在festival是一个库,tts代表文本到语音的转换。因此,当我们将其传递给参数时,系统将知道传递给参数的文本必须从文本转换为语音。

就这样!是的,就是这样。我们要做的就是让你的覆盆子说话

现在,我们都在网上订购东西。然而,无论亚马逊的流程多么自动化,当谈到 2018 年时,我们仍然有人将包裹送到我们家门口。有时候,你想让他们知道一些关于把包裹放在哪里的事情。现在,我们正变得越来越自动化,你可能会在门外留下便条的日子一去不复返了。是时候让我们的技术变得真正有趣了。要做到这一点,我们几乎不需要做任何严肃的事情。我们所需要做的就是将组件连接起来,如下图所示:

必须放置 PIR 传感器,以便在闸门周围移动时,其提供逻辑高。

完成后,继续并上载以下代码:

import RPi.GPIO as GPIO
import time
Import os
GPIO.setmode(GPIO.BCM)
PIR = 13
GPIO.setup(PIR,GPIO.IN)
while True:

  if GPIO.input(PIR) == 1 :
     os.system('echo "Hello, welcome to my house"|festival --tts ')
     time.sleep(0.2)
     os.system('echo "If you are a delivery agent then please leave the package here"|festival --tts ')
     time.sleep(0.2)
     os.system('echo "If you are a guest then I'm sorry I have to leave I will be back after 7pm"|festival --tts ')
     time.sleep(0.2)
     os.system('echo "also Kindly don't step over the grass, its freshly grown and needs some time"|festival --tts ')
     time.sleep(1)
     os.system('echo "Thank you !"|festival --tts ')

现在我们所做的很简单。一旦 PIR 传感器发出逻辑高电平,就会发出特定指令。不需要解释。如果需要任何说明,可以参考前面的代码。

在上一章中,我们使用了 PIR 传感器来感知任何人类活动,但传感器的问题是,无论谁来或离开,它都会传递相同的信息。这基本上意味着,即使你在漫长的一天之后回家,它也会问同样的问题。很蠢吧

因此,在本章中,我们将使用前面的存储库,将视觉和声音集成在一起,形成一对令人惊叹的组合。在这种情况下,摄像机将识别出谁在大门上,并识别出它是否是人类和陌生人,如果是,那么它将传递你想要传递的信息。另一方面,如果它是你,那么它只会让你通过一个简单的问候。但是,如果检测到人脸但无法识别,则会向站在摄像机前的人发出一组指示

要实现它,你需要做的就是在你的门上安装一个摄像头和 PIR。PIR 基本上是激活摄像机。换言之,在未检测到任何移动之前,摄像头不会被激活。此设置非常简单,不需要使用任何 GPIO。只需修复摄像头和 PIR 并上传以下代码:

import RPi.GPIO as GPIO
import time
Import os
import cv2
import numpy as np
import cv2

faceDetect = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
cam = cv2.VideoCapture(0)
rec = cv2.face.LBPHFaceRecognizer_create()
rec.read("recognizer/trainningData.yml")
id = 0

while True:

  GPIO.setmode(GPIO.BCM)
PIR = 13
GPIO.setup(PIR, GPIO.IN)

if GPIO.input(PIR) == 1:

  ret, img = cam.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = faceDetect.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in faces:
  cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)
id, conf = rec.predict(gray[y: y + h, x: x + w])

if id == 1:
  id = "BEN"
os.system('echo "Hello, welcome to the house BEN"|festival --tts ')
time, sleep(0.2)

else :

  os.system('echo "If you are a delivery agent then please leave the package here"|festival --tts ')
time, sleep(0.2)

os.system('echo "If you are a guest then I'
    m sorry I have to leave I will be back after 7 pm "|festival --tts ')
    time, sleep(0.2)

    os.system('echo "also Kindly don'
      t step over the grass, its freshly grown and needs some time "|festival --tts ')
      time.sleep(1)

      os.system('echo "Thank you !"|festival --tts ') cv2.imshow("face", img) if cv2.waitKey(1) == ord('q'):
      break cam.release()

      cv2.destroyAllWindows()
faceDetect = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

在前面的代码中,我们使用CascadeClassifier方法创建了一个级联分类器,以便摄像机可以检测到人脸。

cam = cv2.VideoCapture(0)
rec = cv2.face.LBPHFaceRecognizer_create()

在前面的代码中,我们使用cv2VideoCapture(0)方法从相机读取帧。此外,正在创建人脸识别器以识别特定的人脸

 ret, img = cam.read()

现在使用前面代码中的cam.read()从相机读取数据

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
faces = faceDetect.detectMultiScale(gray,1.3,5)

图像被转换成灰色。然后,faceDetect.detectMultiScale()将使用灰度转换图像

 for (x,y,w,h) in faces:
     cv2.rectangle(img, (x,y), (x+w, y+h), (0,0,255), 2)
     id, conf = rec.predict(gray[y:y+h, x:x+w])
     if id==1:
         id = "BEN" 
         os.system('echo "Hello, welcome to my house BEN"|festival --tts ')
         time, sleep(0.2)

当检测到人脸时,包含人脸的图像部分将转换为灰色并传递给预测函数。此方法将告诉您该面是否已知,如果该面已识别,它还将返回 ID。假设这个人是BEN,那么 Jarvis 会说Hello, welcome to my house BEN。现在BEN可以告诉 Jarvis 打开灯,Jarvis 会在唤醒字 Jarvis 被激活时做出反应。如果这个人不被认出来,那么可能是送货员。然后,执行以下命令:

os.system('echo "If you are a delivery agent then please leave the package here"|festival --tts ')
time, sleep(0.2)

os.system('echo "If you are a guest then I'm sorry I have to leave I will be back after 7pm"|festival --tts ')
 time, sleep(0.2)

os.system('echo "also Kindly don't step over the grass, its freshly grown and needs some time"|festival --tts ')
time.sleep(1)

os.system('echo "Thank you !"|festival --tts ')

声音是交流的本质。它帮助我们在很短的时间内传输大量数据。它肯定比打字更快更容易。因此,越来越多的公司正致力于制造能够理解人类声音和语言并根据它们工作的系统。这当然不容易,因为语言中存在着巨大的差异;然而,我们已经走了相当长的一段路。因此,在没有太多时间的情况下,让我们的系统准备好识别我们的声音

所以在这里,我们将使用来自谷歌语音的 API。你可能知道,谷歌真的很善于理解你说的话。就像,非常字面的意思。因此,使用他们的 API 是有意义的。现在,它的工作方式非常简单。我们捕捉声音,并将其转换为文本。然后,我们比较文本是否与我们在配置文件中定义的内容相似。如果文本与任何内容匹配,将执行与其关联的 bash 命令

首先,我们需要检查麦克风是否已连接。为此,请运行以下命令:

lsusb

此命令将显示通过 USB 连接的设备列表。如果你在名单上看到你的,那么竖起大拇指,你就在正确的轨道上。否则,请尝试通过连接找到它,或者尝试其他硬件

我们还需要将录制音量设置为高。要执行此操作,请继续并在串行端口上键入以下命令:

alsamixer

现在,一旦 GUI 弹出到屏幕上,使用箭头键切换音量。

最好是听自己录制的声音,而不是直接把它传给树莓。首先,我们需要录制语音,因此需要运行以下命令:

arecord -l

这将检查网络摄像头是否在列表中。然后,编写以下命令进行记录:

arecord -D plughw:1,0 First.wav

将使用以下名称First.wav录制声音。

现在我们也想听听刚才录制的内容。执行此操作的简单方法是键入以下命令:

aplay test.wav

检查声音是否正确。如果没有,则您可以自由对系统进行任何调整

一旦我们完成了声音和麦克风的检查,是时候为这项工作安装真正的软件了。有一些简单的方法可以做到这一点。以下是需要运行的命令列表:

wget –- no-check-certificate “http://goo.gl/KrwrBa” -O PiAUISuite.tar.gz

tar -xvzf PiAUISuite.tar.gz

cd PiAUISuite/Install/

sudo ./InstallAUISuite.sh

现在,当你运行这个,非常有趣的事情将开始发生。它将开始问你各种各样的问题。其中有些是直截了当的。你可以用你正确的头脑以是或否的形式给出答案。其他答案可能是非常技术性的。随着时间的推移,这些问题可能会发生变化,似乎没有必要明确提及您需要填写的答案,但一般的经验法则是,除非您真的想说“不”

很好,我们已经安装了软件。现在,在进一步研究该软件之前,让我们继续编写以下程序:

import RPi.GPIO as GPIO
import time
import os
GPIO.setmode(GPIO.BCM)
LIGHT = 2
GPIO.setup(LIGHT,GPIO.OUT)
GPIO.output(LIGHT, GPIO.HIGH)
os.system('echo "LIGHTS TURNED ON "|festival --tts')

每当该程序运行时,连接在插脚编号2上的灯将点亮。同时,它将读出LIGHTS TURNED ON。使用名称lighton.py保存此文件:

import RPi.GPIO as GPIO
import time
import os
GPIO.setmode(GPIO.BCM)
LIGHT = 23
GPIO.setup(LIGHT,GPIO.OUT)
GPIO.output(LIGHT, GPIO.LOW)
os.system('echo "LIGHTS TURNED OFF "|festival --tts')

同样,在这个程序中,灯将被关闭,并将读取LIGHTS TURNED OFF。按名称lightoff.py保存:

import RPi.GPIO as GPIO
import time
Import os
GPIO.setmode(GPIO.BCM)
FAN = 22
GPIO.setup(FAN,GPIO.OUT)
GPIO.output(LIGHT, GPIO.HIGH)
os.system('echo "FAN TURNED ON "|festival --tts')

现在我们也在为风扇做同样的事情。在这一次,风扇将被打开;用名称fanon.py保存:

import RPi.GPIO as GPIO
import time
Import os
GPIO.setmode(GPIO.BCM)
FAN = 22
GPIO.setup(FAN,GPIO.OUT)
GPIO.output(LIGHT, GPIO.LOW)os.system('echo "FAN TURNED OFF "|festival --tts')

我不需要解释同样的事情,对吗?正如您所猜测的,将其保存为名称fanoff.py

好吧完成所有这些操作后,键入以下命令以检查软件安装是否正确:

voicecommand -c 

覆盆子皮回应唤醒词pi;我们把它改成jarvis。使用以下命令打开配置文件后,可以进行所有这些更改:

voicecommand -e. 

在该文件中,输入您自己的命令。在这里,让我们添加以下代码:

LIGHT_ON

LIGHT_OFF

FAN_ON

FAN_OFF

现在,为每个命令定义操作。操作将是运行 Python 文件,该文件包含用于打开或关闭灯光和风扇的代码。代码简单易懂。请将以下内容添加到文件中:

LIGHT ON = sudo python lighton.py

LIGHT OFF = sudo python lightoff.py

FAN ON = sudo python fanon.py

FAN OFF = sudo python fanoff.py

现在,让我们看看我们做了什么。每当你说Jarvis,打开时,它会将你的速度转换为文本,并与它必须运行的程序进行比较,然后执行程序中的任何操作。因此,在这个程序中,每当我们说灯亮起时,灯就会亮起,其他命令也会亮起。记住让它听你在说什么。你必须说一个词,Jarvis,,这将使它注意到命令并准备好倾听

在本章中,我们了解了如何根据我们的需要进行交互并使 Jarvis 工作。如果这一章是关于口头交流的,那么下一章是关于手势识别的,在这里,使用先进的电容技术,你可以通过挥手来控制你的自动化系统。

教程来源于Github,感谢apachecn大佬的无私奉献,致敬!

技术教程推荐

Flutter核心技术与实战 -〔陈航〕

消息队列高手课 -〔李玥〕

即时消息技术剖析与实战 -〔袁武林〕

说透中台 -〔王健〕

软件设计之美 -〔郑晔〕

正则表达式入门课 -〔涂伟忠〕

说透芯片 -〔邵巍〕

深入拆解消息队列47讲 -〔许文强〕

结构思考力 · 透过结构看表达 -〔李忠秋〕