python之使用snowboy离线语音唤醒

2021/8/7 12:08:13

本文主要是介绍python之使用snowboy离线语音唤醒,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

python之使用snowboy离线语音唤醒

介绍

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 

获取snowboy

使用

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

首先创建一个demo文件夹,

然后把resources文件夹、demo.pysnowboydecoder.pysnowboydetect.py

_snowboydetect.so 复制到该文件夹,还有把训练的模型也复制其中。

在该文件夹下运行以下命令:

python3 demo.py xxx.umdl

Integration

#!/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/



这篇关于python之使用snowboy离线语音唤醒的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程