文章目录

  • 环境配置
  • 训练热词
  • 编写测试程序
  • 功能演示
  • 参考资料
  • 视频讲解

环境配置

查看收音设备

arecord -l

查看输出设备

aplay -l

更新系统

sudo apt-get update
sudo apt-get upgrade

编辑 ~/.asoundrc 指定对应的设备

pcm.!default {type asymplayback.pcm {type plugslave.pcm "hw:0,0"}capture.pcm {type plugslave.pcm "hw:1,0"}
}

安装 PortAudio

sudo apt-get install python-pyaudio python3-pyaudio sox

安装 Python 绑定

pip install pyaudio

编译 SnowBoy 新版
官网有树莓派 1、2、3、Zero 的预编译包,不知道 4 能不能用,我尝试自己编译一个试试

sudo apt-get install autotools-dev automake libpcre3 libpcre3-dev libatlas-base-dev byacc
./autogen
./configure
make
sudo make install

训练热词

模型训练可以通过网页录制上传,也可以自己录制编写代码训练。

网页录制上传请访问官网:https://snowboy.kitt.ai/

点击 Create Hotword 就可以了,按照提示来。

我没有选择这种模式,因为我树莓派没有接显示屏不方便使用网页,如果用电脑怕环境不一样,采集样本有区别,主要的是自己想写代码折腾一下:

录制训练样本数据:

arecord bb1.wav

或者,这里根据麦克风指定了波特率

rec -r 16000 b1.wav

编写程序本地训练:

import sys
import base64
import requestsdef get_wave(fname):with open(fname, 'rb') as infile:return base64.b64encode(infile.read())# api 地址
endpoint = "https://snowboy.kitt.ai/api/v1/train/"############# 修改参数 #############
# api 令牌,官网注册申请,必须
token = ""
# 热词,如果未知必须
hotword_name = "笨笨"
# 语言
language = "zh"
# 年龄段 0_9, 10_19, 20_29, 30_39, 40_49, 50_59, 60+
age_group = "40_49"
# 性别 F = female M = Male
gender = "M"
# 麦克类型
microphone = "macbook microphone"
############### END OF MODIFY ##################if __name__ == "__main__":try:# 获取运行参数,三个训练音频和一个输出模型[_, wav1, wav2, wav3, out] = sys.argvexcept ValueError:print("Usage: %s wave_file1 wave_file2 wave_file3 out_model_name" % sys.argv[0])sys.exit()# 训练参数结构data = {"name": hotword_name,"language": language,"age_group": age_group,"gender": gender,"microphone": microphone,"token": token,# 训练数据是三个 wav 格式的录音音频"voice_samples": [{"wave": get_wave(wav1)},{"wave": get_wave(wav2)},{"wave": get_wave(wav3)}]}# 提交训练数据response = requests.post(endpoint, json=data)if response.ok:# 训练成功,保存模型到指定文件with open(out, "wb") as outfile:outfile.write(response.content)print ("Saved model to '%s'." % out)else:print ("Request failed.")print (response.text)

训练样本生成模型:

python3 training.py b1.wav b2.wav b3.wav model.umdl

编写测试程序

from . import snowboydecoder
import sys
import signal
import wave
import os
import pyaudio
import time"""
使用说明:
In [1]: import snowboydecoderIn [2]: def detected_callback():....:     print "hotword detected"....:In [3]: detector = snowboydecoder.HotwordDetector("resources/snowboy.umdl", sensitivity=0.5, audio_gain=1)In [4]: detector.start(detected_callback)
"""TOP_DIR = os.path.dirname(os.path.abspath(__file__))RESOURCE_FILE = os.path.join(TOP_DIR, "resources/common.res")
DETECT_DING = os.path.join(TOP_DIR, "resources/imhere.wav")
DETECT_DONG = os.path.join(TOP_DIR, "resources/dong.wav")interrupted = Falsedef play_audio_file(fname):"""Simple callback function to play a wave file. By default it playsa Ding sound.:param str fname: wave file name:return: None"""ding_wav = wave.open(fname, 'rb')ding_data = ding_wav.readframes(ding_wav.getnframes())audio = pyaudio.PyAudio()stream_out = audio.open(format=audio.get_format_from_width(ding_wav.getsampwidth()),channels=ding_wav.getnchannels(),rate=44100, # ding_wav.getframerate(), input=False, output=True)stream_out.start_stream()stream_out.write(ding_data)time.sleep(0.2)stream_out.stop_stream()stream_out.close()audio.terminate()def detected_callback():print ("hotword detected")play_audio_file(DETECT_DING)# 响应中断信号,设置中断变量为 True
def signal_handler(signal, frame):global interruptedinterrupted = True
# 返回中断状态
def interrupt_callback():global interruptedreturn interrupted# 输入参数处理
if len(sys.argv) == 1:print("Error: need to specify model name")print("Usage: python demo.py your.model")sys.exit(-1)
# 模型文件
model = sys.argv[1]# 初始化中断信号处理
signal.signal(signal.SIGINT, signal_handler)# 实例化热词监测
detector = snowboydecoder.HotwordDetector(model, sensitivity=0.5)
print('Listening... Press Ctrl+C to exit')# 启动实例,开始热词监测
detector.start(detected_callback=detected_callback,interrupt_check=interrupt_callback,sleep_time=0.03)

detector.terminate()

因为麦克风的采样率问题,需要修改 snowboydecoder.py 的采样率,大约在115 行

self.stream_in = self.audio.open(input=True, output=False,format=self.audio.get_format_from_width(self.detector.BitsPerSample() / 8),channels=self.detector.NumChannels(),rate=44100, #self.detector.SampleRate(),frames_per_buffer=2048,stream_callback=audio_callback)

功能演示

需要注意的是 python3 的相对引用问题

python demo.py model.umdl
python3 -m Python3.demo Python3/model.umdl
python3 -m Python3.demo5 Python3/model.umdl

参考资料

pocketsphinx snowboy

  • 唤醒词的科普研究 —— https://www.leiphone.com/news/201801/6a8FrmvHBf2Zmika.html?uniqueCode=9E2L1pCktaUeHu6G

https://github.com/wanleg/snowboyPi

https://pimylifeup.com/raspberry-pi-snowboy/

https://snowboy.kitt.ai/docspartials/docs/index.html#access-microphone

http://docs.kitt.ai/snowboy/

视频讲解

使用树莓派 4 和 SnowBoy 实现热词唤醒

树莓派4 使用 SnowBoy 搭建热词唤醒相关推荐

  1. 用MindStudio完成基于CTC算法的语音热词唤醒

    Bilibili视频链接: 使用MindStudio完成基于CTC算法的语音热词唤醒_哔哩哔哩_bilibili 一. MindStudio 介绍与安装 相关课程:昇腾全流程开发工具链(MindStu ...

  2. 安卓实例04-5:使用开源项目Snowboy为讯飞语音助手添加热词唤醒功能(成功)(有视频演示)

    B站视频演示: [语音助手]Snowboy热词检测+讯飞语音识别=钢铁侠的贾维斯 前置文章1:安卓实例04:讯飞语音识别语音听写sdk的编译和排错过程(已成功) 前置文章2:安卓实例04-2:精简讯飞 ...

  3. 树莓派+双麦克风扩展板实现snowboy热词唤醒(避坑排雷)

    硬件准备: 树莓派4b x1 树莓派双麦克风扩展板(或者4mics 8mics都可以) x1 任意一个支持树莓派的音频输出设备(3.5mm孔的 或者一些蓝牙设备) 本文最终要实现的就是对着麦克说你的唤 ...

  4. 语音识别热词_出门问问 TWS 耳机语音交互解决方案

    随着芯片.算法商在技术及应用方面的演进,尤其是连接.降噪方向的重大突破,越来越多的手机及耳机厂商推出了自家功能丰富.交互舒适的 TWS 耳机. 近日,出门问问新品发布会上推出的 TicPods 2 系 ...

  5. 出门问问:使用 TensorFlow Lite 在嵌入式端部署热词检测模型

    文 / 出门问问信息科技有限公司 来源 | TensorFlow 公众号 1.背景 热词唤醒 (Keyword Spotting) 往往是用户对语音交互体验的第一印象,要做到准确快速.因此热词检测算法 ...

  6. Android Wear 唤醒热词会比“你好,安卓”好吗?

    随着Motorola 在发布搭载了Android Wear 操作系统的智能手表 Moto 360 二代中国版手表,Android Wear正式进入中国大陆,因为一些原因,其最核心的语音搜索功能破天荒地 ...

  7. “赶上热词热概念,是我们不幸的一面” | 对话小冰公司CEO李笛

    金磊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 小冰的很多进展,往往只能借用科幻电影才能更好解释. <Her>中描绘过一个如影随形的专属AI虚拟人,跟主人公聊天聊地,从诗词歌赋 ...

  8. 一个热词推荐的简单实现

    2019独角兽企业重金招聘Python工程师标准>>> 为什么想做这个东西 一直好奇像亚马逊这类网站的搜索是如何做到推荐的,最近刚好看到一篇文章:Redis 与搜索热词推荐,然而只写 ...

  9. kafka jar包_Windows环境下Flink消费Kafka实现热词统计

    前言碎语 昨天博主写了<windows环境下flink入门demo实例>实现了官方提供的最简单的单词计数功能,今天升级下,将数据源从socket流换成生产级的消息队列kafka来完成一样的 ...

最新文章

  1. Servlert接口的doGet()、doPst()方法
  2. 在LINUX中部署NIS服务器
  3. 第六周项目四-静态成员应用
  4. 技术开发中一些名词解释
  5. angular cli 切换 css_漫谈 Angular 定制主题的四种方式
  6. infomix数据库版本sql_数据库周刊31丨华为openGauss 正式开源;7月数据库排行榜发布...
  7. 儿童节礼包!10 后都开始学编程了,你需要这个阿里技术电子书大全
  8. 源哥每日一题第十三弹 百练4124:海贼王之伟大航路 状压dp
  9. wpsa3版面怎么变成a4、排版不变_毕业论文排版攻略
  10. 高并发场景下的缓存 + 数据库双写不一致问题分析与解决方案设计
  11. 染整色差技术分析大全
  12. 【DFS笔记】对dfs(index,状态)一类问题的思考
  13. 5.企业应用架构模式 --- 并发
  14. SylixOS 内存管理源代码分析--vmmMalloc.c
  15. 在Covid-19期间测量社交距离
  16. 01 LeNet-5论文笔记-Gradient-Based Learning Applied to Document Recognition
  17. AutoCAD .Net 创建椭圆Ellipse
  18. 发布博客支持关闭图片水印啦【CSDN产品周报第10期】
  19. Dubbo 常见的负载均衡(Load Balance)算法,一起学习一下吧~
  20. (41.1)【JWT-KID漏洞】KID之目录遍历、命令注入、SQL注入

热门文章

  1. IOS开发入门之二——第一个App
  2. web入门 命令执行 web29-web41
  3. 格式化时间戳,时间加一天
  4. Java招聘的一些心得和建议
  5. IDEA jjsp 404_IDEA 卡住buid(编译)不动的解决办法_java
  6. Unity3D播放音频数组的问题
  7. for await of使用
  8. 青椒跳槽三线高校后,副教授变教授、140平房子到手、老婆入编...
  9. cpu设计和实现(流水线暂停)
  10. qq分享提示设备未授权_友盟微信、QQ等分享提示未验证应用配置