树莓派语音识别,安装和配置Snowboy进行热词检测

在这个Raspberry Pi Snowboy项目中,详细记录了如何在您的Pi上设置和使用Snowboy来训练和检测自定义热词。

Raspberry-Pi-Snowboy-v1.jpg

请注意,自2021年1月1日起,Snowboy在线服务已无法使用,虽然您仍然可以使用已有的语音模型,但现在无法训练自己的语音模型。本教程将作为档案保存,以备该功能的恢复。另一种选择是Porcupine。然而,这项服务只允许你训练模型,除非你是付费客户。

此外,还将展示如何在 Python 脚本中利用 Snowboy 库进行特定的操作。

要设置 Snowboy 热词检测库,我将引导您完成注册其 API 的过程。还将向您展示如何利用Snowboys的培训服务录制和训练您自己的热词检测模型。还会探讨如何使用Python来利用Snowboy的检测器来使用你的热词模型,并根据听到这个词来做些事情。

最重要的是,你可以将 Snowboy 设置为一个完全headlesss的解决方案,因为它不需要任何图形界面来操作。

如果你喜欢这个项目,那么你可能还想看看我的树莓派Alexa教程和树莓派上的谷歌助手的教程。可以在下面找到如何在树莓 Pi 上设置 Snowboy 的完整教程。

设备清单

以下是完成本篇树莓派Snowboy教程所需的全部设备清单,点击链接可直达特别优惠购买。

建议

可选

为安装Snowboy准备Raspberry Pi的音频配置

1. 在我们开始在树莓派上设置Snowboy热词检测之前,必须首先确保音频配置正确。

通过配置音频驱动来实现。在这之前,必须检索音频输出和麦克风输入的卡和设备号。要查看需要的信息,请按照以下两个步骤进行。

1a. 利用以下命令找到USB麦克风,记下卡号和设备号。

arecord -l

1b. 首先,确定输入设备,利用以下命令,记录下卡号和设备号。

需要注意的是,树莓派的3.5mm接口通常标为模拟或bcm2835 ALSA。HDMI输出标识为bcm2835 IEC958/HDMI。

aplay -l

2. 现在需要配置音频驱动的值,创建.asoundrc文件。

要创建新.asoundrc文件,请在Raspberry Pi上运行以下命令。

nano /home/pi/.asoundrc

3. 在这个文件中,需要输入以下配置。这些将设置音频驱动。

确保用步骤1中检索到的各自的值来代替<card number>和<device number>。

pcm.!default {
  type asym
  capture.pcm "mic"
  playback.pcm "speaker"
}
pcm.mic {
  type plug
  slave {
    pcm "hw:<card number>,<device number>"
  }
}
pcm.speaker {
  type plug
  slave {
    pcm "hw:<card number>,<device number>"
  }
}

4. 有了配置,并进行了修改。按CTRL+X再按Y,最后按ENTER键保存。

安装Snowboy到Raspberry Pi上

1. 在开始给树莓派安装Snowboy热词检测软件之前,首先要确保它的软甲包是完全最新的。

需要在Raspberry Pi上输入以下两个命令。

sudo apt update
sudo apt upgrade

2. 现在Raspberry Pi已经完全更新了,运行下面的命令来安装我们将要依赖的所有依赖项。

这些依赖关系的大部分是增加了pyaudio包,使我们能够与Python的音频进行交互。请注意,虽然我们下载的是Python 3的包,但只要把包名中 “python “后面的3去掉,你也可以下载Python的包。

sudo apt install python3 python3-pyaudio python3-pip libatlas-base-dev portaudio19-dev

3. 从包管理器中安装了所有的依赖包,现在需要安装PortAudio软件的python版本。

在Raspberry Pi上运行以下命令安装PortAudio。

sudo pip3 install pyaudio

4. 最后一个依赖需要安装requests的Python包,在Raspberry Pi上运行下面的命令,使用pip安装它。

这个Python包能让Raspberry Pi与Snowboy的Restful API进行交互,向他们的服务发送热词样本。

sudo pip3 install requests

5. 最后,将Snowboy下载到Raspberry Pi上。请在Raspberry Pi上使用以下命令来获取Raspberry Pi的最新编译版本。

这个版本的Snowboy应该适用于所有当前版本的Raspberry Pi。

wget -O snowboy.tar.bz2 https://go.pimylifeup.com/napoRs/snowboy

6. 现在已经将最新版本的Snowboy软件下载到Raspberry Pi上,运行以下命令来解压它。

请确认你位于Pi用户的主目录中。( /home/pi 或 ~)

tar xvjf snowboy.tar.bz2

7. 现在Snowboy软件已经下载到Raspberry Pi上了,需要重新命名目录,以便于以后处理。

运行以下命令将文件夹重命名为 snowboy。

mv rpi-arm-raspbian-8.0-1.3.0/ snowboy/

获取Snowboy API 密钥

1. 在接下来的教程中,需要一个Snowboy的API密钥。在下面的几个步骤中,带领你完成获取一个密钥的过程。

请注意,Snowboy 网站只支持 OAuth 登录,所以必须有 Github、Facebook 或 Google 账户。

首先进入Snowboy网站,点击页面右上角的 “登录 “按钮,如下图所示。

Step-01-Log-In.png

2. 现在会被要求从三个不同的选项中选择登录到Snowboy服务,对于我的教程,我用的Github账户。

Step-02-Log-In-Options.png

3. 登录后,会看到下面的屏幕,这将列出所有当前计算的热词。不过,要找的是位于右上角的。

点击名字(1.),然后点击 “个人资料设置”(2.),就会到一个显示API密钥的页面。

Step-03-Main-Menu-Find-Profile-Settings.png

4. 最后,在这个屏幕上,需要复制下API令牌,因为在本指南的后面,需要这个来与Snowboy服务器对话。

我在下面的截图中高亮了显示令牌的区域。

Step-04-Get-API-Key.png

记录自定义热词Snowboy

1. 在Raspberry Pi Snowboy教程的这一部分,需要编写一个Python脚本,将热词记录从Raspberry Pi发送到Snowboy服务。

不会对这个脚本进行过多的深入研究,因为它比较简单,只是本教程的一个小台阶。在Raspberry Pi上运行以下命令来创建这个脚本。

nano /home/pi/training_service.py

2. 在该文件中输入以下几行python代码。

记得把ENTER_TOKEN换成你在上一段得到的API令牌,ENTER_HOTWORD换成你要记录的热词,比如 “labno3″。

import sys
import base64
import requests

def get_wave(fname):
    with open(fname,'rb') as infile:
        return base64.b64encode(infile.read())

endpoint = "https://snowboy.kitt.ai/api/v1/train/"

token = "ENTER_TOKEN"
hotword_name = "ENTER_HOTWORD"
language = "en"
age_group = "20_29"
gender = "M"
microphone = "usb microphone"

if __name__ == "__main__":
    try:
        [_, wav1, wav2, wav3, out] = sys.argv
    except ValueError:
        print ("Usage: %s wave_file1 wave_file2 wave_file3 out_model_name" % sys.argv[0])
        sys.exit()

    data = {
        "name": hotword_name,
        "language": language,
        "age_group": age_group,
        "gender": gender,
        "microphone": microphone,
        "token": token,
        "voice_samples": [
            {"wave": get_wave(wav1)},
            {"wave": get_wave(wav2)},
            {"wave": get_wave(wav3)}
        ]
    }

    response = requests.post(endpoint, json=data)
    if response.ok:
        with open(out, "wb") as outfile:
            outfile.write(response.content)
        print ("Saved model to '%s'." % out)
    else:
        print ("Request failed.")
        print (response.text)

3. 写完后,按CTRL + X,然后按Y,然后按ENTER键保存文件。

4. 现在已经写出了Python脚本,可以开始实际录制热词,并发送出去。

利用arecord工具,因为它可以指定特定的选项,如采样率,格式和录音的持续时间。我进行简单的5秒录音。这5秒的时间应该足够记录热词了。运行这些命令来生成3个热词录音,确保你在录音中说一次你的热词。Snowboy软件会用这三段录音建立一个参考文件,这样就可以很方便的听出它的作用。

arecord --format=S16_LE --duration=5 --rate=16000 --file-type=wav 1.wav

arecord --format=S16_LE --duration=5 --rate=16000 --file-type=wav 2.wav

arecord --format=S16_LE --duration=5 --rate=16000 --file-type=wav 3.wav

5. 现在我们已经记录了三个热词样本,可以继续将这些样本发送给Snowboy服务。

这里是在教程前面写的Python脚本将派上用场的地方。需要调用Python文件,引用三段录音和所需的处理样本的输出名称。 python 脚本会处理文件,生成一个 base64 编码版本的文件,将其与一些其他信息捆绑在一起,然后发送给 Snowboy,等待他们的回应。运行以下命令,将三个样本发送到训练服务。

python3 training_service.py 1.wav 2.wav 3.wav saved_model.pmdl

6. 在利用新模型之前,应该把它复制到Snowboy文件夹中,这样方便使用一些。

要复制文件,可以运行以下两个命令。第一条命令会复制模型文件,第二条命令会移动到snowboy目录中。

cp saved_model.pmdl ./snowboy/saved_model.pmdl
cd snowboy

7. 为了测试新模型,利用snowboy附带的demo.py脚本。这个脚本指定要使用的模型。

只需在当前目录下运行以下命令来启动脚本。确保不以sudo的方式运行这个脚本,因为它将导致从麦克风读取的问题,因为我们为pi用户设置了.asoundrc配置文件。

python demo.py saved_model.pmdl

8. 当加载演示Python脚本时,你可能会遇到各种错误信息。大多数错误信息都可以忽略,可以继续使用demo而不会出现任何问题。

如果在命令行中看到错误信息 “IOError: [Errno -9997] Invalid sample rate(无效采样率)”出现在命令行中,请确保你已经按照教程前面的规定正确设置了.asoundrc文件,并且你使用的麦克风可以以16,000 HZ的速度录音。大多数的USB麦克风应该都能满足这个要求。

如果一切都按计划进行,应该会看到命令行中出现以下信息,就可以对它说出你的热词。

Listening... Press Ctrl+C to exit

9. 听到你的热词后,应该看到命令行中出现以下信息,并通过音频听到哔哔声。

这条消息表明,snowboy成功识别了你说的话,并向其回调函数发送消息。

INFO:snowboy:Keyword 1 detected at time: 2018-09-26 04:38:41

10. 在下一节中,探讨如何在一个简单的Python脚本中实现Snowboy,让你了解如何在你的项目中利用它。

在 Python 脚本中使用 Snowboy

1. 对于Snowboy教程的这一部分,将编写一个Python脚本,把Snowboy解码器库加载到模型中,然后监听它。

要开始编写脚本,只需在Raspberry Pi的终端上运行以下命令,调用python脚本 “snowboy_sample.py”。

在 snowboy 文件夹中创建这个文件,否则无法访问 snowboydecoder 类。原因是Pythons的导入功能只搜索python路径和本地目录。

nano /home/pi/snowboy/snowboy_sample.py 

2. 在该文件中输入以下几行代码:

我会解释每行代码的作用。如果你想跳过解释,可以进入下一步,将代码复制为一个块。

import snowboydecoder

这第一行代码导入了snowboydecoder,这样就可以访问它的功能。这个类将处理语音模型并监听它。

def detected_callback():
    print ("Hotword Detected")

这两行定义了我们的回调函数。这个函数很简单,只要调用它,它就会将 “Hotword Detected “的文字打印到命令行。

detector = snowboydecoder.HotwordDetector("saved_model.pmdl", sensitivity=0.5, audio_gain=1)

这一行是最重要的,因为它实例化了热词检测器。在这个函数中,需要传入一些东西。

第一个是语音模型的位置,在我的例子中,这是在同一个目录中,所以可以传入文件名。在我的例子中,这是在同一个目录中,所以可以传递文件名。

下一个参数是灵敏度。这个参数定义了热词被触发的难易程度。该值越接近1,关键词需要的精确度越低。该值越接近0,就越要精确到你的原始录音。如果有太多假阳性或很难触发热词,请增加或减少灵敏度值。

最后一个参数是audio_gain。这个参数决定了应该对输入音量应用多少增益,大于1的值会增加增益,小于1的值会减少增益。如果你在努力让你的麦克风听清你的声音,就用这个值来调试。

detector.start(detected_callback)

最后一行利用在前一行实例化的检测器,告诉它开始监听。

传入我们写的函数名称,因为检测器每次听到你的热词都会自动调用这个函数。这个函数将持续运行,直到终止。

3. 在Python脚本中输入了所有这些行,可以将其与下面的脚本进行比较,确保输入的内容都是正确的。

import snowboydecoder

def detected_callback():
    print ("Hotword Detected")

detector = snowboydecoder.HotwordDetector("saved_model.pmdl", sensitivity=0.5, audio_gain=1)

detector.start(detected_callback)

4. 完成后,按以下键保存文件,CTRL + X,然后按Y,最后按ENTER。

5. 现在我们的脚本已经写好了,可以测试一下它是否正常工作。

需要做的就是在命令行中输入以下一行。

python snowboy_sample.py

6. 现在每当你说出你的热词时,命令行中应该会出现 “Hotword Detected “的文字,因为它会自动调用写的 “detected_callback(): “函数。可以按CTRL + C退出这个脚本。

在你未来可能做的任何项目中,这都是一个强大的工具。可以让Python在听到某个关键词时触发一个任务。

我希望在本教程结束时,你能够使用Snowboy服务记录自己的自定义热词。也希望你已经学会了如何在自己的Pi项目中实现Snowboy来使用自己的自定义热词。如果你对这篇树莓派Snowboy热词检测教程有什么反馈,那么请在下面留言。

平均: 4 / 5. votes: 2

到目前为止还没有投票!成为第一位评论此文章。

欢迎转载,请留下出处链接:Labno3 » 树莓派语音识别,安装和配置Snowboy进行热词检测

赞 (4)

评论

5+1=