语音识别控制(软件、硬件)

1. 环境

python版本:3.11.9

2. 完整代码

import sqlite3
import time
import wave  # 使用wave库可读、写wav类型的音频文件
from funasr import AutoModel
import sounddevice as sd
import numpy as np
from modelscope import pipeline, Tasks
from pypinyin import lazy_pinyin
import pyaudio  # 使用pyaudio库可以进行录音,播放,生成wav文件
# 模型参数设置
chunk_size = [0, 10, 5]
encoder_chunk_look_back = 7
decoder_chunk_look_back = 5
is_task_running= True
model = AutoModel(model="D:\SpeechRecognize\speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-pytorch")# 假设模型要求的采样率为 16000
fs = 16000
duration = 3 #时间
chunk_stride = chunk_size[1] * 960
cache = {}
window_size = 3# 连接到 SQLite 数据库,如果不存在则会创建新的数据库文件
conn = sqlite3.connect('speech_recognition.db')
cursor = conn.cursor()# 创建表格
cursor.execute('''CREATE TABLE IF NOT EXISTS speech_data(text TEXT, time_stamp TEXT, batch TEXT)
''')def record(time):  # 录音程序# 定义数据流块CHUNK = 1024  # 音频帧率(也就是每次读取的数据是多少,默认1024FORMAT = pyaudio.paInt16  # 采样时生成wav文件正常格式CHANNELS = 1  # 音轨数(每条音轨定义了该条音轨的属性,如音轨的音色、音色库、通道数、输入/输出端口、音量等。可以多个音轨,不唯一)RATE = 16000  # 采样率(即每秒采样多少数据)RECORD_SECONDS = time  # 录音时间WAVE_OUTPUT_FILENAME = "./output.wav"  # 保存音频路径p = pyaudio.PyAudio()  # 创建PyAudio对象stream = p.open(format=FORMAT,  # 采样生成wav文件的正常格式channels=CHANNELS,  # 音轨数rate=RATE,  # 采样率input=True,  # Ture代表这是一条输入流,False代表这不是输入流frames_per_buffer=CHUNK)  # 每个缓冲多少帧print("* 开始录音")  # 开始录音标志frames = []  # 定义frames为一个空列表for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):  # 计算要读多少次,每秒的采样率/每次读多少数据*录音时间=需要读多少次data = stream.read(CHUNK)  # 每次读chunk个数据frames.append(data)  # 将读出的数据保存到列表中print("* 结束语音")  # 结束录音标志stream.stop_stream()  # 停止输入流stream.close()  # 关闭输入流p.terminate()  # 终止pyaudiowf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')  # 以'wb‘二进制流写的方式打开一个文件wf.setnchannels(CHANNELS)  # 设置音轨数wf.setsampwidth(p.get_sample_size(FORMAT))  # 设置采样点数据的格式,和FOMART保持一致wf.setframerate(RATE)  # 设置采样率与RATE要一致wf.writeframes(b''.join(frames))  # 将声音数据写入文件wf.close()  # 数据流保存完,关闭文件while is_task_running:start_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())myrecording = sd.rec(int(fs * duration), samplerate=fs, channels=1)sd.wait()speech_chunk = myrecording.flatten()# 噪声处理filtered_chunk = np.convolve(speech_chunk, np.ones(window_size) / window_size, mode='same')speech_chunk = filtered_chunkis_final = Falseres = model.generate(input=speech_chunk, cache=cache, is_final=is_final, chunk_size=chunk_size,encoder_chunk_look_back=encoder_chunk_look_back,decoder_chunk_look_back=decoder_chunk_look_back)text_result=''.join(lazy_pinyin(str(res[0]['text']))).replace(" ", "")# 唤醒词s1=''.join(lazy_pinyin(str("小爱")))if s1 in text_result:#关闭循环is_task_running ==Falseprint("已唤醒,开始录音")record(5)  # 定义录音时间,单位/sinference_pipeline = pipeline(task=Tasks.auto_speech_recognition,model='D:/SpeechRecognize/speech_seaco_paraformer_large_asr_nat-zh-cn-16k-common-vocab8404-pytorch',model_revision="v2.0.4")rec_result = inference_pipeline('./output.wav', hotword='')same = ''.join(lazy_pinyin(rec_result[0]["text"].replace(" ", "")))print("语音转文字" + same)#匹配字符关键词#关键词1 、、、、g1 = ''.join(lazy_pinyin(str("打开空调")))if g1 in same:#通讯发送消息,我会提供五种硬件通讯方式 MTTTSocketModBusTcpIP、串口、HTTP请求print("发送给设备")is_task_running == Truecursor.execute("INSERT INTO speech_data (text, time_stamp, batch) VALUES (?,?,?)",(text_result, start_time, 'eerr'))conn.commit()

3. 硬件通讯

很多人搞不懂,如何用软件控制硬件,但是实际上没大家想的那么复杂,一般的硬件都会提供接口,只要找到厂家要他的通讯方式和通讯内容,就可以实现用软件控制硬件

3.1ModbusTCPIP

比较通用的工业通讯协议,读写PLC数据

from pymodbus.client import ModbusTcpClient
def read_data(ip, port, postion):# 创建 Modbus TCP 客户端并连接client = ModbusTcpClient(ip, port=port)  # 请替换为实际的设备 IP 和端口client.connect()try:# 读取保持寄存器num = 0result = client.read_holding_registers(postion, 1)for value in result.registers:print(value)num = valueexcept Exception as e:print("Exception:", e)finally:# 关闭连接client.close()return str(num)def send_data(ip, port, postion, num):client = ModbusTcpClient(ip, port=port)client.connect()try:# 发送数据到保持寄存器write_result = client.write_registers(postion, [num])  # 从地址 20 开始写入数据if not write_result.isError():print("Write Success")else:print("Write Error:", write_result)except Exception as e:print("Exception:", e)finally:client.close()return 2

3.2MQTT

最近比较流行的工业协议
读取消息

import paho.mqtt.client as mqttdef on_connect(client, userdata, flags, rc):print("Connected with result code "+str(rc))client.subscribe("your_topic")def on_message(client, userdata, msg):print(msg.topic+" "+str(msg.payload))client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_messageclient.connect("broker_ip_address", 1883, 60)client.loop_forever()

写入消息

import paho.mqtt.publish as publishpublish.single("your_topic", "your_message", hostname="broker_ip_address", port=1883)

3.3 Socket TCPIP

def socketddd(ip, port, code):# 要发送的内容content = str(code)+'\a\r\n'# 创建套接字s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 连接服务器server_address = (str(ip), int(port))s.connect(server_address)# 发送数据s.sendall(content.encode())# 关闭连接s.close()

3.4 串口

比较基础的串口

def task1():serials = serial.Serial('COM5', 9600, timeout=0.5)while is_task_running1:if serials.isOpen():print("open success")send_data_hex = bytes.fromhex('5A 06 00 00 60\r\n')serials.write(send_data_hex)  # 编码else:print("open failed")time.sleep(1)  # 每隔 5 秒执行一次

4. 效果

在这里插入图片描述

5.问题

1.必须有麦克风才能跑起来
2.关于模型包,可以直接从模型社区下载(也可私信我)
3.最后的效果与你电脑的显卡有直接联系
4.关于唤醒后定时录音,实际上可以通过计算音频波形判断是否有音频输入,一般2秒没有音频就默认结束录音
5.关于通讯,实际上本质就是报文,在局域网和公网只要连接上即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1543979.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

centos7安装docker DokcerCompose

一, 安装docker 1.更新yum源 yum下载很慢,一直出现正在尝试其它镜像,更改yum地址为阿里云镜像即可 1)下载了阿里云提供的CentOS 7的Yum源配置文件,并将其覆盖到系统中的 /etc/yum.repos.d/CentOS-Base.repo 文件。 wget -O /et…

简单计算器(python基础代码撰写)

简单计算器:仅适用无括号加减乘除,算法初阶,代码基础,不调库或模块“纯”手撕。 (笔记模板由python脚本于2024年09月22日 12:08:02创建,本篇笔记适合喜欢用python解决实际问题的coder翻阅) 【学习的细节是欢悦的历程】…

宠物鱼油补充剂行业调研:未来几年年复合增长率CAGR为7.8%

宠物鱼油补充剂是一种营养补充剂,富含从鱼类中提取的欧米伽-3 脂肪酸(主要是 EPA 和 DHA),专为宠物设计,以改善其健康状况。鱼油补充剂富含奥米加-3 脂肪酸,已被证明对宠物健康有诸多益处,包括改…

分布式环境中,接口超时到底怎么处理?

目录标题 为什么会存在超时?如何应对可能发生的超时?1. 设置合理的超时时间2. 重试机制3. 熔断机制4. 监控和报警5. 日志记录6. 限流和降级7. 异步处理 以上总结 为什么会存在超时? 接口超时是分布式系统中常见的问题,其原因多种多样,涉及网络、服务…

文件系统(软硬链接 动静态库 动态库加载的过程)

文章目录 软硬链接软链接软链接有什么用? 硬链接硬链接有什么用? 动静态库Linux中的动静态库库静态库 && 安装库动态库动态库 VS 静态库用第三方库 动态库加载elf头部信息 软硬链接 先看现象:先创建一个文件,并写入内容 …

ELK-01-elasticsearch-8.15.1安装

文章目录 前言一、下载elasticsearch二、将tar包放到服务器三、解压tar包四、更改配置文件五、添加启动用户六、用elasticserch用户启动6.1 报错6.2 解决问题16.3 解决问题26.4 再次用elasticserch用户启动6.5 windows浏览器打开 七、设置开机自动启动7.1 创建启动脚本7.2 在脚…

在Java中 String能存储多少个字符?

经典面试题 关于String能存储多个字符,这个是面试者在面试中经常被提及的问题,这个问题可以问的很浅,也可以问的很深,具体看面试官看了你的简历后,对你的能力有什么样的看法,今天,我们就这个问…

postman发送与返回,GET与POST使用

1.GET 获取主页 发送: uri: ‘/’ 返回: 2.POST 发送密码 发送: uri: ‘/login.html’ 返回: 3.POST 保存参数 发送: 返回: 4.GET 获取参数 在POST密码之后,服务器发送一个H…

西门子PCS7在CFC中如何连接DB块中的变量

在CFC中所连接的DB块必须是用户数据块(User DB)。在CFC中通过菜单Options Customize Compile/Download… 可以查看和修改用户数据块的范围,默认范围是DB1-DB60,超出该范围的DB块在CFC中无法引用,如果引用了,CFC编译时会提示错误。…

Linux复习--系统管理类(权限优化、备份策略、RAID、资源查看、启动流程、系统优化)

一、权限优化 1、文件的基本权限 以下知识点详细情况点击: Linux--用户身份和文件权限_linux用户文件权限-CSDN博客https://blog.csdn.net/lerp020321/article/details/140232127 1.1、文件身份 身份分类:所有者(u)、所属组&am…

C++ | Leetcode C++题解之第430题扁平化多级双向链表

题目&#xff1a; 题解&#xff1a; class Solution { public:Node* flatten(Node* head) {function<Node*(Node*)> dfs [&](Node* node) {Node* cur node;// 记录链表的最后一个节点Node* last nullptr;while (cur) {Node* next cur->next;// 如果有子节点…

golang学习笔记11-模块化与包管理【重要】

注&#xff1a;本人已有C&#xff0c;C,Python基础&#xff0c;只写本人认为的重点。 在第六节&#xff08;golang学习笔记6&#xff09;中&#xff0c;我讲了如何自定义包&#xff0c;包其实有两种引用方式&#xff0c;一种是不用模块&#xff0c;还有种是用模块&#xff0c;我…

Leetcode 543. 124. 二叉树的直径 树形dp C++实现

问题&#xff1a;Leetcode 543. 二叉树的直径&#xff08;边权型&#xff09; 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。两节点之间路径的 长度 由它们之…

创新学生宿舍管理:Spring Boot框架实践

第2章 开发环境与技术 学生宿舍管理系统的编码实现需要搭建一定的环境和使用相应的技术&#xff0c;接下来的内容就是对学生宿舍管理系统用到的技术和工具进行介绍。 2.1 MYSQL数据库 本课题所开发的应用程序在数据操作方面是不可预知的&#xff0c;是经常变动的&#xff0c;没…

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-20

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-20 1. Multimodal Fusion with LLMs for Engagement Prediction in Natural Conversation Authors: Cheng Charles Ma, Kevin Hyekang Joo, Alexandria K. Vail, Sunreeta Bhattacharya, Alvaro Fern’andez Ga…

《汇编语言》第14章——实验 14访问CMOS RAM

编程&#xff0c;以“年/月/日 时&#xff1a;分&#xff1a;秒”的格式&#xff0c;显示当前的日期、时间 assume cs:code data segment db 2024/09/23 00:00:00,$ data endscode segment start:mov ax,datamov es,axcall get_hms_funccall get_ymd_funcmov dh,12 ;dh中存放…

Beyond 5.5旗舰版和高级版激光软件

Beyond 5.5旗舰版和高级版激光软件具有以下一些特点和功能&#xff1a; 1. 强大的功能特性&#xff1a; • 多媒体支持&#xff1a;它是真正的多媒体控制激光软件&#xff0c;除支持基本的激光图案外&#xff0c;还支持视频、3D 动画和绘图程序等&#xff0c;为用户提供了丰富…

Springcloud框架-能源管理系统-能源管理系统源码-能源在线监测平台-双碳平台

一、介绍 基于SpringCloud的能管管理系统-能源管理平台源码-能源在线监测平台-双碳平台源码-SpringCloud全家桶-能管管理系统源码 有需者咨询&#xff0c;非诚勿扰&#xff1b; 二、软件架构 二、功能介绍 三、数字大屏展示 四、数据采集原理 五、软件截图

Windows11系统安装,配置CUDA、cuDNN等

已经有大几年没有安装过 Windows 的系统了&#xff0c;今天因为黑神话悟空&#xff0c;准备把 Win 11 装一台&#xff0c;玩玩游戏&#xff0c;顺便把一些 CUDA 相关的异步解析项目也安装到 Window 上。 下载安装 PE 因为十几年前&#xff0c;只会用 PE 装系统&#xff0c;所…

XSS闯关小游戏(前13关)

挖掘思路 1.存在可控参数 2.页面存在回显 3.使用带有特殊字符的语句去测试&#xff0c;网站是否进行了实例化 ( 例如 ">123 ) 4.构造闭合&#xff0c;实现payload的逃逸 1 name处参数可控&#xff0c;直接打即可 2 这里知道<>被实体编码了 再测试">1…