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

swig安装不成功:

采用:swig安装

pyaudio 开始播放音乐

sudo aplay test.wav 

获取snowboy

使用

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

首先创建一个demo文件夹,

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

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

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

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/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容