使用pyqt5 pyserial TTS模型vosk开发的语音串口工具

news/2025/11/3 14:13:38/文章来源:https://www.cnblogs.com/Goddragon/p/19186897

项目概述

这是一个集成了语音识别和串口通信功能的智能控制工具,旨在通过自然语言语音指令实现对硬件设备的远程控制。该工具采用pyqt5 GUI 界面设计,支持多种串口参数配置,能够实时识别语音指令并通过串口发送控制设备的指令集命令。

核心功能

1、智能语音识别:集成 Vosk 本地语音识别引擎,支持离线使用
2、灵活的串口配置:支持波特率、校验位、停止位、流控制等完整参数设置
3、实时状态显示:动态显示识别过程和系统状态
4、历史记录查看:完整记录所有识别结果和操作日志
5、用户友好界面:采用 PyQt5 构建的图形界面

代码如下:

主程序入口
import sys
from PyQt5.QtWidgets import QApplication
from ui import MainWindow#主程序入口if __name__ == "__main__":app = QApplication(sys.argv)window = MainWindow()window.show()sys.exit(app.exec_())
语音识别具体实现
import vosk
import pyaudio
from PyQt5.QtCore import pyqtSignal, QThread#VOSK语音识别模块class SpeechRecognitionThread(QThread):recognized_signal = pyqtSignal(str)current_text_signal = pyqtSignal(str)def __init__(self, serial_connection, model_path):super().__init__()self.serial_connection = serial_connectionself.model_path = 'model/voskmodelsmallcn'self.stop_flag = Falsedef run(self):try:model = vosk.Model(self.model_path)recognizer = vosk.KaldiRecognizer(model, 16000)recognizer.SetWords(True)p = pyaudio.PyAudio()stream = p.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=4000)while not self.stop_flag:data = stream.read(4000)if recognizer.AcceptWaveform(data):result = recognizer.Result()self.recognized_signal.emit(result)self.process_command(result)else:partial_result = recognizer.PartialResult()self.current_text_signal.emit(partial_result)stream.stop_stream()stream.close()p.terminate()except Exception as e:self.recognized_signal.emit(f"语音识别错误: {str(e)}")def stop(self):self.stop_flag = Truedef process_command(self, result):command = result.lower()if "打开 冻结" in command:self.send_serial_command("\x02OFZ:1\x03")elif "关闭 冻结" in command:self.send_serial_command("\x02OFZ:0\x03")def send_serial_command(self, command):try:if self.serial_connection and self.serial_connection.is_open:self.serial_connection.write(command.encode())self.recognized_signal.emit(f"发送指令: {command}")else:self.recognized_signal.emit("串口未打开")except Exception as e:self.recognized_signal.emit(f"发送指令错误: {str(e)}")
GUI界面
from PyQt5.QtWidgets import QMainWindow, QVBoxLayout, QWidget, QLabel, QPushButton, QLineEdit, QComboBox, QTextEdit
from PyQt5.QtCore import QCoreApplication
from serial_config import SerialConfig
from speech_recognition import SpeechRecognitionThread
import serial
import serial.tools.list_ports# UI模块class MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("语音控制工具")self.setGeometry(200, 200, 500, 400)self.serial_config = SerialConfig()self.serial_connection = Noneself.init_ui()def init_ui(self):self.layout = QVBoxLayout()self.port_label = QLabel("串口号:")self.layout.addWidget(self.port_label)self.port_input = QComboBox()self.layout.addWidget(self.port_input)self.populate_ports()self.baudrate_label = QLabel("波特率:")self.layout.addWidget(self.baudrate_label)self.baudrate_input = QLineEdit("19200")self.layout.addWidget(self.baudrate_input)self.parity_label = QLabel("效验位:")self.layout.addWidget(self.parity_label)self.parity_input = QComboBox()self.parity_input.addItems(["None", "Even", "Odd"])self.layout.addWidget(self.parity_input)self.stopbits_label = QLabel("停止位:")self.layout.addWidget(self.stopbits_label)self.stopbits_input = QComboBox()self.stopbits_input.addItems(["1", "1.5", "2"])self.layout.addWidget(self.stopbits_input)self.flowcontrol_label = QLabel("流控制:")self.layout.addWidget(self.flowcontrol_label)self.flowcontrol_input = QComboBox()self.flowcontrol_input.addItems(["None", "Xon/Xoff", "RTS/CTS", "DTR/DSR"])self.layout.addWidget(self.flowcontrol_input)self.start_button = QPushButton("开始语音识别")self.start_button.clicked.connect(self.start_recognition)self.layout.addWidget(self.start_button)self.stop_button = QPushButton("停止语音识别")self.stop_button.clicked.connect(self.stop_recognition)self.layout.addWidget(self.stop_button)self.status_label = QLabel("状态: 等待开始")self.layout.addWidget(self.status_label)self.output_text = QTextEdit()self.output_text.setReadOnly(True)self.layout.addWidget(self.output_text)container = QWidget()container.setLayout(self.layout)self.setCentralWidget(container)def populate_ports(self):try:ports = serial.tools.list_ports.comports()for port in ports:self.port_input.addItem(port.device)except Exception as e:self.status_label.setText(f"串口获取错误: {str(e)}")def start_recognition(self):try:self.serial_config.port = self.port_input.currentText()self.serial_config.baudrate = int(self.baudrate_input.text())self.serial_config.parity = self.get_parity(self.parity_input.currentText())self.serial_config.stopbits = self.get_stopbits(self.stopbits_input.currentText())self.serial_config.flowcontrol = self.get_flowcontrol(self.flowcontrol_input.currentText())self.serial_connection = serial.Serial(self.serial_config.port, self.serial_config.baudrate,parity=self.serial_config.parity,stopbits=self.serial_config.stopbits,bytesize=self.serial_config.bytesize, timeout=1)self.status_label.setText(f"状态: 串口 {self.serial_config.port} 已打开")model_path = "model/voskmodelsmallcn"  # 本地模型路径self.recognition_thread = SpeechRecognitionThread(self.serial_connection, model_path)self.recognition_thread.recognized_signal.connect(self.update_output)self.recognition_thread.current_text_signal.connect(self.update_status)self.recognition_thread.start()except Exception as e:self.status_label.setText(f"启动识别错误: {str(e)}")def stop_recognition(self):try:if self.recognition_thread:self.recognition_thread.stop()self.recognition_thread.wait()if self.serial_connection and self.serial_connection.is_open:self.serial_connection.close()self.status_label.setText("状态: 语音识别已停止")except Exception as e:self.status_label.setText(f"停止识别错误: {str(e)}")QCoreApplication.quit()def update_status(self, text):self.status_label.setText(f"当前识别: {text}")def update_output(self, text):self.output_text.append(text)def get_parity(self, parity):if parity == "None":return serial.PARITY_NONEelif parity == "Even":return serial.PARITY_EVENelif parity == "Odd":return serial.PARITY_ODDdef get_stopbits(self, stopbits):if stopbits == "1":return serial.STOPBITS_ONEelif stopbits == "1.5":return serial.STOPBITS_ONE_POINT_FIVEelif stopbits == "2":return serial.STOPBITS_TWOdef get_flowcontrol(self, flowcontrol):if flowcontrol == "None":return Falseelif flowcontrol == "Xon/Xoff":return serial.XONXOFFelif flowcontrol == "RTS/CTS":return serial.RTSCTSelif flowcontrol == "DTR/DSR":return serial.DTRDSR
Serial配置界面
import serial#配置串口class SerialConfig:def __init__(self):self.port = Noneself.baudrate = 19200self.parity = serial.PARITY_NONEself.stopbits = serial.STOPBITS_ONEself.flowcontrol = Falseself.bytesize = 8  # 数据位,默认8

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI教我一条SQL实现明细转树形结构

AI教我一条SQL实现明细转树形结构 1. 原始数据序号 COUNTRY PROVINCE CITY GAME1 中国 广东 深圳 地心侠士2 中国 广东 广州 地心侠士3 中国 江苏 南京 地心侠士4 美国 加州 洛杉矶 地心侠士2. 目标数据序号 节点名称 …

十分钟读懂 Deepseek MTP(Multi-Token Prediction)

传统的大语言模型采用的训练目标是 Next-Token Prediction (NTP),即在位置 t 上预测下一个 token (t+1)。而 Multi-Token Prediction (MTP) 的核心思想在于:不仅预测下一个 token,而是能够同时预测多个未来的 token…

2025年度中国工业制冷设备品牌排名:东洋制冷机靠不靠谱

TOP1推荐:深圳市东洋冷冻设备有限公司 评价指数:★★★★★ 口碑评分:99分 行业表现:A+++++级 介绍: 深圳市东洋冷冻设备有限公司(简称东洋制冷)电话号码:13827472315,成立于1993年(前身为深圳市东洋工业冷冻…

2025年山东外贸网站开发服务商权威推荐:本地网站建设/出海网站建设/科技网站建设服务商精选

随着全球跨境电商市场的持续扩张,专业外贸网站建设需求呈现显著增长。据行业数据显示,2024年我国跨境电商进出口额达2.38万亿元,增长15.7%,其中专业外贸网站作为企业出海基础载体,发挥着不可替代的作用。 本文将基…

2025年油雾净化设备制造商:中国五大精密油雾净化设备靠谱供应商权威测评与深度解析

TOP1推荐:天浩洋环保 评价指数:★★★★★ 口碑评分:99分 行业表现:A+++++级 介绍: 天浩洋环保电话号码:13902481558,成立于1996年,注册资本1.08亿,二十余载始终秉承匠心精神,专注于工业挥发性有机废气治理运…

2025年防盗盖封口机厂商权威推荐:铝盖旋盖机/压盖机/锁盖机源头厂家精选

在现代工业生产中,防盗盖封口机作为包装流程的核心设备,其性能直接关系到产品密封性、生产效率和品牌形象。根据QYResearch调研数据,2024年全球锁盖机市场规模已达数亿元,预计2031年将达到新高峰,年复合增长率稳定…

2025年冷鲜肉切片机制造企业权威推荐榜单:牛肉切片机/连续式鲜肉切片机/鲜肉切片机源头厂家精选

在食品加工设备领域,一批拥有核心技术与创新解决方案的企业正在推动冷鲜肉切片行业的智能化升级,其中自动化设备年增速已超行业平均水平。 据最新行业报告显示,2025年中国食品加工设备市场规模持续扩大,其中冷鲜肉…

适合高中数学辅导的培训机构怎么选?从基础到拔高这样挑不踩坑

在当前教育背景下,高中数学的重要性不言而喻,它不仅是高考的关键拉分科目,更是培养学生逻辑思维能力的核心环节。然而,面对市场上层出不穷的辅导机构,如何为孩子选择一条从巩固基础到冲刺拔高的科学路径,成为众多…

pcb入门

原理图输入电容耐压100V ,输出电压5V,电容考虑额定电流大小 旋转器件: 空格 放置导线: w键 网络标识-> vcc -> 可以通过 tab键改成VIN 编辑器件-> 栅格尺寸0.05-> 调整引脚 非链接标识 -> 空引脚(高…

6.AUserDefaults 使用指南

Aquarius 开发框架旨在帮助独立开发者和中小型团队,完成 iOS App 的快速实现与迭代。使用框架开发将给你带来简单、高效、易维护的编程体验。大家好,我是K哥。一名独立开发者,同时也是Swift开发框架【Aquarius】的作…

S-PSC 5202 游记

屏幕在深夜微微发亮,思想在那虚树路径上彷徨。——《膜你抄》 都 5202 年了,怎么还有人在清醒的时候去写游记啊。 day -? 省流:压线过初赛。 day 0 困困困困困。 随便打了场模拟赛,难度 绿蓝紫紫,拿下 [0,100]+7…

【科普】数据基础设施“三统一”是什么?

打开链接点亮社区Star,照亮技术的前进之路。每一个点赞,都是社区技术大佬前进的动力Github 地址: https://github.com/secretflow 整体概述 隐语社区严格遵循《国家数据基础设施建设指引》及《国家数据基础设施建设…

2025年11月全屋定制品牌推荐评价:消费者满意度调查结果

随着生活品质的提升,越来越多的家庭在选择家居解决方案时倾向于全屋定制服务。这类需求通常来自于新房装修、旧房改造或者追求个性化生活空间的消费者。他们往往面临品牌选择困难、质量参差不齐、售后服务不完善等痛点…

2025年11月全屋定制品牌推荐榜单:十大品牌综合对比与权威评测

随着生活品质的提升,越来越多的家庭开始关注家居环境的个性化和功能性,全屋定制因其空间利用率高、风格统一等优势逐渐成为市场主流选择。本文旨在为计划在2025年底进行家居装修或换新的消费者提供一份客观、全面的全…

Smartproxy提取指南——JSON-first 架构与参数化最佳实践 - Smart

本指南以 API 代理 IP 提取为核心,结合参数化设计、JSON-first 接口规范、严格的版本管理与状态码标准,帮助您构建高成功率、低运维成本、可平滑扩展的数据采集流水线。基于 8000万+ 住宅代理 IP 资源池、覆盖 全球 …

2025年11月远程控制软件评价排行:基于多维度数据对比

在数字化办公日益普及的今天,远程控制软件已成为企业办公、技术支持、个人设备管理的重要工具。根据2025年远程办公行业白皮书显示,超过78%的企业已将远程控制软件纳入日常办公体系,而个人用户使用远程控制软件的比…

[PaperReading] GME: Improving Universal Multimodal Retrieval by Multimodal LLMs

目录GME: Improving Universal Multimodal Retrieval by Multimodal LLMsTL;DRMethodModel多模态数据数据合成Experiment效果可视化总结与思考 GME: Improving Universal Multimodal Retrieval by Multimodal LLMs lin…

2025年10月深圳律师推荐榜:五家刑事辩护团队对比与中立评测

一、引言 在深圳这样商事活动高度密集、刑事风险多元的一线城市,创业者、企业高管及高净值人群一旦面临刑事调查,对律师的需求集中在“程序突破速度、辩护方案精细度、团队响应效率”三大核心。2025年第三季度公开裁…

2025年11月法律咨询律所推荐排名:用户需求匹配度全解析

随着社会法治意识提升和商业活动复杂化,法律咨询需求呈现多元化、专业化趋势。个人用户可能因婚姻继承、房产纠纷等日常事务需要法律支持,企业用户则更关注商事合规、知识产权保护等专业领域。当前法律服务行业呈现规…