当前位置:   article > 正文

python之使用snowboy离线语音唤醒_python 语音唤醒

python 语音唤醒

python之使用snowboy离线语音唤醒

介绍

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

swig安装不成功:

采用:swig安装

pyaudio 开始播放音乐

sudo aplay test.wav 
  • 1

获取snowboy

使用

git clone https://github.com/Kitt-AI/snowboy.git
  • 1

git clone https://gitee.com/william_william/snowboy.git
  • 1

测试使用

首先使用命令

cd ../../swig/Python3 && make
  • 1

获取对应该系统的_snowboydetect.so,不是一个系统的直接copy会报错的。


打开snowboydecoder.py 文件,将代码 from * import snowboydetect 改为 import snowboydetect 即可。

进入目录 snowboy/examples/Python3 并运行以下命令:

python3 demo.py resources/models/snowboy.umdl
  • 1

创建一个demo

首先创建一个demo文件夹,

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

_snowboydetect.so (_snowboydetect.so 在swig/Python3的目录下) 复制到该文件夹,还有把训练的模型也复制其中。

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

python3 demo.py xxx.umdl
  • 1

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()



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83

使用第二个类的可以把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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

训练语音模型

https://snowboy.hahack.com/

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号