【语音智能管家】之语音唤醒(附演示视频)

article/2025/9/13 2:52:47

目录

一.语音唤醒引擎(snowboy)

1.获取源代码并编译

2.自定义自己的唤醒词(唤醒词:小贝)

3.测试

二、自定义响应

三、实现了智能语音音响--听音乐

后续延伸


加群获取学习资料QQ群:901381280

 

我设计的语音智能管家是部署在树莓派上的,所以现在先列一下大概的硬件:

  • 树莓派4b+ x1
  • 麦克风
  • usb声卡
  • u任意一个支持树莓派的音频输出设备(3.5mm孔的 或者一些蓝牙设备)

 

usb声卡

树莓派4b+

 

备注:树莓派上面那个是摄像头(后面视频监控和人脸识别会用到,所以就安上了)

 

ok,进入正题,开始干货

 

一.语音唤醒引擎(snowboy)

这里我选择使用开源的snowboy开源引擎(好处:免费,还可以自定义唤醒词:比如我自定义的唤醒词是:小贝)

snowboy 是一个开源的、轻量级语音唤醒引擎,可以通过它很轻松地创建属于自己的类似“hey, Siri” 的唤醒词。它的主要特性如下:

  • 高度可定制性。可自由创建和训练属于自己的唤醒词
  • 始终倾听。可离线使用,无需联网,保护隐私。精确度高,低延迟
  • 轻量可嵌入。耗费资源非常低(单核 700MHz 树莓派只占用 10% CPU)
  • 开源跨平台。开放源代码,支持多种操作系统和硬件平台,可绑定多种编程语言

接下来开始如何使用snowboy以及怎么部署到树莓派。

 

1.获取源代码并编译

安装依赖

树莓派原生的音频设备是不支持语音输入的(无法录音),需要在网上购买一支免驱动的USB音频驱动(便携式的和 U 盘差不多),一般插上即可直接使用。
建议安装下 pulseaudio 软件,减少音频配置的步骤:

$ sudo apt-get install pulseaudio

安装 sox 软件测试录音与播放功能:

$ sudo apt-get install sox

安装完成后运行 sox -d -d 命令,对着麦克风说话,确认可以听到自己的声音。

安装其他软件依赖

安装 PyAudio:$ sudo apt-get install python3-pyaudio
安装 SWIG(>3.0.10):$ sudo apt-get install swig
安装 ATLAS:$ sudo apt-get install libatlas-base-dev

编译源代码

获取源代码:

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

PS官方源代码使用 Python3 测试有报错,经测试需修改

snowboy/examples/Python3

目录下的 snowboydecoder.py 文件。
将第 5 行代码 from * import snowboydetect 改为 import snowboydetect 即可直接运行。


备注:网上很多教程是make之后再修改,这种情况是不成功的,因为make后会生成配置文件,你这时候改了不起效果,因此先修改,在执行下一步的make。


编译 Python3 绑定:

$ cd snowboy/swig/Python3 && make

测试
进入官方示例目录 snowboy/examples/Python3 并运行以下命令:

$ python3 demo.py resources/models/snowboy.umdl


( 命令中的 snowboy.umdl 文件即语音识别模型

然后对着麦克风清晰地讲出snowboy,如果可以听到“滴”的声音,则安装配置成功。命令行输出如下:

2.自定义自己的唤醒词(唤醒词:小贝)

可将包含自定义唤醒词的音频文件上传至 snowboy 官网:https://snowboy.kitt.ai/dashboard(需要登录),以训练生成自己喜欢的语音模型
需要上传的音频文件数量为 3 个,wav 格式。我试过直接在线录制,貌似有 Bug ,这里建议大家录制好wav音频上传录唤醒词

 

训练完成并测试通过后,即可下载 PMDL 后缀的模型文件了。

 

3.测试

将以下文件复制到自己的项目目录下(snowboy/examples/Python3 目录下的 demo.pysnowboydecoder.pysnowboydetect.py 文件以及 resources 目录):

  • 在项目目录下执行 
  • $ python3 demo.py  小贝.pmdl 

     

  • 并使用自己的唤醒词进行测试

 

二、自定义响应

官方提供的示例 demo.py 文件的源代码如下:

import snowboydecoder
import sys
import signalinterrupted = Falsedef signal_handler(signal, frame):global interruptedinterrupted = Truedef interrupt_callback():global interruptedreturn interruptedif 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]# capture SIGINT signal, e.g., Ctrl+C
signal.signal(signal.SIGINT, signal_handler)detector = snowboydecoder.HotwordDetector(model, sensitivity=0.5)
print('Listening... Press Ctrl+C to exit')# main loop
detector.start(detected_callback=snowboydecoder.play_audio_file,interrupt_check=interrupt_callback,sleep_time=0.03)detector.terminate()

通过唤醒词可以听到ding的一声,但是我想通过唤醒词唤醒后,能够进行回应。因此我自定义了回应操作,比如回应:哎,我在或者我来啦

在回调函数这里,我自定义了回调函数callbacks

# 修改回调函数可实现我们想要的功能detector.start(detected_callback=callbacks,  # 自定义回调函数interrupt_check=interrupt_callback,sleep_time=0.03)

callbacks:

# 回调函数,语音识别在这里实现,修改也是在这里
def callbacks():global detectortime.sleep(0.2)your_text=['哎,我在','我来啦']a=random.randint(0,1)#############################文字转语音,并保存result.wavtowav(your_text[a])print(your_text[a])#欢迎词play("result.wav")

为了是通过语音来回复,所以这里我接入了百度AI的语音合成,通过文字转语音的功能,将欢迎词:哎,我在或者我来啦转为音频再播放出来。

下面是语音合成的代码:

# coding=utf-8
import sys
import jsonIS_PY3 = sys.version_info.major == 3
if IS_PY3:from urllib.request import urlopenfrom urllib.request import Requestfrom urllib.error import URLErrorfrom urllib.parse import urlencodefrom urllib.parse import quote_plus
else:import urllib2from urllib import quote_plusfrom urllib2 import urlopenfrom urllib2 import Requestfrom urllib2 import URLErrorfrom urllib import urlencodeAPI_KEY = '自己的API_KEY'
SECRET_KEY = '自己的SECRET_KEY 'TEXT = "你好,我在"# 发音人选择, 基础音库:0为度小美,1为度小宇,3为度逍遥,4为度丫丫,
# 精品音库:5为度小娇,103为度米朵,106为度博文,110为度小童,111为度小萌,默认为度小美
PER = 4
# 语速,取值0-15,默认为5中语速
SPD = 5
# 音调,取值0-15,默认为5中语调
PIT = 5
# 音量,取值0-9,默认为5中音量
VOL = 5
# 下载的文件格式, 3:mp3(default) 4: pcm-16k 5: pcm-8k 6. wav
AUE = 3FORMATS = {3: "mp3", 4: "pcm", 5: "pcm", 6: "wav"}
FORMAT = FORMATS[AUE]CUID = "123456PYTHON"TTS_URL = 'http://tsn.baidu.com/text2audio'class DemoError(Exception):pass"""  TOKEN start """TOKEN_URL = 'http://openapi.baidu.com/oauth/2.0/token'
SCOPE = 'audio_tts_post'  # 有此scope表示有tts能力,没有请在网页里勾选def fetch_token():print("fetch token begin")params = {'grant_type': 'client_credentials','client_id': API_KEY,'client_secret': SECRET_KEY}post_data = urlencode(params)if (IS_PY3):post_data = post_data.encode('utf-8')req = Request(TOKEN_URL, post_data)try:f = urlopen(req, timeout=5)result_str = f.read()except URLError as err:print('token http response http code : ' + str(err.code))result_str = err.read()if (IS_PY3):result_str = result_str.decode()print(result_str)result = json.loads(result_str)print(result)if ('access_token' in result.keys() and 'scope' in result.keys()):if not SCOPE in result['scope'].split(' '):raise DemoError('scope is not correct')print('SUCCESS WITH TOKEN: %s ; EXPIRES IN SECONDS: %s' % (result['access_token'], result['expires_in']))return result['access_token']else:raise DemoError('MAYBE API_KEY or SECRET_KEY not correct: access_token or scope not found in token response')"""  TOKEN end """if __name__ == '__main__':token = fetch_token()tex = quote_plus(TEXT)  # 此处TEXT需要两次urlencodeprint(tex)params = {'tok': token, 'tex': tex, 'per': PER, 'spd': SPD, 'pit': PIT, 'vol': VOL, 'aue': AUE, 'cuid': CUID,'lan': 'zh', 'ctp': 1}  # lan ctp 固定参数data = urlencode(params)print('test on Web Browser' + TTS_URL + '?' + data)req = Request(TTS_URL, data.encode('utf-8'))has_error = Falsetry:f = urlopen(req)result_str = f.read()headers = dict((name.lower(), value) for name, value in f.headers.items())has_error = ('content-type' not in headers.keys() or headers['content-type'].find('audio/') < 0)except  URLError as err:print('asr http response http code : ' + str(err.code))result_str = err.read()has_error = Truesave_file = "error.txt" if has_error else 'result.' + FORMATwith open(save_file, 'wb') as of:of.write(result_str)if has_error:if (IS_PY3):result_str = str(result_str, 'utf-8')print("tts api  error:" + result_str)print("result saved as :" + save_file)

 

API_KEY = '自己的API_KEY'
SECRET_KEY = '自己的SECRET_KEY '

大家可以去百度AI平台免费申请,这里是百度AI的官方案例,可以直接使用。

如果大家不懂怎么申请的可以在下面评论)因为比较简单,所以就不详细介绍了。

 

合成之后生成一个result.wav文件,通过play函数进行播放。

play("result.wav")

play

###播放欢迎词
def play(fname):ding_wav = wave.open(fname, 'rb')ding_data = ding_wav.readframes(ding_wav.getnframes())#with no_alsa_error():audio = PyAudio()stream_out = audio.open(format=audio.get_format_from_width(ding_wav.getsampwidth()),channels=ding_wav.getnchannels(),rate=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()

 

这里的play函数大家可以留意一下,网上很多都无法使用,尤其是在树莓派上了,这个代码是本人亲测可用,可以在树莓派上直接播放声音。

 

这样我通过唤醒词唤醒后,系统回复声音(哎,我在或者我来啦

 

三、实现了智能语音音响--听音乐
 

这里我已经实现了第一个功能【休闲】-听音乐,智能音响

先给出演示视频

演示视频

语音智能系统-语音音响播放音乐

 

 

下次更新实现了智能语音音响--听音乐的具体实现代码和操作。本期就更新语音唤醒。

 

 

后续延伸

修改回调函数可以完成更多工作

 

这里是语音智能管家的规划功能,后面会继续进行开发,更新记录这个过程。

 

欢迎在下方评论。

 

在平时的科研和任务不多的时候,利用空闲的时间去编写这个系统(因为空闲时间的乐趣就是做自己喜欢的事情,嘻嘻嘻,正好可以用来编写这个系统)。

每次完成一个小进度的时候都会在公众号和博客进行更新,记录一下这个过程(毕竟自己动手完成一件事,还是很有成就感的)

希望大家也能在这个过程中可以学习到一些知识(大牛就忽略了吧,哈哈哈)

 

同时在这个过程中,大家有更好的建议也可以进行评论交流,让这个系统更加完善。

 

                               【加群获取学习资料QQ群:901381280

                                         【各种爬虫源码获取方式

                                      识别文末二维码,回复:爬虫源码

                        欢迎关注公众号:Python爬虫数据分析挖掘,方便及时阅读最新文章

                             回复【开源源码】免费获取更多开源项目源码;

                 

 


http://chatgpt.dhexx.cn/article/LCLINIdb.shtml

相关文章

科大讯飞语音唤醒(Android)

前面的工程项目配置和语音识别差不多&#xff0c;但是需要从SDK的res文件夹中复制ivw文件夹粘贴到main下面的assets文件夹下面。具体的文件配置结构&#xff0c;我截个图给大家看看&#xff1a; 剩下的步骤就是两页代码了&#xff0c;附上&#xff01; 首先是MyApplication中的…

【飞桨PaddleSpeech语音技术课程】— 语音唤醒

(以下内容搬运自飞桨PaddleSpeech语音技术课程&#xff0c;点击链接可直接运行源码) 1. KWS 概述 随着人工智能的飞速发展&#xff0c;市场上推出了各式各样的智能设备&#xff0c;AI 语音的发展更是使得语音助手成为各大智能终端设备必不可少的软件。语音是人类与设备最直接…

语音唤醒的具体技术方案

\qquad 昨天的文章说的是不同的语音激活检测技术&#xff0c;传送门今天要说的是这个技术中间的具体的语音唤醒技术。语音唤醒技术到目前已经经过了三代的发展了。 第一代的技术很好理解&#xff0c;就是先构建一些模板&#xff0c;然后遇到语音&#xff0c;和模板进行匹配&…

26、使用友善NanoPi NEO和外设硬件实现语音唤醒功能、目标检测功能、语音播报功能

基本思想&#xff1a;使用友善开发板进行目标检测和测试 第一步&#xff1a;查看教程和进行刷机http://wiki.friendlyelec.com/wiki/index.php/NanoPi_NEO/zh#.E4.B8.8B.E8.BD.BD.E7.B3.BB.E7.BB.9F.E5.9B.BA.E4.BB.B6 小开发板子还是蛮不错的~&#xff0c;友善也开始卷了。。…

科大讯飞Windows麦克风监听语音唤醒+语音识别demo

最近在学习如何应用API来实现语言交互系统的功能&#xff0c;所以打算写一篇文章来整理和记录自己了解API使用的过程。 有很多平台提供语音识别等功能的API&#xff0c;文章使用的是科大讯飞开发的API。使用讯飞开放平台SDK实现一个Windows语音交互demo 讯飞开放平台简介SDK的下…

讯飞语音——唤醒

讯飞语音唤醒 唤醒功能&#xff0c;顾名思义&#xff0c;通过语音&#xff0c;唤醒服务&#xff0c;做我们想做的事情。 效果图&#xff08;开启应用后说讯飞语音或者讯飞语点唤醒&#xff09; 源码下载 地址&#xff1a;http://download.csdn.net/detail/q4878802/9023213 步…

说话就能轻松操控,科大讯飞语音唤醒技术带来便利体验!

如果&#xff0c;紧箍咒失灵了&#xff0c;孙悟空还会听唐僧的话吗&#xff1f; 如果&#xff0c;专注驾驶途中&#xff0c;一声呼唤便可响应需求是否很方便&#xff1f; 如果&#xff0c;手机落在卧室的某个角落&#xff0c;轻轻唤醒便能找到是否心情舒畅&#xff1f; 现实生…

Android——百度语音唤醒

这篇文章我们主要介绍一下,百度语音唤醒。所谓语音唤醒是指说出指定的语音指令(自定义的唤醒词),使程序激活某个功能的能力。百度语音唤醒支持自定义唤醒词。我做过讯飞的语音唤醒,这两个比较起来,讯飞的语音唤醒整体效果比百度要好。百度的语音唤醒功能需要使用唤醒词评…

androidstudio的语音唤醒功能

Manifest配置 写在application之外 <uses-permission android:name"android.permission.RECORD_AUDIO" /><uses-permission android:name"android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name"android.permiss…

国内那几家语音唤醒技术做的比较好? 语音唤醒技术哪家强?

编辑导语&#xff1a; 随着语音交互技术的日渐成熟&#xff0c;越来越多的智能硬件都选择增加语音能力作为产品卖点之一。但是&#xff0c;设备在进入语音交互工作状态的时候&#xff0c;需要先进行唤醒操作。 常见的唤醒语音交互的操作有按键或者触屏形式&#xff0c;但是&…

语音唤醒工具:WeKWS

1 简介 本文根据2022年10月《WEKWS: A PRODUCTION FIRST SMALL-FOOTPRINT END-TO-END KEYWORD SPOTTING TOOLKIT 》翻译总结的。作者为西北工业大学航海学院张晓雷老师团队、西工大音频语音与语言处理研究组谢磊老师团队、WeNet 开源社区等。 WeKWS是一个可以投入生产使用、容…

讯飞语音开发之语音唤醒

只有前面讲到的语音合成&#xff0c;语音理解&#xff0c;语义理解&#xff0c;语音识别确实可以实现人机交流。但是还不能实现完全智能&#xff0c;不能狗做到实时问道&#xff0c;间歇式问答。要实现实时问答&#xff0c;切不用手动操作。这时候语音唤醒功能就大选伸手了。下…

百度语音唤醒

一&#xff1a;前期准工作 &#xff08;1&#xff09;进入百度开放平台&#xff0c;注册账号&#xff0c;创建应用&#xff0c;拿到应用相对应的 AppID&#xff0c;API密钥&#xff0c;密钥 &#xff08;2&#xff09;配置相关信息 <uses-permission android:name"an…

语音唤醒原理

百度语音唤醒时的日志 D/audio_hw_primary: adev_open_input_stream is_karaoke_fastcapture0 D/audio_hw_primary: adev_open_input_stream: enter: sample_rate(16000) channel_mask(0x10) devices(0x80000004) stream_handle(0xf3439a00) io_handle(454) source(1) …

语音唤醒功能篇

语音唤醒功能 语音唤醒使得系统中的各个功能模块能够很好的分隔开来。用户通过唤醒词“依米”唤醒系统&#xff0c;发送语音指令&#xff0c;系统检测到语音指令中的关键词&#xff0c;然后去执行相对应的功能。当系统执行完成后&#xff0c;便进入等待下一次被唤醒状态&#…

语音唤醒

语音唤醒 前言一、语音唤醒相关环境搭建二、使用步骤1.使用流程2.示例代码 总结 前言 针对语音交互过程&#xff0c;提供了一种语音唤醒的方法供大家参考&#xff0c;语音交互采用snowboy离线语音唤醒引擎&#xff0c;snowboy已经被kitt.AI团队下架&#xff0c;但我们仍能够在…

语音唤醒简单说明

随着 Echo 出现,all in one 音响类产品雏形开始显现,语音交互成为最直接的控制方式,Amazon Echo作为最佳代表,智能语音交互成为互联网入口的新价值所在。ABI Research 在 2017 年収布的预测报告指出,估计到 2022 年,支持语音控制的装置出货量将达到 7500万台,其中智能喇…

语音唤醒技术的原理是什么?

https://www.toutiao.com/a6644766450860950024/ 2019-01-10 15:27:29 “天猫精灵。”“哎&#xff0c;在的&#xff0c;你说” “小爱同学&#xff0c;定明天早上8点的闹钟。”“好的&#xff0c;已经帮你定好明天早上8点的闹钟” 不少同学家里都有AI智能音箱产品&#xff0…

android系统看片软件,真正的手机看片神器 和视界手机APP评测

播放界面支持丰富的手势操作&#xff0c;我们可以通过上下左右的滑动手指来调整影片进度以及音量大小。和视界还可以选择不同的输出设备——只要硬件设备支持&#xff0c;我们可以通过手机将和视界中的视频内容投射到电视上观看。 注重影片的口碑效应&#xff0c;支持用户打分与…

FreeRTOS时间片调度

一、FreeRTOS时间片调度概述 FreeRTOS支持多个任务同时拥有一个优先级&#xff0c;这些任务的调度就可以使用时间片来进行调度。在FreeRTOS中允许一个任务允许一个时间片&#xff08;一个时钟节拍的长度&#xff09;后让出CPU的使用权&#xff0c;让拥有同优先级的下个任务运行…