当前位置: 首页 > news >正文

给本地设备搭建一个云端语音助手

概述

本语音助手实现了从关键词唤醒 (KWS) 到语音识别 (ASR) 再到自然语言理解 (NLU) 的完整流程。该系统可以通过监听用户的音频输入,检测指定的关键词,并将用户的语音转换为文本,最后与预设的命令进行匹配,执行相应的操作(具体实现请参考main.py),为你的设备配置远程语音助手。

流程步骤

请添加图片描述

1. 初始化配置

在启动时,语音助手会加载以下配置:

  • KWS关键词列表 (words_kws.txt):用于检测唤醒词,如 “小新小新” 或 “小爱同学”。
  • ASR热词及其权重 (words_asr.txt):用于优化语音识别的热词列表及其权重,如 “阿里巴巴 20”。
  • NLU命令匹配句子 (words_nlu.txt):预定义的命令句子列表,如 “打开灯”、“关闭灯” 等。

2. 建立WebSocket连接

系统通过以下两个WebSocket连接与KWS和ASR服务器进行交互:

  • KWS WebSocket连接:用于传输音频流并接收关键词检测结果。
  • ASR WebSocket连接:用于传输音频流并接收语音识别结果。

3. 关键词唤醒 (KWS)

当系统启动后,它首先处于关键词唤醒 (KWS) 模式。系统从麦克风获取音频数据,并将这些数据通过WebSocket发送到KWS服务器。服务器实时分析音频流,如果检测到预定义的唤醒词,系统将从KWS模式切换到ASR模式,并准备进行语音识别。

4. 语音识别 (ASR)

在ASR模式下,系统继续从麦克风获取音频数据,并将其发送到ASR服务器。ASR服务器会将音频数据转换为文本,并实时返回识别结果。识别结果分为两种:

  • 在线识别结果:实时返回的识别文本片段。
  • 离线识别结果:最终的完整句子识别结果。

5. 自然语言理解 (NLU)

当ASR返回完整的离线识别结果后,系统会将该文本发送到NLU服务器进行分析。NLU服务器会将该文本与预定义的命令进行匹配,并返回最匹配的命令及其得分。

6. 执行命令

系统根据NLU的匹配结果,输出相应的命令和匹配得分。如果匹配的命令足够明确,系统可以执行相应的操作,如控制设备的开关等。

7. 循环检测

处理完成后,系统重新进入KWS模式,等待下一个唤醒词的检测,整个流程循环进行。

结果展示:

请添加图片描述

远程服务搭建联系作者邮箱:605686962@qq.com

import sounddevice as sd
import websockets
import asyncio
import json
import ssl 
import queue 
import numpy as np 
import requestsclass Speech_Assistant():"""Speech Assistant class for handling Keyword Spotting (KWS), Automatic Speech Recognition (ASR), and Natural Language Understanding (NLU) tasks using WebSocket connections."""def __init__(self,uri_kws="ws://0.0.0.0:10094",uri_asr="wss://0.0.0.0:10095",uri_nlu="http://0.0.0.0:10096",words_kws=['小新小新', '小爱同学'],words_asr={"鸿合科技":20},words_nlu=[]) -> None:"""Initializes the Speech Assistant with URLs and keyword configurations.Args:uri_kws (str): URL for the KWS WebSocket server.uri_asr (str): URL for the ASR WebSocket server.uri_nlu (str): URL for the NLU HTTP server.words_kws (list): List of keywords for KWS.words_asr (dict): Dictionary of hotwords and their weights for ASR.words_nlu (list): List of sentences to compare for NLU."""self.uri_kws = uri_kwsself.uri_asr = uri_asrself.uri_nlu = uri_nluself.words_kws = words_kwsself.words_asr = words_asrself.words_nlu = words_nluself.sample_rate = 16000self.state = 'kws'self.assistant = "unknown"async def init_websocket_kws(self):"""Initialize WebSocket connection for KWS."""self.ws_session_kws = await websockets.connect(self.uri_kws)print("Connected to websocket_kws")async def init_websocket_asr(self):"""Initialize WebSocket connection for ASR."""ssl_context = ssl.SSLContext()ssl_context.check_hostname = Falsessl_context.verify_mode = ssl.CERT_NONEself.ws_session_asr = await websockets.connect(self.uri_asr, subprotocols=["binary"], ping_interval=None, ssl=ssl_context)print("Connected to websocket_asr")async def close_websockets(self):"""Close WebSockets ."""if self.ws_session_kws:await self.ws_session_kws.close()print("Closed websocket_kws")if</

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Rider中修改默认文件关联,自定义打开方式
  • opencascade TopoDS_Builder 源码学习
  • Apache Doris + Iceberg 快速搭建指南|Lakehouse 使用手册(三)
  • Openwrt常用说明
  • (四)activit5.23.0修复跟踪高亮显示BUG
  • 【Linux】:环境变量
  • 收银机打印机相关知识 windows7 查看打印机名称--未来之窗智慧经营收银系统百科
  • Linux OS:线程封装 | RAII封装锁 | 随机数运算任务封装
  • 华为校招机试 - 电影知识图谱和查询系统(20240605)
  • @Value获取值和@ConfigurationProperties获取值用法及比较(springboot)
  • 开发框架DevExpress XAF v24.2产品路线图预览——增强跨平台性
  • 医院不良事件监测预警上报系统,PHP不良事件管理系统源码
  • 认识MySQL
  • C++的GUI(图形用户界面)设计工具
  • LeetCode Hot100 二叉搜索树中第K小的元素
  • Android交互
  • If…else
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • Java|序列化异常StreamCorruptedException的解决方法
  • Material Design
  • Mybatis初体验
  • ng6--错误信息小结(持续更新)
  • OSS Web直传 (文件图片)
  • python学习笔记 - ThreadLocal
  • ReactNativeweexDeviceOne对比
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 成为一名优秀的Developer的书单
  • 关于Java中分层中遇到的一些问题
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  •  一套莫尔斯电报听写、翻译系统
  • 用Canvas画一棵二叉树
  • 优化 Vue 项目编译文件大小
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • # Java NIO(一)FileChannel
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #Datawhale AI夏令营第4期#多模态大模型复盘
  • #NOIP 2014# day.1 T2 联合权值
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (javascript)再说document.body.scrollTop的使用问题
  • (力扣题库)跳跃游戏II(c++)
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (转)大型网站的系统架构
  • .ai域名是什么后缀?
  • .java 9 找不到符号_java找不到符号
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET 常见的偏门问题
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)