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

音视频及家电

734人已加入

描述

  “早上好。现在是早上 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,你会得到这个屏幕。

python

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

python

  准备好 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。一切设置好并启动程序后,我的设置如下所示。

python

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

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

python

  它显示当前时间,还提供一个文本框来设置闹钟。使用触控笔设置闹钟时间并按下设置闹钟按钮。这将为您提供一条语音消息,说明已设置警报。现在只需等待 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.执行_())

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分