安装 Picovoice 将树莓派打造成个人语音助手

在本指南中,您将学习如何在树莓派上设置豪猪 Picovoice 以启用唤醒字检测。

豪猪是 Picovoice 团队开发的唤醒单词检测引擎。

热门单词 / 唤醒单词检测是用来侦听关键字,然后为可能的更多操作准备程序的工具。

Google Assistant 和 Alexa 都使用了这些功能。例如,当您说”** Alexa **” 时,它将唤醒设备并告诉它监听您的命令。

热门单词检测引擎的难点在于,在不断监听该关键字的同时,利用它的处理能力很小。

在我们的教程中,我们向您展示如何使用 Porcupine 来实现唤醒词部分。这样,当您说一个特定的单词时,您就可以采取行动。

豪猪的设计高度精确,同时又轻巧,这是我们树莓派的完美组合。

豪猪的最大缺点之一是,如果没有企业许可,它将不允许您为树莓派创建热词。

相反,您将不得不依赖内置的唤醒词,例如”** americano “,” blueberry “,” bumblebee “,” grapefruit “,” grasshopper “,”** picovoice “,”** 豪猪 “和” 终结者 “。

设备

以下是完成在树莓派上安装 Porcupine 的本教程所需的设备的完整列表。

推荐的

  • 树莓派

  • Micro SD 卡

  • Ethernet Cord 或 * Wi-Fi dongle (树莓派 3 和较新的内置 Wi -Fi)

  • 电源

  • USB 麦克风

  • 发言人

可选的

  • 树莓派外壳

  • USB 键盘

  • USB 鼠标

我们在运行最新版本的树莓派 OS Lite 版本 (Buster 版本) 的树莓派 4 上测试了本教程。

为豪猪准备树莓派的音频配置

在本节中,我们将在树莓派上设置音频配置。这样做将有助于豪猪唤醒单词检测选择合适的设备来使用。

1 首先,我们获取麦克风的卡号和设备号。

为此,我们需要使用以下命令。

记录-l

通过此命令,您将获得响应,如下所示。确保记下麦克风的卡号和设备号。

****捕获硬件设备列表****
卡 2 :麦克风[Yeti立体声麦克风],设备 0 :USB音频[USB音频]
  子设备:1/1
  子设备#0​​:子设备#0

2 尽管本教程不需要,但我们还应该检索音频输出的设备和卡号。

要为音频输出检索这些数字,请输入以下命令。

播放-l

以下是您将从此命令获得的输出示例。记下您想要的输出的卡号和设备号。

****播放硬件设备列表****
卡 0 :b1 [bcm2835 HDMI 1],设备 0 :bcm2835 HDMI 1 [bcm2835 HDMI 1]
  子设备:4/4
  子设备#0​​:子设备#0
  子设备 1 :子设备 1 
  子设备 2 :子设备 2 
  子设备 3 :子设备 3 
卡 1 :耳机[bcm2835耳机],设备 0 :bcm2835耳机[bcm2835耳机]
  子设备:4/4
  子设备#0​​:子设备#0
  子设备 1 :子设备 1 
  子设备 2 :子设备 2 
  子设备 3 :子设备 3 

请注意,树莓派的 ** 3.5mm 插孔 ** 将被标记为” 模拟”,”bcm2835 ALSA” 或”bcm385 耳机”。

HDMI 输出应标识为”bcm2835 IEC958/HDMI”。

3 一旦掌握了所有值,我们就可以修改 ALSA 配置文件。

运行以下命令开始在 Pi 用户的主目录中创建.asoundrc 文件。

vim /home/pi/.asoundrc

4 在此文件中,我们需要输入以下行。这些行将设置我们的音频驱动程序,并帮助其知道应该与之交互的设备。

在此代码中,请确保将”<卡号>” 和”< 设备号 >” 替换为您在步骤 1 ** 和步骤 2 ** 中获得的值。

pcm。!默认{
  类型不对称
  capture.pcm"麦克风"
  playing.pcm"扬声器"
}
pcm.mic {
  型插头
  奴隶 {
    pcm"硬件:<卡号>,<设备号>"
  }
}
pcm.speaker {
  型插头
  奴隶 {pcm"hw:<卡号>,<设备号>"}
}

5 输入完毕后,请按 CTRL + X,然后按 Y ,最后按 ENTER 保存。

安装豪猪唤醒词检测库

在本节中,我们将向您展示如何将 Porcupine Python 库安装到您的树莓派上并验证其是否正常运行。

1 在将 Porcupine 安装到我们的树莓派之前,我们需要确保所有内容都是最新的。

要更新操作系统,请运行以下两个命令。

sudo apt update
sudo apt full-upgrade

2 接下来,让我们安装运行 Porcupine 软件所需的软件包。

这些软件包主要包括 Python 和端口音频库。

通过运行以下命令来安装我们需要的软件包。

sudo apt install python3  python3-pip python3-all-dev python3-pyaudio portaudio19-dev libsndfile1

3 现在,让我们使用 Python 包管理器下载豪猪库。

运行以下命令以安装该库。

sudo pip3安装 pvporcupine 

请注意,此过程可能需要一些时间,因为该软件依赖许多软件包。

4 现在,我们通过运行以下命令来测试豪猪唤醒单词引擎是否正常工作。

pvporcupine_mic-关键字豪猪

运行此命令将运行豪猪引擎。现在您只需要说” 豪猪 “这个词。

一旦检测到已说出此关键字,您将看到以下文本出现在命令行中。

检测到的关键字

此响应表明豪猪软件已成功收听了您的麦克风并检测到关键字。

在 Python 中使用豪猪

在本节中,我们将向您展示如何在树莓派上的 Python 中使用豪猪热字检测库。

正如您将很快看到的那样,这是一个使用起来相当简单的库,您只需几行代码就可以实现唤醒字检测。

如果您想在完成本指南后了解更多信息,请务必查看我们的 Python 指南

1 首先,我们在主目录中创建一个名为”pimylifeup_voicedetector.py“的新 Python 。

通过运行以下命令开始编写此脚本。

vim pimylifeup _voicedetector.py

2 在此文件中,输入以下代码行。

输入代码后,我们将解释代码各部分的功能。

A 我们应该添加到此文件中的第一件事是”shebang”。

#!/usr/bin/env python3

此行有助于告诉操作系统它需要使用 Python 3 解释器来解释我们的脚本。

B 要开始此代码,我们需要导入将依赖的包。

这些软件包中的每一个对于我们将在树莓派上运行的唤醒词检测脚本都很重要。

导入结构
导入 pyaudio 
进口 pvporcupine 

我们导入的第一个包 struct 用于将我们的音频输入打包成 Porcupine 期望的东西。

我们的第二个导入文件”pyaudio” 使我们能够从连接到树莓派的麦克风创建音频流,并将其输入到豪猪检测引擎中。

最终导入是我们最重要的导入之一。 pvporcupine 库允许我们与 Porcupine 软件进行交互,以实时侦听热门单词检测。

C 下一步是创建一些变量来存储豪猪,PyAudio 以及由 PyAudio 创建的音频流的句柄。

豪猪=无
pa =无
audio_stream =无

我们这样做是为了如果脚本出现问题或被终止,我们可以干净地关闭所有内容。

D 接下来,我们需要以 try 语句开始以下部分。

尝试:

以下所有部分都需要稍微缩进。如果有某种原因导致脚本终止或崩溃,则使用 try 语句可以使我们彻底摆脱困境。

E 在我们完成所有导入后,我们现在可以为豪猪库创建豪猪了。

    豪猪= pvporcupine.create(关键字= ["picovoice","蓝莓"])

这个.create() 函数为豪猪唤醒词检测库创建一个句柄,我们可以将音频输入到该库中。

在此调用中,我们可以指定要监听的关键字。

由于我们坚持使用 Picovoice 提供的功能,因此它必须是以下之一:”** americano “,” blueberry “,” bumblebee “,” grapefruit * *”,”** grasshopper “,” picovoice “,”** 豪猪 “和” 终结者 “。

对于我们的示例,我们将指定关键字”** picovoice “和” blueberry **”。

现在是个很好的时机,请注意豪猪完全有能力侦听多个关键字。

如果您想听所有可能的关键字,则可以改用 keywords = pvporcupine.KEYWORDSF 在下一行,我们需要使用 pyaudio 创建一个句柄,该句柄将使我们能够与 PortAudio 进行交互。
pa = pyaudio.PyAudio()

我们将 PyAudio 库提供的句柄存储在我们的 pa 变量中,并使用它来监听麦克风。

G 我们通过打开音频流,立即将 PyAudio 提供的手柄放置到可以使用的位置。

    audio_stream = pa.open(
                    rate = porcupine.sample_rate,
                    频道= 1,
                    格式= pyaudio.paInt16,
                    输入=真,
                    frames_per_buffer = porcupine.frame_length)

为了创建此音频流,我们提供了 Porcupine 库提供给我们的一些信息。

我们将采样率设为豪猪手柄提供给我们的采样率。

我们还将每个缓冲区的帧数设置为 Porcupine 软件期望的数量。该值通常为 512 帧。

除此之外,还有其他一些要传递给我们正在打开的音频流的内容。我们将通道强制设为 ** 1 ,将其设置为期望输入,然后将音频格式设置为” short **”(INT16)。

H 现在,我们已经准备好音频流并创建了豪猪唤醒词检测库的句柄,我们需要开始一个无限循环。

    而 True :

我们需要在 Python 中创建无限循环的方法是,先使用 while 循环,再使用 True 。由于该值永远为 true ,因此循环将一直运行,直到强制终止脚本为止。

请记住,以下各节将全部缩进,因为它们属于我们的循环。

I 每次循环时,我们都需要从音频流中读取一些数据。

        pcm = audio_stream.read(porcupine.frame_length)
        pcm = struct.unpack_from("h"* porcupine.frame_length,pcm)

我们使用之前创建的音频流从麦克风读取输入,并指定豪猪提供的帧长。

收到音频数据后,我们便使用 unpack_from 函数将音频数据解包为唤醒词检测引擎所期望的内容。

我们将这些结果值存储到我们的 pcm 变量中。

J 在此阶段,我们可以获取豪猪唤醒词检测功能,以处理刚抓取的音频流。

        keyword_index =豪猪过程(pcm)

我们需要利用 Porcupine 句柄中的.process() 函数,并传入存储在 pcm 变量中的音频数据。

如果定义了多个关键字,则此函数将返回检测到的关键字的索引。该索引基于数组或输入文件的顺序,第一个关键字为索引 0 。

如果您只定义了一个关键字,那么如果检测到此函数,则将返回”True”。

如果未检测到关键字,则豪猪过程函数将返回 - 1

我们将此值存储到我们的 keyword_index 变量中。

K 接下来,我们终于可以检查是否检测到我们的关键字。

        如果 keyword _index> = 0:
            打印("检测到热门字词")

如果唤醒字处理器将大于或等于 0 的值返回,则可以认为已检测到我们的热字。

在我们的示例中,如果满足正确的条件,我们将打印文本” 检测到 Hotword “。

L 现在我们已经完成了代码的编写,现在需要以”finally:” 语句结束它。

最后:

通过在”try” 之后使用”finally”,我们将能够运行一些清理我们创建的所有手柄的东西。

即使 try 中的某些事件导致 Python 脚本崩溃,也应触发这些语句。

M 我们在 final 语句中要做的第一件事是清理 Porcupine 库。

这部分特别重要,因为豪猪库不依赖垃圾收集器。

    如果豪猪不是"无":
        porcupine.delete()

您将看到,在清理豪猪之前,我们首先要确保其变量” 豪猪” 仍未设置为” 无”。

如果将其设置为”None”,则意味着从未创建过该句柄,而运行.delete () 函数将导致另一次崩溃。

否。接下来,我们需要确保关闭音频流。

    如果 audio _stream不为 None :
        audio_stream.close()

与我们的” 豪猪” 句柄一样,我们需要确保”audio_stream” 仍未设置为其默认值。

如果设置了某些内容,我们在流上调用.close() 函数将其清理并停止与麦克风的连接。

O 我们要做的最后一件事是检查我们的 PyAudio 句柄。

    如果 pa 不为 None :
            pa.terminate()

同样,我们仅尝试清理已为其分配了值的手柄。在这种情况下,我们需要使用 PyAudios 的.terminate () 函数来清理它。

3 如果您正确输入了所有内容,则应该以以下代码结束。

#!/usr/bin/env python3
导入结构进口 pyaudio 进口 pvporcupine 

豪猪=无
pa =无
audio_stream =无

尝试:
    豪猪= pvporcupine.create(关键字= ["picovoice","蓝莓"])

    pa = pyaudio.PyAudio()

    audio_stream = pa.open(
                    rate = porcupine.sample_rate,
                    频道= 1,
                    格式= pyaudio.paInt16,
                    输入=真,
                    frames_per_buffer = porcupine.frame_length)

    而 True :
        pcm = audio_stream.read(porcupine.frame_length)
        pcm = struct.unpack_from("h"* porcupine.frame_length,pcm)

        keyword_index =豪猪过程(pcm)

        如果 keyword _index> = 0:
            打印("检测到热门字词")
最后:
    如果豪猪不是"无":
        porcupine.delete()

    如果 audio _stream不为 None :
        audio_stream.close()

    如果 pa 不为 None :
            pa.terminate()

4 如果所有代码看起来都正确,则可以按 CTRL + X,再按 Y ,然后按 ENTER 保存文件。

5 编写脚本后,我们现在可以对其进行测试以查看其是否正常运行。

为此,我们要做的就是使用”python3”,后跟我们的脚本名称”pimylifeup_voicedetector.py”。

pimylifeup_voicedetector.py

5 每次您提到一个定义的唤醒词时,脚本都会运行,您应该看到以下文本出现。

检测到热门字词

如果您完全按照我们的教程进行操作,则这些关键字应为”`picovoice” 或”blueberry”。

希望在本教程的这一阶段,您将对如何在树莓派上使用豪猪唤醒单词引擎有深入的了解。

如果您在使用本指南时遇到任何问题,请在下面发表评论。

请确保查看我们展示的其他一些酷树莓派项目

分享到