在这个Raspberry Pi Snowboy项目中,详细记录了如何在您的Pi上设置和使用Snowboy来训练和检测自定义热词。
请注意,自2021年1月1日起,Snowboy在线服务已无法使用,虽然您仍然可以使用已有的语音模型,但现在无法训练自己的语音模型。本教程将作为档案保存,以备该功能的恢复。另一种选择是Porcupine。然而,这项服务只允许你训练模型,除非你是付费客户。
此外,还将展示如何在 Python 脚本中利用 Snowboy 库进行特定的操作。
要设置 Snowboy 热词检测库,我将引导您完成注册其 API 的过程。还将向您展示如何利用Snowboys的培训服务录制和训练您自己的热词检测模型。还会探讨如何使用Python来利用Snowboy的检测器来使用你的热词模型,并根据听到这个词来做些事情。
最重要的是,你可以将 Snowboy 设置为一个完全headlesss的解决方案,因为它不需要任何图形界面来操作。
如果你喜欢这个项目,那么你可能还想看看我的树莓派Alexa教程和树莓派上的谷歌助手的教程。可以在下面找到如何在树莓 Pi 上设置 Snowboy 的完整教程。
设备清单
以下是完成本篇树莓派Snowboy教程所需的全部设备清单,点击链接可直达特别优惠购买。
建议
- ? 树莓派
- ? 高速SD卡
- ? 树莓派4B电源
- ? 以太网线或Wifi
- USB麦克风
- 扬声器
可选
为安装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网站,点击页面右上角的 “登录 “按钮,如下图所示。
2. 现在会被要求从三个不同的选项中选择登录到Snowboy服务,对于我的教程,我用的Github账户。
3. 登录后,会看到下面的屏幕,这将列出所有当前计算的热词。不过,要找的是位于右上角的。
点击名字(1.),然后点击 “个人资料设置”(2.),就会到一个显示API密钥的页面。
4. 最后,在这个屏幕上,需要复制下API令牌,因为在本指南的后面,需要这个来与Snowboy服务器对话。
我在下面的截图中高亮了显示令牌的区域。
记录自定义热词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热词检测教程有什么反馈,那么请在下面留言。
欢迎转载,请留下出处链接:Labno3 » 树莓派语音识别,安装和配置Snowboy进行热词检测