基于大模型的pc版语音对话问答
Vosk基础知识:
Vosk 是一个强大的开源语音识别工具包,以下是对它的详细介绍:
特点
- 离线识别:Vosk 的显著特点是支持离线语音识别。这意味着在没有网络连接的情况下,也能进行语音识别操作,避免了因网络问题导致的识别中断或延迟,同时也增强了数据的安全性和隐私性。
- 多语言支持:该工具包支持多种语言,包括英语、汉语、法语、德语等众多主流语言,以及一些少数民族语言和方言。这种多语言能力使其能够广泛应用于全球不同地区和不同语言背景的用户。
- 模型丰富:Vosk 提供了多种预训练模型,这些模型经过大量数据训练,在不同的应用场景下具有较高的识别准确率。同时,用户还可以根据自己的需求,使用开源工具对模型进行进一步训练和优化,以适应特定领域或个性化的语音识别任务。
- 高准确率:基于先进的深度学习算法,如深度神经网络(DNN)和隐马尔可夫模型(HMM)等,Vosk 在语音识别方面能够达到较高的准确率。无论是在清晰的语音环境还是存在一定噪音的环境中,都能表现出较好的识别性能。
- 易于集成:Vosk 具有良好的兼容性和可扩展性,能够方便地集成到各种不同的应用程序和系统中。它提供了多种编程语言的接口,如 Python、C++、Java 等,方便开发者根据自己的技术栈进行选择和开发。
应用场景
- 语音助手:可以为智能语音助手提供核心的语音识别功能,使其能够准确理解用户的语音指令,实现诸如查询信息、播放音乐、控制设备等操作。
- 语音转文字:适用于将语音内容转换为文字的场景,如会议记录、语音笔记、视频字幕生成等。能够提高文字录入效率,减轻人工打字的负担。
- 智能家居控制:与智能家居设备集成后,用户可以通过语音指令控制家电、灯光、窗帘等设备,实现更加便捷、智能化的家居控制体验。
- 车载语音交互:在汽车环境中,Vosk 可以帮助实现车载语音系统的功能,让驾驶员通过语音操作导航、音乐播放、电话拨打等功能,提高驾驶安全性和便利性。
模型下载,大概1.99G。
通过网盘分享的文件:vosk-model-cn-0.22.zip
链接: 百度网盘 请输入提取码 提取码: ymgp
模型部署:
采用vllm框架,部署DeepSeek-R1-Distill-Qwen-7B模型。
vllm serve ./DeepSeek-R1-Distill-Qwen-7B --tensor-parallel-size 2 --max-model-len 32768 --enforce-eager

代码实现:
import time
import requests
import pyttsx3
import json
import pyaudio
import numpy as np
from vosk import Model, KaldiRecognizer, SetLogLevel
import tkinter as tk
from tkinter import scrolledtext, font
import threading
import queue
import openai# 语音识别模块
class SaveWave:def __init__(self, model):self.model = modelself.rec = KaldiRecognizer(model, 16000)self.p = pyaudio.PyAudio()self.stream = self.p.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=8192)self.stream.start_stream()def listen(self):while True:data = self.stream.read(4096, exception_on_overflow=False)if len(data) == 0:breakif self.rec.AcceptWaveform(data):result = self.rec.Result()result_dict = json.loads(result)text = result_dict.get("text", "")if text:return textreturn None# Tkinter 窗口模块
class InteractiveTextApp:def __init__(self, root):self.root = rootself.root.title("实时语音输入与模型输出")self.root.geometry("1000x700")self.root.configure(bg="#f0f0f0")# 设置字体self.custom_font = font.Font(family="Helvetica", size=16)# 创建可滚动的文本框self.text_area = scrolledtext.ScrolledText(root,wrap=tk.WORD,width=70,height=25,state='disabled',font=self.custom_font,bg="#ffffff",fg="#333333",padx=10,pady=10)self.text_area.pack(padx=20, pady=20, fill=tk.BOTH, expand=True)# 创建队列,用于线程间通信self.message_queue = queue.Queue()# 启动队列监听器self.start_queue_listener()def start_queue_listener(self):"""监听队列,将消息显示在文本框中"""def check_queue():try:while True:# 从队列中获取消息message = self.message_queue.get_nowait()self.display_text(message)except queue.Empty:pass# 每隔 100ms 检查一次队列self.root.after(100, check_queue)# 启动队列监听check_queue()def display_text(self, text):"""将文本显示在文本框中"""self.text_area.config(state='normal')self.text_area.insert(tk.END, text + "\n")self.text_area.config(state='disabled')self.text_area.yview(tk.END)# 主逻辑模块
class Solution:def __init__(self, app):self.app = appself.engine = pyttsx3.init()self.engine.setProperty('rate', 200)self.engine.setProperty('volume', 1.0)self.engine.setProperty('voice', self.engine.getProperty('voices')[0].id)def use_pyttsx3(self, word):"""语音播报"""self.engine.say(word)self.engine.runAndWait()def chat_with_ollama(self, model):"""与模型交互"""client = openai.Client(base_url="http://10.1.12.10:8000/v1", api_key="None")history = []recognizer = SaveWave(model)self.app.message_queue.put("--------------开始录音--------------")while True:# 语音识别user_input = recognizer.listen()if user_input:print(f"用户输入: {user_input}")self.app.message_queue.put(f"{user_input}")# 判断是否退出if user_input.lower() in ["exit", "quit", "stop", "baibai"]:break# 将用户输入添加到历史记录history.append([user_input, ""])# 整理对话消息messages = []for idx, (user_msg, model_msg) in enumerate(history):if idx == len(history) - 1 and not model_msg:messages.append({"role": "user", "content": user_msg})breakif user_msg:messages.append({"role": "user", "content": user_msg})if model_msg:messages.append({"role": "assistant", "content": model_msg})#调用模型生成回复#标准请求response = client.chat.completions.create(model="./DeepSeek-R1-Distill-Qwen-7B",messages= messages,temperature=0,max_tokens=4096,)model_output = response.choices[0].message.content print(f"模型输出: {model_output}")self.app.message_queue.put(f"DeepSeek: {model_output}")# 语音播报模型输出self.use_pyttsx3(model_output)# 更新历史记录history[-1][1] = model_output# 主程序
#pyinstaller --onefile --windowed main.py
if __name__ == "__main__":# 初始化语音识别模型model = Model("vosk-model-cn-0.22")SetLogLevel(-1)# 创建 Tkinter 窗口root = tk.Tk()app = InteractiveTextApp(root)# 创建主逻辑对象solution = Solution(app)# 启动语音识别和模型交互线程threading.Thread(target=solution.chat_with_ollama, args=(model,), daemon=True).start()# 运行 Tkinter 主循环root.mainloop()
代码构建了一个集语音识别、模型交互、语音播报和图形界面展示于一体的智能聊天应用程序。它先导入众多相关库,SaveWave类借助 Vosk 实现语音识别,将音频转为文字;InteractiveTextApp类利用 Tkinter 创建 GUI,通过消息队列实时显示对话内容;Solution类初始化语音合成引擎,在chat_with_ollama方法中,持续监听语音输入,调用 OpenAI 兼容模型获取回复,实现语音播报并更新对话历史。主程序初始化语音识别模型,启动各功能模块并开启 Tkinter 主循环,使应用程序能正常运行 。
运行效果:



其他:
网页端Web 语音 API,例如 Web Speech API 或者 Google Cloud Speech-to-Text API 等
相关文章:
基于大模型的pc版语音对话问答
Vosk基础知识: Vosk 是一个强大的开源语音识别工具包,以下是对它的详细介绍: 特点 离线识别:Vosk 的显著特点是支持离线语音识别。这意味着在没有网络连接的情况下,也能进行语音识别操作,避免了因网络问…...
深入理解 Linux 内核中的 GPU 子系统:从 DRM 到 NXP 驱动架构全解读
本文不仅为 GPU 子系统的深入复习笔记,更是一本面向 Linux 内核开发者、嵌入式图形系统开发人员的实践指南。本文围绕 drivers/gpu 展开,特别聚焦 NXP i.MX 系列平台的 GPU 架构和 Linux-imx 的实现方式,内容超 5000 字,适合收藏学…...
Go 语言标准库中path模块详细功能介绍与示例
Go语言的 path 模块提供了处理斜杠分隔路径的通用方法,适用于跨平台路径操作(如 URL 路径或 Unix 风格路径)。以下是 path 模块的核心方法及示例说明: 1. path.Base 返回路径的最后一个元素(类似 Unix 的 basename 命…...
鸿蒙NEXT开发App相关工具类
import bundleManager from ohos.bundle.bundleManager; import { KeyboardAvoidMode, window } from kit.ArkUI; import { common, ConfigurationConstant } from kit.AbilityKit;/*** App相关工具类(使用该工具前请在UIAbility的onWindowStageCreate方法中调用AppUtil的init方…...
Kafka 的高可用性
Kafka 的高可用性主要通过副本机制、ISR(In-Sync Replicas)列表和控制器 Broker 来实现。这些机制共同确保了 Kafka 集群在部分节点故障时仍然可以正常运行,数据不会丢失,并且服务不会中断。 1. 副本机制 Kafka 的副本机制是其高…...
docker 部署 postgresql 切换用户
① 启动容器 docker run -d --name postgres-e POSTGRES_PASSWORDpostgres-p 5432:5432 postgres su - omm gsql -d postgres -p 5432 # 将会在postgres下创建用户test1,在其他数据库下是无法删除此用户 CREATE USER test1 WITH Sysadmin IDENTIFIED BY Zcxzhf175…...
Allegro界面颜色改变设置
概述:本文主要讲解如何改变allegro的背景颜色,改为自己喜欢的颜色 1、 打开Allegro文件 2、 Setup—User Preference—UI—General—Allegro_theme选择Light即可 改变前 改变后...
【log4j】配置Slf4j
配置Slf4j 引入lombok包 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.36</version><scope>provided</scope> </dependency>引入log4j相关api <dependency…...
ThreadLocal与Cookie + Session?
这篇文章主要在做 Echo 社区项目的时候写的,在保持用户登录态的这个需求下,为啥要用 ThreadLocal 存储用户信息,而不是采用常见的 Cookie Session。 Cookie Session 由于 HTTP 协议是无状态的,完成操作关闭浏览器后,…...
freecad手动装插件 add on
python工作台输入 FreeCAD.ConfigGet("UserAppData") 在返回的地址上新建文件夹:Mod #like /home/chen/snap/freecad/common 进入Mod #like /home/chen/snap/freecad/common/Mod git clone 你要的项目 #like git clone https://github.com/looooo/f…...
【算法】二分查找(下)
一、山峰数组的峰顶索引 题目链接:852. 山脉数组的峰顶索引 - 力扣(LeetCode) 题目描述: 给定一个长度为 n 的整数 山脉 数组 arr ,其中的值递增到一个 峰值元素 然后递减。 返回峰值元素的下标。 你必须设计并实现时…...
【动手学深度学习】#6 卷积神经网络
主要参考学习资料: 《动手学深度学习》阿斯顿张 等 著 【动手学深度学习 PyTorch版】哔哩哔哩跟李牧学AI 由于本系列一开始跳过了第一章引言部分,因此系列编号比书本章节编号提前。现改为和书本统一(因为之前自己的原始笔记也是按照书本章节编…...
认识一家公司:瑞芯微(Rockchip Electronics Co., Ltd.)以及旗下的两款芯片RK3288\RK3588
瑞芯微(Rockchip Electronics Co., Ltd.)简介 一、公司概况 瑞芯微电子股份有限公司(简称“瑞芯微”)成立于2001年,总部位于中国福建省福州市,是一家专注于集成电路设计与研发的高新技术企业。公司采用Fa…...
爬虫面试题
总结一下最近面试遇到的笔试题 1、解释Python中的init方法的作用。 在Python中,__init__方法是一种特殊的构造方法,主要用于在创建类的实例时初始化对象。至少接受至少一个参数:self,它是对当前实例的引用,可以通过添加其他参数…...
Netty——零拷贝
文章目录 1. 什么是零拷贝?2. 为什么需要零拷贝?2.1 传统 I/O 的拷贝流程2.2 零拷贝的优化2.2.1 通过 sendfile 系统调用2.2.2 通过 mmap (内存映射) 系统调用 3. Netty 实现零拷贝的方式3.1 文件传输优化:FileRegion 封装3.2 直接内存 (Dire…...
Java制作简单的聊天室(复习)
设计的知识点:几乎包含java基础的全部知识点(java基础语法,java基础进阶:双列集合,io流,多线程,网络编程等) 代码如下 客户端: 服务器采用的时多线程的循环多线程的方式…...
ES 字段的映射定义了字段的类型及其行为
在 Elasticsearch 中,字段的映射定义了字段的类型及其行为。你提供的 content_answer 字段映射如下: Json 深色版本 "content_answer": { "type": "text", "fields": { "keyword": { …...
Android开发点击字符串web链接跳到系统浏览器上
Android开发点击字符串web链接跳到系统浏览器上 直接上代码:用到你就拿去用 public static void performItemUrlClick(View view, String contentUrl) {if (!TextUtils.isEmpty(contentUrl)) {Intent intent new Intent();if (!contentUrl.startsWith("http…...
运维规则之总结(Summary of Operation and Maintenance Rules)
运维规则之总结 在运维领域,经验和流程往往决定了系统的稳定性与可靠性。一个运维人,总结出了以下10条运维规则,涵盖了从基础管理到高级策略的全面内容,旨在帮助运维人员更好地应对各种挑战,确保系统的平稳运行。 1.…...
智能家居赋能宠物经济:未来宠物行业的另一片蓝海
一、引言:宠物经济的范式转移 随着城市化进程的加速,宠物在现代家庭中的地位日益重要,宠物经济蓬勃发展。近年来,智能家居技术的兴起为宠物行业带来了新的变革,从传统的情感消费模式向技术赋能的精细化养宠模式转变。…...
C++Primer学习(13.6 对象移动)
13.6 对象移动 新标准的一个最主要的特性是可以移动而非拷贝对象的能力。如我们在13.1.1节(第440页)中所见,很多情况下都会发生对象拷贝。在其中某些情况下,对象拷贝后就立即被销毁了。在这些情况下,移动而非拷贝对象会大幅度提升性能。 如我…...
RHCE工程师特训指南
RHCE(红帽认证工程师)是Linux领域极具含金量的认证之一,其考试以实操为主,注重系统管理、网络服务配置及自动化运维能力。以下内容可帮助对RHCE考生高效规划学习路径。 一、RHCE认证概述 认证结构 RHCE认证分为两部分ÿ…...
内核、进程和线程---操作系统
操作系统 操作系统位于用户程序和硬件之间,通过系统调用提供接口可以让应用程序去使用硬件,但是硬件资源的管理和安全控制由操作系统负责。 用户空间和内存空间 在计算机系统中,内存可以分为两大区域:内核空间(Ker…...
如何在 Postman 中上传图片并在请求中正确引用?
Postman 是一款常用的 API 测试工具,它不仅可以测试 API 的请求和响应,还支持多种数据格式包括图片。如何在 Postman 中传输图片? Postman 如何上传图片并在请求中使用教程...
平板实现 adb connect 连接的步骤
1. 检查设备的开发者选项 确保平板设备已开启开发者模式,并启用了USB调试。 2. 检查设备和电脑的网络连接 确保平板和电脑连接到同一个Wi-Fi网络,确认设备的 IP 地址是否正确。 通过 ping 命令测试: ping 192.168.3.243. 通过USB线进行初…...
安全+低碳+高效:Acrel-3000助力企业打造未来型电能管理体系-安科瑞黄安南
一 背景 电能因为方便传输、易于转换、便于控制等特性,成为广大企事业单位生产、办公最主要的能量来源。双碳背景下,由于电能清洁、高效、零排放的特点,能源消费侧将逐步以电代煤、以电代油、以电代气,形成以电为中心的能源消费体…...
专注自习室:番茄工作法实践
专注自习室:番茄工作法实践 我需要一个任务管理工具,但在网上找了很多都找不到合适的工具。市面上的大多数产品过于强调任务完成性,给我带来了很强的心理压力,这种压力最终反而降低了我的工作效率。于是我决定自己动手࿰…...
docker save如何迁移镜像更节省空间?
文章目录 方法一:使用docker save命令方法二:直接保存多个镜像到一个tar文件哪个方法更节省磁盘空间?空间效率对比实际测试示例其他优势结论 如何用脚本迁移加载镜像 迁移镜像时候,往往会碰到基础镜像相同的很多镜像需要迁移&…...
LeetCode算法题(Go语言实现)_16
题目 给定一个二进制数组 nums 和一个整数 k,假设最多可以翻转 k 个 0 ,则返回执行操作后 数组中连续 1 的最大个数 。 一、代码实现 func longestOnes(nums []int, k int) int {left, zeroCnt, maxLen : 0, 0, 0for right : 0; right < len(nums); …...
CORDIC算法:三角函数的硬件加速革命——从数学原理到FPGA实现的超高效计算方案
计算机该如何求解三角函数?或许你的第一印象是采用泰勒展开,或者采用多项式进行逼近。对于前者,来回的迭代计算开销成本很大;对于后者,多项式式逼近在较窄的范围內比较接近,超过一定范围后,就变…...
