如何利用Raspberry Pi实现Jarvis主题口语闹钟

如何利用Raspberry Pi实现Jarvis主题口语闹钟,第1张

  “早上好。现在是早上 7:00 马里布的天气是 72 度,云层散落。冲浪条件公平,腰部到肩的高线。涨潮时间为上午 10:52”。每次在电影钢铁侠中听到贾维斯的这个声音,都会让我脊背发凉。我敢肯定,就像我一样,很多人都梦想过像托尼·斯塔克一样精致的生活。但遗憾的是,我们还没有在微型 Arc 反应堆或像 JARVIS 一样聪明的 AI 方面取得进步。但是可以用类似于 Jarvis 使用 Raspberry Pi 的闹钟来代替我们无聊的早晨闹钟。在这个项目结束时,我们将创建一个非常基本的 GUI,我们可以使用它来设置闹钟,当闹钟响起时,我们将通过一些预定义的文本告诉我们当前时间和日期。听起来很酷吧!!所以让我们建立一个。

  所需材料

  树莓派

  3.5” TFT液晶屏

  扬声器

  辅助电缆

  网络连接

  先决条件

  假设您的 Raspberry Pi 已刷入 *** 作系统并能够连接到 Internet。如果没有,请 在继续之前遵循Raspberry Pi 入门教程。这里我们使用 Rasbian Jessie 安装 Raspberry Pi 3。

  还假设您可以通过终端窗口或其他应用程序访问您的 pi,您可以使用这些应用程序编写和执行 python 程序并使用终端窗口。

  您可能还想了解如何将 3.5 英寸 TFT LCD 与 Raspberry Pi 连接,因为我们将在此项目中使用它。

  为 Raspberry Pi 安装 TTS 引擎 (Espeak)

  正如项目标题所述,我们将构建一个说话时钟。为了让您的 Pi 说话,我们需要一个文本到语音 (TTS) 引擎。有很多选项可供选择,但为了简单起见,我选择了Espeak Engine。要在您的 Pi 上安装 Espeak,只需在终端上运行以下命令

  sudo apt-get install espeak

  sudo apt-get install espeak python-espeak

  为 Raspberry Pi 口语闹钟创建 GUI

  对于这个项目,我们需要开发一个代表闹钟的 GUI,以便用户可以查看当前时间并设置闹钟。使用 Python 开发 GUI有很多选择,但最流行和通用的一个是PyQt4,所以我们将使用它来开发我们的 GUI。在下面的几个标题中,我们讨论了如何使用 PyQt4 设计自己的 GUI,但如果您不感兴趣,可以直接跳到“语音闹钟程序”标题。

  在 Windows 机器上使用 Qt 设计器安装 PyQt4

  由于我们正在设计一个 GUI,我们将首先在我们的笔记本电脑(windows/Linux)上开始我们的编程,然后将这个 python 脚本移植到我们的 Pi 上。由于 PyQt4 具有非常好的可移植性,大多数开发人员都会这样做,因为在笔记本电脑上进行开发既简单又快捷,而实际上在 Raspberry Pi 上进行。

  我已经在我的 windows 机器上安装了 python 和 PQt 包;如果您对此不感兴趣,您可以跳过此步骤在您的树莓派上开发您的 GUI。要在 Windows 上安装 PQt,请下载此 exe 文件,并在安装过程中确保您已检查 Qt 设计器软件,因为我们将在我们的项目中使用它。

  在 Pi/Linux/MAC 机器上安装 PyQt

  要在 Linux 机器上安装 PyQt,只需在命令终端上运行以下行

  sudo apt-get install python-qt4

  使用 Qt Designer 设计 GUI

  使用 PyQt4 进行 GUI 设计的一个显着优势是它具有Qt 设计器软件。该软件可用于创建按钮、显示、文本和其他图形,只需将东西拖到屏幕上并将它们放置在需要的地方。这为我们节省了大量时间,因为我们不必手动输入屏幕上对象的大小和位置。我已经使用上面段落中讨论的 exe 文件在我的 Windows 笔记本电脑上安装了 Qt 设计器以及 Python 和 PyQt4。安装后打开你的 Qt Designer,你会得到这个屏幕。

如何利用Raspberry Pi实现Jarvis主题口语闹钟,pYYBAGLnnmGAC5EzAAE_6hyjwjk635.png,第2张

  在左侧,您可以找到布局、间隔、按钮和其他项目,您只需将其拖到窗口中即可使用。您还可以使用右侧的窗口根据需要自定义对象。我使用了一个7 段 LCD 显示屏、一个按钮、一个文本行和设置时间对象来为我们的闹钟创建 UI。使用布局将所有对象放置在所需的位置和大小后,我的窗口如下所示

如何利用Raspberry Pi实现Jarvis主题口语闹钟,poYBAGLnnluADAf4AACMjTotMaA214.png,第3张

  准备好 GUI 后,您可以将设计保存为.ui文件。以后,当您希望对 GUI 进行更改时,您只需打开此文件并进行更改,而无需在程序中上下滚动。如果您希望对此设计进行任何更改,可以下载口语时钟的.ui 文件。一旦您对 GUI 设计感到满意,您可以将其导出为 Python 代码,您可以从那里开始您的 Python 编程。

  我知道这里有很多事情会让您不知所措,但是不可能在一个教程中解释如何使用 Qt4 库。您可以参考sentdex PyQt4 教程系列,了解如何使用 PyQt4 和 Qt 设计器软件。

用于树莓派口语闹钟的 Python 程序

此项目的完整 python 代码在本页末尾给出。您可以直接在您的 Raspberry pi 上运行它以获取输出,但下面我将程序解释为小片段,以便您了解该程序的工作原理。

Qt 设计器软件已经为我们编写了几乎一半的代码,然后该代码包含有关我们屏幕顶部对象的类型、样式、大小和位置的信息。现在我们要做的就是为这些对象提供用途和功能。

7 段显示器用于显示当前时间。设置时间对象用于选择闹铃时间,点击“设置闹铃”按钮设置闹铃时间。底部的文本行显示设置警报的时间和其他有用信息。除此之外,我们还必须在设置和触发警报时播放语音​​警报。

对于我们的程序,我们需要PyQt4来设计 GUI 和espeak 来播放语音警报和时间包strfTIme来从 Pi 读取当前时间。所以我们使用下面的代码行导入所有三个包。

 

from PyQt4 import QtCore, QtGui #PyQt4 用于设计 GUI 
from espeak import espeak #text to Speech Sonversion 
from TIme import strfTIme # To get TIme from Raspberry pi

 

接下来我们有一个从 Qt 设计器获得的代码块,这些代码将包含我们放置在屏幕上的小部件的位置和大小。我们对代码进行了一些编辑,以便为小部件指定用途。首先,在 7 段 LCD 小部件上,我们必须显示当前时间,这可以通过使用strftime方法来完成,该方法将为我们提供在 Pi 上运行的当前时间。然后我们可以在 LCD 上显示这个时间,如下所示。

 

self.Time_LCD = QtGui.QLCDNumber(self.centralwidget) 
self.Time_LCD.setObjectName(_fromUtf8("Time_LCD")) 
self.Time_LCD.setDigitCount(8) 
self.Time_LCD.display(strftime("%H"+":"+ "%M"+":"+"%S")) #从 Pi 获取时间并显示
self.gridLayout.addWidget(self.Time_LCD, 1, 0, 1, 3)

 

接下来我们有一个按钮按下按钮,当按下这个按钮时,我们必须设置警报。所以我们使用了一种叫做button_pressed的方法。每当按下此按钮时,都会调用函数button_pressed 。

 

self.pushButton = QtGui.QPushButton(self.centralwidget) 
        self.pushButton.setObjectName(_fromUtf8("pushButton")) 
        self.pushButton.clicked.connect(self.button_pressed) #当按钮按下时调用按钮按下函数
        self.gridLayout。 addWidget(self.pushButton, 2, 1, 1, 1) 
        MainWindow.setCentralWidget(self.centralwidget)

 

button_pressed函数如下所示。在这里,我们从设置的时间小部件中读取小时和分钟的值。此信息将采用字符串形式,因此可以对其进行修剪以获得小时和分钟的值并存储在变量alarm_h和alarm_m中。一旦我们有了分钟和小时的值,我们就可以使用它与当前的分钟和小时进行比较。

最后,在读取设置的时间后,我们还使用字符串变量消息显示文本。此消息将显示为标签文本。

 

def button_pressed(self): #当设置闹钟按钮被按下时
        print("Button Pressed") 
        alarm_time = str(self.Set_Time.time()) 
        self.alarm_h = int(alarm_time[19:21]) #小时值为存储在索引值 19 和 20         self.alarm_m = int (alarm_time[23:25]) #分钟值存储在索引值 23 和 24       



        message = "警报设置在 " + str(self.alarm_h) + " hours " + str(self.alarm_m) + " minutes" 
        self.label.setText(_translate("MainWindow", message, None)) #显示GUI 屏幕上
        的消息 espeak.synth (message) #通过音频插孔说出消息

 

我们还通过使用espeak方法发出语音警报,说明警报已设置为某某时间。此方法只是说出通过音频插孔传递给它的任何文本。这里读出了变量message中的字符串

 

espeak .synth (message) #通过音频插孔说出消息

 

最后,我们还需要一种方法,将当前时间与设定时间进行比较,当两者匹配时,它必须通过语音通知用户。为此,我们的代码中有时间函数,它将 current_h 与 alarm_h 和 current_m 与 alarm_m 进行比较。当两者都匹配时,它会通过说出存储在变量 message1 中的文本来触发警报。如果你想让时钟说别的东西,你可以自定义变量 message1;现在它会祝你早安以及当前的时间和日期。

 

 def Time(self): #比较当前时间和设置时间
        的函数 self.Time_LCD.display(strftime("%H"+":"+"%M"+":"+"%S")) 
        self.current_h = int (strftime("%H")) 
        self.current_m = int (strftime("%M"))

        if (self.current_h == self.alarm_h) and (self.current_m == self.alarm_m) and ((int(strftime("%S"))%15) == 0): #如果两个时间都匹配
            print ("ALARM ON!!!!!") 
            message1 = " 时间是 " + str(self.alarm_h) + " : " + str(self.alarm_m) + " on " + strftime("%A")             message = “先生,早上好……这是您的起床闹钟。” + 消息1           



            self.label.setText(_translate("MainWindow",message1, None)) #在GUI屏幕上显示
            消息 espeak.synth (message) #通过音频插孔朗读消息 time.sleep 
            (1)

 

  Raspberry Pi 闹钟的硬件设置

  该项目的硬件设置非常简单。我们的 PI 仅使用3.5 英寸 TFT LCD 屏幕。要设置显示器,您可以按照接口 Pi 与 3.5 英寸 LCD 教程进行 *** 作。一旦你的接口完成,你应该能够使用手写笔并浏览树莓派的 *** 作系统。为了播放您需要扬声器的声音,我通过 AUX 电缆将便携式扬声器连接到 pi。一切设置好并启动程序后,我的设置如下所示。

如何利用Raspberry Pi实现Jarvis主题口语闹钟,poYBAGLnnlWAOycBAAdEsn4XEN0503.png,第4张

  基于 Pi 的口语闹钟的工作原理

  如上所示准备硬件,然后确保您已在 Pi 上安装 PyQt4 和 Espeak。然后使用下面给出的python代码,只需将其粘贴到python IDLE中并运行程序。它将启动 GUI 窗口,如下所示

如何利用Raspberry Pi实现Jarvis主题口语闹钟,pYYBAGLnnlGALnyMAAPkZJNbbrE960.png,第5张

  它显示当前时间,还提供一个文本框来设置闹钟。使用触控笔设置闹钟时间并按下设置闹钟按钮。这将为您提供一条语音消息,说明已设置警报。现在只需等待 7 段显示屏上显示的当前时间等于警报时间。当它等于触发警报时,这将再次提供带有当前时间和日期的语音消息。在分钟值更改之前,此警报将重复四次。该项目的完整工作可以在下面给出的视频链接中找到。

# 使用 Raspberry Pi 说话闹钟

#通过 AUX 连接 3.5" LCD 和扬声器,并使用 PyQt4 和 espeak 包运行程序

# 程序作者:B.Aswinth Raj 

# 网站: circuitdigest.com 

# GUI 代码是使用 Qt Designer 创建的 

导入系统

导入时间

from PyQt4 import QtCore, QtGui #PyQt4 用于设计 GUI 

from espeak import espeak #text to Speech Sonversion 

from time import strftime # To get time from Raspberry pi

#Qt Designer 中的代码

try: 

    _fromUtf8 = QtCore.QString.fromUtf8 

except AttributeError: 

    def _fromUtf8(s): 

        return s

尝试:

    _encoding = QtGui.QApplication.UnicodeUTF8 

    def _translate(context, text, disambig): 

        return QtGui.QApplication.translate(context, text, disambig, _encoding) 

except AttributeError: 

    def _translate(context, text, disambig): 

        return QtGui. QApplication.translate(context, text, disambig)

类 Ui_MainWindow(object): 

    def setupUi(self, MainWindow):

        self.alarm_h = 0 

        self.alarm_m = 0 

        MainWindow.setObjectName(_fromUtf8("MainWindow")) 

        MainWindow.resize(676, 439) 

        self.centralwidget = QtGui.QWidget(MainWindow) 

        self.centralwidget.setObjectName(_fromUtf8("centralwidget" )) 

        self.gridLayout = QtGui.QGridLayout(self.centralwidget) 

        self.gridLayout.setObjectName(_fromUtf8("gridLayout")) 

        self.label = QtGui.QLabel(self.centralwidget) 

        font = QtGui.QFont() 

        font.setPointSize( 14) 

        self.label.setFont(font) 

        self.label.setObjectName(_fromUtf8("label")) 

        self.gridLayout.addWidget(self.label, 3, 0, 1, 1)

        self.Time_LCD = QtGui.QLCDNumber(self.centralwidget) 

        self.Time_LCD.setObjectName(_fromUtf8("Time_LCD")) 

        self.Time_LCD.setDigitCount(8) 

        self.Time_LCD.display(strftime("%H"+":"+ "%M"+":"+"%S")) #从 Pi 获取时间并显示 

        self.gridLayout.addWidget(self.Time_LCD, 1, 0, 1, 3)

        self.timer = QtCore.QTimer(MainWindow) 

        self.timer.timeout.connect(self.Time) 

        self.timer.start(1000) 

        current_time = QtCore.QTime() 

        self.Set_Time = QtGui.QTimeEdit(self.centralwidget) 

        self .Set_Time.setObjectName(_fromUtf8("Set_Time")) 

        self.Set_Time.setTime(current_time.currentTime()) 

        self.gridLayout.addWidget(self.Set_Time, 2, 0, 1, 1)

        self.pushButton = QtGui.QPushButton(self.centralwidget) 

        self.pushButton.setObjectName(_fromUtf8("pushButton")) 

        self.pushButton.clicked.connect(self.button_pressed) 

        self.gridLayout.addWidget(self.pushButton, 2, 1 , 1, 1) 

        MainWindow.setCentralWidget(self.centralwidget) 

        self.menubar = QtGui.QMenuBar(MainWindow) 

        self.menubar.setGeometry(QtCore.QRect(0, 0, 676, 21)) 

        self.menubar.setObjectName(_fromUtf8( "menubar")) 

        MainWindow.setMenuBar(self.menubar) 

        self.statusbar = QtGui.QStatusBar(MainWindow) 

        self.statusbar.setObjectName(_fromUtf8("statusbar")) 

        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow) 

        QtCore.QMetaObject.connectSlotsByName(MainWindow)

#Qt Designer 代码结束

    def retranslateUi(self, MainWindow): #更新GUI窗口 

        print("Dispay Re-translated") 

        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None)) 

        self.label.setText(_translate("MainWindow" , "警报当前已关闭", None)) 

        self.pushButton.setText(_translate("MainWindow", "Set Alarm", None))

    def Time(self): #比较当前时间和设置时间 

        的函数 self.Time_LCD.display(strftime("%H"+":"+"%M"+":"+"%S")) 

        self.current_h = int (strftime("%H")) 

        self.current_m = int (strftime("%M"))

        if (self.current_h == self.alarm_h) and (self.current_m == self.alarm_m) and ((int(strftime("%S"))%15) == 0): #如果两个时间都匹配 

            print ("ALARM ON!!!!!") 

            message1 = " 时间是 " + str(self.alarm_h) + " : " + str(self.alarm_m) + " on " + strftime("%A") 

            message = “先生,早上好……这是您的起床闹钟。” + message1 

            self.label.setText(_translate("MainWindow",message1, None)) #在GUI屏幕上显示  

            消息 espeak.synth (message) #通过音频插孔朗读消息 time.sleep  

            (1)

    def button_pressed(self): #当设置闹钟按钮被按下时 

        print("Button Pressed") 

        alarm_time = str(self.Set_Time.time()) 

        self.alarm_h = int(alarm_time[19:21]) #小时值为存储在索引值 19 和 20 

        self.alarm_m = int (alarm_time[23:25]) #分钟值存储在索引值 23 和 24

        message = "警报设置在 " + str(self.alarm_h) + " hours " + str(self.alarm_m) + " minutes" 

        self.label.setText(_translate("MainWindow", message, None)) #显示GUI 屏幕上  

        的消息 espeak.synth (message) #通过音频插孔说出消息 

if __name__ == "__main__": #main function  

    app = QtGui.QApplication(sys.argv) 

    MainWindow = QtGui.QMainWindow() 

    ui = Ui_MainWindow() 

    ui.setupUi(MainWindow) 

    MainWindow.show() 

    sys.exit(app.执行_())

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/dianzi/2711286.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-17
下一篇 2022-08-17

发表评论

登录后才能评论

评论列表(0条)

保存