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 = model
self.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:
break
if self.rec.AcceptWaveform(data):
result = self.rec.Result()
result_dict = json.loads(result)
text = result_dict.get("text", "")
if text:
return text
return None
# Tkinter 窗口模块
class InteractiveTextApp:
def __init__(self, root):
self.root = root
self.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 = app
self.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})
break
if 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 等