python实践-实现实时语音转文字本地部署版(二)

server/2025/2/22 4:55:59/

一、技术栈

python 3.10.6  

vosk 需下载对应模型(vosk-model-cn-0.22)模型下载慢的同学看最后的资源链接。

pyaudio

keyboard

二、实现功能

本地化实现麦克风语音录入,实时生成文字,并保存至本地文档。

三、实现代码

python">from vosk import Model, KaldiRecognizer
import pyaudio  # 用于实时音频输入
import json  # 用于解析识别结果
import keyboard
import threading
import sys  # 引入 sys 模块用于退出程序# 指向模型根目录
model_path = "D:/2.DevEnv/vosk/vosk-model-cn-0.22"  # 注意路径使用正斜杠或双反斜杠
model = Model(model_path)
rec = KaldiRecognizer(model, 16000)  # 采样率设为 16000,与模型匹配# 初始化 PyAudio
p = pyaudio.PyAudio()# 打开音频流
stream = p.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=4000)
stream.start_stream()recording = False
lock = threading.Lock()# 定义结束关键词
END_KEYWORDS = ["结束", "停止"]
# 用于存储识别出来的文本
recognized_text = ""def start_recognition():global recording, recognized_textwith lock:recording = Trueprint("开始录音,请说话...")try:while True:with lock:if not recording:breakdata = stream.read(4000)if rec.AcceptWaveform(data):result = json.loads(rec.Result())text = result.get("text", "")print(text)# 累加识别的文本recognized_text += text + " "# 检查是否包含结束关键词for keyword in END_KEYWORDS:if keyword in text:stop_recognition()breakexcept Exception as e:print(f"录音过程中出现错误: {e}")def stop_recognition():global recording, recognized_textwith lock:if not recording:returnrecording = Falseprint("停止录音")try:final_result = json.loads(rec.FinalResult())final_text = final_result.get("text", "")print("Final result:", final_text)# 累加最终识别的文本recognized_text += final_textexcept Exception as e:print(f"获取最终结果时出现错误: {e}")# 关闭音频流和 PyAudiotry:stream.stop_stream()stream.close()p.terminate()except Exception as e:print(f"关闭音频流时出现错误: {e}")# 保存识别的文本到文件try:with open('recognized_text.txt', 'w', encoding='utf-8') as file:file.write(recognized_text)print("识别的文本已保存到 recognized_text.txt")except Exception as e:print(f"保存文件时出现错误: {e}")# 终止程序运行sys.exit(0)def on_space_press(event):global recordingif event.name == 'space':with lock:if not recording:thread = threading.Thread(target=start_recognition)thread.start()else:stop_recognition()# 监听空格键事件
keyboard.on_press(on_space_press)print("按空格键开始识别,说 '结束' 或 '停止' 来结束录音。")
keyboard.wait()

四、结果展示

五、相关资源

vosk模型下载链接: https://pan.baidu.com/s/13WAE_kRwd09I5JMbQjtnMw?pwd=bwtj 提取码: bwtj 
 


http://www.ppmy.cn/server/169757.html

相关文章

自制简单的图片查看器(python)

图片格式:支持常见的图片格式(JPG、PNG、BMP、GIF)。 import os import tkinter as tk from tkinter import filedialog, messagebox from PIL import Image, ImageTkclass ImageViewer:def __init__(self, root):self.root rootself.root.…

vue2和vue3的按需引入的详细对比通俗易懂

以下是 Vue2 与 Vue3 按需引入的对比详解,用最简单的语言和场景说明差异: 一、按需引入的本质 目标:只打包项目中实际用到的代码(组件、API),减少最终文件体积。类比:去餐厅点餐,只…

< OS 有关 > Ubuntu 24 SSH 服务器更换端口 in jp/us VPSs

原因: 两台 VPS 的 ssh 端口一直被密码重试, us 这台已经封了 632, jp 这台两周前清过一次 sqlite3 数据,现在赞到 1008 Fail2Ban 是使用 sqlite3 来记录,数据量大后,硬盘的 I/O 会飙升,我有写过一个 app…

10个Kettle(Pentaho Data Integration)基础概念面试题及答案

10个Kettle(Pentaho Data Integration)基础概念面试题及答案 1. 什么是Kettle? 答案: Kettle(现称Pentaho Data Integration,PDI)是一款开源的ETL(Extract, Transform, Load&#…

springsecurity自定义认证

// jwt 方式 package com.kongjs.note.system.convert;import com.kongjs.note.admin.model.dto.TokenInfoDTO; import com.kongjs.note.admin.service.TokenService; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; import lombok.ext…

js 打开新标签页和关闭标签页

window.open(url, _blank),blank属性可以在新标签打开 window.open 直接调用可能会有拦截提示,在用户交互事件时调用不会出现拦截 由window.open 打开的新的标签页或弹窗可以由window.close关闭 window.open会返回一个 WindowProxy 对象。只要符合同源…

【云原生】最新版Kubernetes集群基于Containerd部署

文章目录 Kubernetes集群基于Containerd部署(单主多从模式)资源列表基础环境一、基础环境准备1.1、关闭Swap分区1.2、添加hosts解析1.3、桥接的IPv4流量传递给iptables的链 二、准备Containerd容器运行时2.1、安装Containerd2.2、配置Containerd2.3、启动Containerd 三、部署Ku…

【蓝桥杯集训·每日一题2025】 AcWing 6123. 哞叫时间 python

6123. 哞叫时间 Week 1 2月18日 农夫约翰正在试图向埃尔茜描述他最喜欢的 USACO 竞赛,但她很难理解为什么他这么喜欢它。 他说「竞赛中我最喜欢的部分是贝茜说 『现在是哞哞时间』并在整个竞赛中一直哞哞叫」。 埃尔茜仍然不理解,所以农夫约翰将竞赛以…