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

一、技术栈

python 3.10.6  

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

pyaudio

keyboard

二、实现功能

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

三、实现代码

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_text
    with lock:
        recording = True
    print("开始录音,请说话...")
    try:
        while True:
            with lock:
                if not recording:
                    break
            data = 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()
                        break
    except Exception as e:
        print(f"录音过程中出现错误: {e}")

def stop_recognition():
    global recording, recognized_text
    with lock:
        if not recording:
            return
        recording = False
    print("停止录音")
    try:
        final_result = json.loads(rec.FinalResult())
        final_text = final_result.get("text", "")
        print("Final result:", final_text)
        # 累加最终识别的文本
        recognized_text += final_text
    except Exception as e:
        print(f"获取最终结果时出现错误: {e}")

    # 关闭音频流和 PyAudio
    try:
        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 recording
    if 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 
 

### 部署文字语音(TTS)模型的本地环境方法 为了实现文字语音(Text-to-Speech, TTS)功能,可以按照以下方式在本地环境中部署相关模型和服务。以下是基于 Windows 和 Linux 的两种常见部署方案。 #### 1. 在 Windows 系统上部署 ChatTTS 文字语音模型 对于 Windows 用户来说,可以通过详细的教程完成 ChatTTS 开源项目的本地化部署[^1]。具体操作如下: - **安装依赖项** 确保已安装 Python 及其开发环境,并配置好 pip 工具链。此外还需要安装 Git 来克隆项目仓库。 - **下载并初始化项目** 使用命令行工具执行以下指令来获取最新本代码以及所需资源文件: ```bash git clone https://github.com/your-repo-url/chat-tts.git cd chat-tts python setup.py install ``` - **运行服务端程序** 启动服务器之前可能需要调整部分参数设置,默认情况下会监听 localhost 地址上的特定端口提供 API 接口调用支持。 ```python from app import create_app if __name__ == "__main__": app = create_app() app.run(host='0.0.0.0', port=8080) ``` - **利用 Cpolar 实现外网访问** 如果希望突破局域网限制,则可借助第三方软件如 Cpolar 设置动态域名映射从而允许外部设备连接至内部主机实例。 #### 2. 基于 Linux 平台构建 Chat-TTS-UI 应用场景 针对熟悉 Unix-like 操作系统的开发者而言,官方文档也提供了详尽指导帮助他们顺利迁移至此类架构之上[^2]。主要流程概括如下: - 安装必要的包管理器组件; - 获取目标存储库副本并通过虚拟环境隔离生产环境影响; - 修改默认配置适配实际硬件条件差异; - 测试最终成果确认无误后再投入正式运营阶段。 上述两套解决方案均能有效达成预期目的——即让个人计算机具备独立处理自然语言输入进而输出对应音频片段的能力。不过需要注意的是,在实践过程中可能会遇到各种意想不到的技术难题,因此建议提前查阅相关资料做好充分准备。 ```python import os from flask import Flask app = Flask(__name__) @app.route('/') def home(): return 'Server is running!' if __name__ == '__main__': host_ip = os.getenv('HOST_IP', '127.0.0.1') server_port = int(os.getenv('SERVER_PORT', 5000)) app.run(debug=True, host=host_ip, port=server_port) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值