实时采集到的语音进行语音识别

要在.NET Framework 4.8中使用C#实现离线实时语音识别,可以使用开源库Vosk(支持离线ASR)配合音频处理库NAudio。

步骤 1:安装依赖库
1.1.
安装NuGet包:
- Install-Package NAudio(处理音频输入)
- Install-Package Vosk(离线语音识别引擎)
2.2.
下载语音模型:
- 前往 Vosk Models 下载适合的模型(如小型英文模型 vosk-model-small-en-us-0.15)。
- 解压模型到项目目录(如 Models/vosk-model-small-en-us-0.15)。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NAudio.Wave;
using Vosk;
using System.Windows.Forms;
namespace 语音识别
{
public class RealTimeSpeechRecognizer
{
    private readonly VoskRecognizer _recognizer;
    private readonly WaveInEvent _waveIn;
    private readonly RichTextBox _rtb;

    public RealTimeSpeechRecognizer(string modelPath, RichTextBox rtb)
    {
        _rtb = rtb;

        // 初始化Vosk
        Model model = new Model(modelPath);
        _recognizer = new VoskRecognizer(model, 16000.0f);
        _recognizer.SetWords(true);

        // 初始化音频输入
        _waveIn = new WaveInEvent
        {
            WaveFormat = new WaveFormat(16000, 16, 1),
            DeviceNumber = 0
        };
        _waveIn.DataAvailable += OnAudioDataAvailable;
    }

    public void StartListening() => _waveIn.StartRecording();
    public void StopListening() => _waveIn.StopRecording();

    

    // 解析JSON结果(兼容部分结果)
    private string ParseJsonResult(string json, bool isPartial = false)
    {
        dynamic obj = Newtonsoft.Json.JsonConvert.DeserializeObject(json);
        return isPartial ? obj.partial : obj.text;
    }

    // 线程安全更新RichTextBox
    private void ShowText(string text)
    {
        if (_rtb.InvokeRequired)
        {
            _rtb.BeginInvoke(new Action<string>(ShowText), text);
        }
        else
        {
            _rtb.AppendText(text);
            _rtb.ScrollToCaret();
        }
    }

    // 其他字段和构造函数保持不变...
    private string _lastPartialText = string.Empty;

    

    private void OnAudioDataAvailable(object sender, WaveInEventArgs e)
    {
        if (_recognizer.AcceptWaveform(e.Buffer, e.BytesRecorded))
        {
            string result = ParseJsonResult(_recognizer.Result());
            ClearLastPartial(); // 清理临时部分
            AppendFinalText(result);
        }
        else
        {
            string partial = ParseJsonResult(_recognizer.PartialResult(), isPartial: true);
            UpdatePartialText(partial);
        }
    }

    private void UpdatePartialText(string newPartial)
    {
        if (newPartial == _lastPartialText) return;

        // 在主线程更新UI
        _rtb.BeginInvoke(new Action(() =>
        {
            int selectionStart = _rtb.TextLength - _lastPartialText.Length;

            // 删除旧临时内容
            if (selectionStart >= 0 && _lastPartialText.Length > 0)
            {
                _rtb.Select(selectionStart, _lastPartialText.Length);
                _rtb.SelectedText = "";
            }

            // 追加新内容
            _rtb.AppendText(newPartial);
            _rtb.ScrollToCaret();

            // 更新临时记录
            _lastPartialText = newPartial;
        }));
    }

    private void AppendFinalText(string text)
    {
        _rtb.BeginInvoke(new Action(() =>
        {
            _rtb.AppendText(text + "\n");
            _lastPartialText = string.Empty; // 重置临时部分
        }));
    }

    private void ClearLastPartial()
    {
        if (string.IsNullOrEmpty(_lastPartialText)) return;

        _rtb.BeginInvoke(new Action(() =>
        {
            int start = _rtb.TextLength - _lastPartialText.Length;
            if (start >= 0)
            {
                _rtb.Select(start, _lastPartialText.Length);
                _rtb.SelectedText = "";
            }
        }));
    }
}

}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 语音识别
{
public partial class Form1 : Form
{
private RealTimeSpeechRecognizer _recognizer;
public Form1()
{
InitializeComponent();
btnStop.Enabled = false;
}
    private void button1_Click(object sender, EventArgs e)
    {
        _recognizer.StopListening();
        btnStart.Enabled = true;
        btnStop.Enabled = false;
    }
    

    private void btnStart_Click(object sender, EventArgs e)
    {
        string modelPath = @"E:\Models\vosk-model-small-cn-0.22"; // 中文模型路径
        _recognizer = new RealTimeSpeechRecognizer(modelPath, richTextBox1);

        btnStart.Enabled = false;
        btnStop.Enabled = true;
        _recognizer.StartListening();
    }
}

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp+Vue3 组件之间的传值方法

一、父子传值&#xff08;props / $emit 、ref / $refs&#xff09; 1、props / $emit 父组件通过 props 向子组件传递数据&#xff0c;子组件通过 $emit 触发事件向父组件传递数据。 父组件&#xff1a; // 父组件中<template><view class"container">…

Kafka×DeepSeek:智能决策破取经八十一难!

《西游记》的故事中&#xff0c;唐僧师徒四人历经九九八十一难&#xff0c;从东土大唐前往西天取经。一路上&#xff0c;火焰山酷热难耐、通天河水位忽高忽低、妖怪神出鬼没…… 现在&#xff0c;唐僧师徒取经路上的种种难题&#xff0c;在KafkaDeepSeek双引擎加持下有了全新解…

C# 委托使用详解

总目录 前言 在C#中&#xff0c;委托&#xff08;Delegate&#xff09; 是一种类型安全的函数指针机制&#xff0c;它允许我们将方法作为参数传递给其他方法&#xff0c;或者将方法存储在变量中。委托在 C# 中有广泛的应用&#xff0c;特别是在事件处理、异步编程和回调机制中…

axure11安装教程包含下载、安装、汉化、授权(附安装包)图文详细教程

文章目录 前言一、axure11安装包下载二、axure11安装教程1.启动安装程序2.安装向导界面3.安装协议协议页面2.选择安装位置3.开始安装4.完成安装 三、axure11汉化教程1.axure11汉化包2.axure11汉化设置 四、axure11授权教程1.打开axure112.设置使用方式3.输入许可证号4.axure11安…

如何使用Opentelemetry+jaeger对Go与Java项目实现分布式链路追踪

本文介绍![如何使用Opentelemetryjaeger实现分布式链路追踪] 关于opentelemetry的介绍可以看下面的文章 https://blog.csdn.net/qq_62368250/article/details/143516314本文中相关图片以及源代码地址 https://github.com/wuchenyanghaoshuai/others/blob/main/step39/README.…

【数据分享】2001-2024年我国逐年植被净初级生产力(NPP)数据

植被净初级生产力&#xff08;Net Primary Productivity&#xff0c;NPP&#xff09;是生态学中的一个重要概念&#xff0c;表示单位面积植被在特定时间内吸收的净光合有机物&#xff0c;是衡量生态系统中植物通过光合作用所产生的有机物质减去植物呼吸作用消耗的有机物质的量&…

靶场(七)---靶场精做小白思考

启程&#xff1a; 先扫一遍全端口发现&#xff0c;有很多tcp端口全部被关闭了&#xff0c;于是我又去看看他们的udp端口&#xff0c;发现也是半死不活的样子&#xff0c;那没办法只能把udp端口当作备选方案&#xff08;其实这个udp什么用都没有就是关闭的状态不用关&#xff0…

Linux开发工具----vim

目录 Linux编辑器-vim使用 1. vim的基本概念 正常/普通/命令模式(Normal mode) 插入模式(Insert mode) 底行模式(last line mode) 2. vim的基本操作 3. vim正常模式命令集 4. vim底行模式命令集 5. vim操作总结 (本篇文章相当于vim常用命令字典) Linux编辑器-vim使用 我们先来看…

【设计模式】设计模式的分类与组织

文章目录 前言一、设计模式的分类1. 目的准则2. 范围准则 二、设计模式的细分1.创建型模式的细分2.结构型模式的细分3.行为型模式的细分 三、设计模式的关联结论 前言 在软件开发中&#xff0c;设计模式是一种解决特定问题的最佳实践。由于设计模式种类繁多&#xff0c;理解它…

Vue3实战学习(Element-Plus常用组件的使用(输入框、下拉框、单选框多选框、el-image图片))(上)(5)

目录 一、Vue3工程环境配置、项目基础脚手架搭建、Vue3基础语法、Vue3集成Element-Plus的详细教程。(博客链接如下) 二、Element-Plus常用组件使用。 &#xff08;1&#xff09;el-input。(input输入框) <1>正常状态的el-input。 <2>el-input的disable状态。 <3…

AttributeError: module ‘backend_interagg‘ has no attribute ‘FigureCanvas‘

AttributeError: module backend_interagg has no attribute FigureCanvas 这个错误通常是由于 Matplotlib 的后端配置问题引起的。具体来说&#xff0c;Matplotlib 在尝试加载某个后端时&#xff0c;发现该后端模块中缺少必要的属性&#xff08;如 FigureCanvas&#xff09;&a…

网络安全基础与应用习题 网络安全基础答案

1.列出并简要给出SSH的定义。 正确答案&#xff1a; 答&#xff1a;6.10传输层协议&#xff1a;提供服务器身份验证、数据保密性和数据完整性&#xff0c;并具有前向保密性&#xff08;即&#xff0c;如果在一个会话期间密钥被破坏&#xff0c;则知识不会影响早期会话的安全性&…

文件上传复现

1、什么是文件上传漏洞&#xff1f; 答&#xff1a;文件上传漏洞是指攻击者通过上传恶意文件到服务器、从而执行任意代码、获取系统权限或者破坏系统安全的漏洞、常见于允许用户上传文件的Web应用程序中。 2. 文件上传漏洞形成原因 未验证文件类型&#xff1a;未对上传文件的…

【网络安全工程】任务12:网络安全设备

目录 一、防火墙​ 1、作用​ 2、配置方式​ 3、存在的漏洞​ 二、入侵检测系统&#xff08;IDS&#xff09;和入侵防御系统&#xff08;IPS&#xff09;​ 1、作用​ 2、配置方式​ 3、存在的漏洞​ 三、防病毒网关​ ​1、作用​ 2、配置方式​ 3、存在的漏洞​ …

Docker容器与宿主机目录映射深度解析

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 一、Docker容器与宿主机目录映射基础原理 在深入了解如何查询 Docker 容器目录在宿主机的映射目录之前&#xff0c;有必要先明晰其背后的基础原理。Docker 容器通过挂载&#xff08;mount&#xff09;机制将宿主机的…

DeepSeek+Maxkb+Ollama+Docker搭建一个AI问答系统

DeepSeekMaxkbOllamaDocker搭建一个AI问答系统 文章目录 DeepSeekMaxkbOllamaDocker搭建一个AI问答系统前言一、创建同一内网的网络二、拉取两个镜像三、启动Ollama以及调试Maxkb4.Maxkb创建一个应用并建立知识库5、应用效果总结 前言 我觉得只要是使用Docker技术&#xff0c;…

决策树,Laplace 剪枝与感知机

1.决策树 决策树是一种用于分类任务的监督学习算法。它基于特征的划分来做出决策&#xff0c;每个节点表示一个特征&#xff0c;每条分支代表该特征的可能取值&#xff0c;每个叶子节点代表分类结果。 用通俗的话来说&#xff0c;决策树就像一个**"如果……那么……&quo…

使用DeepSeek+蓝耘快速设计网页简易版《我的世界》小游戏

前言&#xff1a;如今&#xff0c;借助先进的人工智能模型与便捷的云平台&#xff0c;即便是新手开发者&#xff0c;也能开启创意游戏的设计之旅。DeepSeek 作为前沿的人工智能模型&#xff0c;具备强大的功能与潜力&#xff0c;而蓝耘智算云平台则为其提供了稳定高效的运行环境…

标准卷积(Standard Convolution)

标准卷积的基础操作图解&#xff1a; 卷积之后尺寸公式&#xff1a; 输入尺寸&#xff1a;WH卷积核尺寸&#xff1a;Fw​Fh​填充大小&#xff1a;P步长&#xff1a;S 输出尺寸 WoutHout可以通过以下公式计算&#xff1a; 其中[x]表示向下取整。 实例&#xff1a; 输入图像…

使用 Elastic-Agent 或 Beats 将 Journald 中的 syslog 和 auth 日志导入 Elastic Stack

作者&#xff1a;来自 Elastic TiagoQueiroz 我们在 Elastic 一直努力将更多 Linux 发行版添加到我们的支持矩阵中&#xff0c;现在 Elastic-Agent 和 Beats 已正式支持 Debian 12&#xff01; 本文演示了我们正在开发的功能&#xff0c;以支持使用 Journald 存储系统和身份验…