snowboy 是一个开源的、轻量级语音唤醒引擎,比较好用。
训练语音模型网址:
https://snowboy.hahack.com/
开发环境为: ubuntu 21.04
sudo apt-get install alsa-base
sudo apt-get install alsa-utils
sudo apt-get install libasound2-dev
sudo apt-get install pulseaudio
sudo apt-get install swig
sudo apt-get install libatlas-base-dev
sudo apt-get install pyaudio
sudo apt-get install sox
swig安装不成功:
采用:swig安装
pyaudio 开始播放音乐
sudo aplay test.wav
使用
git clone https://github.com/Kitt-AI/snowboy.git
或
git clone https://gitee.com/william_william/snowboy.git
首先使用命令
cd ../../swig/Python3 && make
获取对应该系统的_snowboydetect.so
,不是一个系统的直接copy会报错的。
打开snowboydecoder.py
文件,将代码 from * import snowboydetect
改为 import snowboydetect
即可。
进入目录 snowboy/examples/Python3 并运行以下命令:
python3 demo.py resources/models/snowboy.umdl
首先创建一个demo文件夹,
然后把resources
文件夹、demo.py
、 snowboydecoder.py
、snowboydetect.py
_snowboydetect.so
(_snowboydetect.so 在swig/Python3的目录下) 复制到该文件夹,还有把训练的模型也复制其中。
在该文件夹下运行以下命令:
python3 demo.py xxx.umdl
#!/bin/python3
# 直接 唤醒 并且执行某个函数
import snowboydecoder
import sys
import signal
import os
import subprocess as sub
# 执行 bash 类
# pip3 install subprocess
class Run():
# 初始化 参数;args 为数组 ['python3','xx.py']
def __init__(self,args,
shell=True,encoding="utf-8"):
self.args = args
self.shell = shell
self.encoding =encoding
# 处理 args 为一个字符串
def Handle(self):
arg = ''
for item in self.args:
arg += item +' '
return arg
# 执行 命令行
def run(self):
res = self.Handle()
res = sub.run(
res,
shell=self.shell,
encoding=self.encoding
)
# 方便以后对其进行操作
return res
# 第二种: 不使用demo,直接对demo进行再封装;只需要填写model的文件名即可
class Rundev():
def __init__(self,model,sensitivity=0.5,sleep_time=0.03):
# 外置参数
self.model = model
self.sensitivity = sensitivity
self.sleep_time = sleep_time
#内置参数
self.interrupted = False
def interrupt_callback(self):
return self.interrupted
def signal_handler(self,signal, frame):
self.interrupted = True
def run(self):
print('正在监听中.........','按 Ctrl+C 停止运行')
# capture SIGINT signal, e.g., Ctrl+C
signal.signal(signal.SIGINT, self.signal_handler)
detector = snowboydecoder.HotwordDetector(
self.model,
sensitivity =self.sensitivity)
# main loop
detector.start(detected_callback=snowboydecoder.play_audio_file,
interrupt_check=self.interrupt_callback,
sleep_time=self.sleep_time)
# 使终止
detector.terminate()
# 测试
if __name__ == "__main__":
# os.getcwd()获取当前工作路径
args = [
'python3',
os.getcwd()+"/python/snowBoyDemo/demo.py",
os.getcwd()+"/python/snowBoyDemo/xiaoai.pmdl"
]
# dev = Run(args=args)
# dev.run()
dev = Rundev(os.getcwd()+"/python/snowBoyDemo/xiaoai.pmdl")
dev.run()
使用第二个类的可以把demo.py删除了。
成功后:
如果想添加一些唤醒后的操作,打开snowboydecoder.py,第208行:
可以修改这里 这里是被唤醒之后运行的方法
#small state machine to handle recording of phrase after keyword
if state == "PASSIVE":
if status > 0: #key word found
self.recordedData = []
self.recordedData.append(data)
silentCount = 0
recordingCount = 0
message = "Keyword " + str(status) + " detected at time: "
message += time.strftime("%Y-%m-%d %H:%M:%S",
time.localtime(time.time()))
logger.info(message)
print("执行一个测试")
callback = detected_callback[status-1]
if callback is not None:
callback()
if audio_recorder_callback is not None:
state = "ACTIVE"
continue
https://snowboy.hahack.com/