snowboy 是一个开源的、轻量级语音唤醒引擎,比较好用。
训练语音模型网址:
训练语音
开发环境为: 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
pyaudio 播放音乐
sudo aplay test.wav
使用
git clone https://github.com/Kitt-AI/snowboy.git
或
git clone https://gitee.com/william_william/snowboy.git
打开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
复制到该文件夹,还有把训练的模型也复制其中。
在该文件夹下运行以下命令:
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/