基于 Snowboy 实现语音唤醒

Snowboy 是一个可定制的热词检测引擎,可以利用它来实现语音唤醒功能。

环境配置

Snowboy 只能运行在类 unix 系统下,我选择在 Debian 12 系统下安装和运行 Snowboy。首先需要安装一些依赖项:

1
2
sudo apt install build-essential git swig libatlas-base-dev sox -y
sudo apt install portaudio19-dev python3-pyaudio -y

安装

Github 上存在两个 Snowboy 的代码库,一个是 Kitt.ai/Snowboy,在 Kitt.ai 不维护之后,Seasalt.ai/Snowboy 又继续维护了一段时间。

我们首先要把 Snowboy 的代码库拉下来:

1
git clone https://github.com/seasalt-ai/snowboy.git

然后进行编译:

1
2
cd snowboy/swig/Python3
make

之后修复代码中的包引入问题,将 examples/Python3/snowboydecoder.py 文件中的 from . import snowboydetect 修改为 import snowboydetect

运行与问题排除

首先创建 Python 虚拟环境,并安装依赖:

1
2
3
python -m venv venv
source ./venv/bin/activate
pip install pyaudio scipy

官方提供了一些预置的唤醒词模型,位于 resources/models/ 文件夹下。

之后运行 examples/ 文件夹下的 demo.py 文件来进行验证语音唤醒功能:python demo.py resources/models/snowboy.umdl

我在此时时遇到了异常:

1
2
3
Cannot connect to server socket err = No Such file or directory
Cannot connect to server request channel
jack server is not running or cannot be started

这个问题需要安装并启动 JACK Audio Connection Kit:

1
2
sudo apt install jackd2 # 建议安装后重启
jack_control start

之后再次运行 demo.py,当说出唤醒词 snowboy 时程序会播放叮的声音,这样就代表语音唤醒成功了。

自定义唤醒词

如果想训练自己的唤醒词,可以到网站 snowboy.hahack.com 上进行定制,或者基于开源项目 snowboy-seasalt 在 Docker 上自行部署 Web 操作界面。