当前位置: 首页 > article >正文

C#语音录制:使用NAudio库实现语音录制功能详解

C#语音录制:使用NAudio库实现语音录制功能详解

在音频处理领域,C# 凭借其强大的生态系统和丰富的类库,为开发者提供了便捷的开发工具。NAudio 库就是其中一款用于音频处理的优秀开源库,它支持多种音频格式和音频设备操作。今天,我们将深入分析一段基于 NAudio 库实现语音录制功能的 C# 代码,带你了解语音录制背后的技术细节。
这段代码定义了一个名为SpeechRecorder的类,它负责完成语音录制的核心功能,包括设备查找、音量设置、录音开始与停止,以及将录制的音频数据写入文件。此外,该类还提供了一个RecordingStopped事件,用于在录音停止时通知外部代码。

一、关键代码解析

1. 命名空间与类定义

using NAudio.CoreAudioApi;
using NAudio.Wave;
using System;
using System.Collections.Generic;
using System.Linq;
public class SpeechRecorder
{// 省略部分代码
}

代码开头引入了NAudio.CoreAudioApiNAudio.Wave等命名空间,这些命名空间包含了 NAudio 库中用于音频设备管理和音频流处理的关键类。SpeechRecorder类则是整个语音录制功能的核心载体。

2. 字段与构造函数

public event EventHandler<StoppedEventArgs> RecordingStopped;
private readonly string fileName;
public SpeechRecorder(string fileName)
{this.fileName = fileName;
}

RecordingStopped事件用于在录音停止时触发,外部代码可以通过订阅该事件来执行相关操作。fileName字段用于存储录制音频文件的路径,构造函数接收该路径作为参数,方便后续将录制的音频数据写入指定文件。

3. 设备与音量设置

private void SetMicrophoneVolume(int volume)
{var devices = FindDevices();foreach (var device in devices){device.AudioEndpointVolume.MasterVolumeLevelScalar = volume / 100.0f;}
}public static IEnumerable<MMDevice> FindDevices()
{return new MMDeviceEnumerator().EnumerateAudioEndPoints(DataFlow.Capture, DeviceState.Active);
}public static bool Existed()
{var devices = FindDevices();return devices.Any();
}

FindDevices方法使用MMDeviceEnumerator类枚举所有处于活动状态的音频捕获设备(通常是麦克风)。SetMicrophoneVolume方法通过调用FindDevices获取设备列表,然后设置每个设备的音量,音量范围为 0 到 100,通过MasterVolumeLevelScalar属性进行设置,该属性值为 0 到 1 之间的浮点数,所以将传入的音量值除以 100 进行转换。Existed方法用于判断是否存在可用的音频捕获设备。

4. 录音开始与停止

public void Start()
{this.SetMicrophoneVolume(100);this.source = new WaveIn{WaveFormat = new WaveFormat(16000, 16, 1)};this.source.DataAvailable += WaveSourceDataAvailable;this.source.RecordingStopped += WaveSourceRecordingStopped;this.writer = new WaveFileWriter(fileName, source.WaveFormat);this.source.StartRecording();
}public void Stop()
{this.source?.StopRecording();
}

Start方法是录音功能的启动入口。首先调用SetMicrophoneVolume将麦克风音量设置为 100,然后创建一个WaveIn对象,设置其音频格式为采样率 16000Hz、16 位量化、单声道。接着为WaveIn对象的DataAvailable事件和RecordingStopped事件绑定处理方法,并创建WaveFileWriter对象用于将录制的音频数据写入指定文件,最后调用StartRecording方法开始录音。Stop方法则用于停止录音,通过调用WaveIn对象的StopRecording方法实现。

5. 音频数据处理与录音结束处理

private void WaveSourceDataAvailable(object sender, WaveInEventArgs e)
{if (writer != null){writer.Write(e.Buffer, 0, e.BytesRecorded);writer.Flush();}
}private void WaveSourceRecordingStopped(object sender, StoppedEventArgs e)
{if (source != null){source.Dispose();source = null;}if (writer != null){writer.Close();writer.Dispose();writer = null;}this.OnRecordingStopped(sender, e);
}protected void OnRecordingStopped(object sender, StoppedEventArgs e)
{this.RecordingStopped?.Invoke(sender, e);
}

WaveSourceDataAvailable方法在WaveIn对象有音频数据可用时触发,它将接收到的音频数据写入WaveFileWriter对象,并调用Flush方法确保数据及时写入文件。WaveSourceRecordingStopped方法在录音停止时触发,负责释放WaveInWaveFileWriter对象占用的资源,并调用OnRecordingStopped方法触发RecordingStopped事件。OnRecordingStopped方法则是触发RecordingStopped事件的实际执行方法。

二、实际应用与拓展

这段代码提供了一个基础的语音录制功能框架,在实际应用中,可以根据需求进行拓展。例如,添加更多的音频格式支持,通过修改WaveFormat参数实现;或者增加录音时长限制、实时音频可视化等功能。同时,在处理音频设备和文件操作时,要注意异常处理,确保程序的稳定性和健壮性。

通过对这段代码的分析,相信你对使用 NAudio 库在 C# 中实现语音录制功能有了更深入的理解。希望这篇博客能为你的音频处理开发工作提供帮助,如果你在实际应用中遇到问题,欢迎在评论区交流讨论!

以上博客详细剖析了语音录制代码。你若觉得某些部分需补充,或想加入其他功能的代码解析,欢迎随时告诉我。

相关文章:

C#语音录制:使用NAudio库实现语音录制功能详解

C#语音录制&#xff1a;使用NAudio库实现语音录制功能详解 在音频处理领域&#xff0c;C# 凭借其强大的生态系统和丰富的类库&#xff0c;为开发者提供了便捷的开发工具。NAudio 库就是其中一款用于音频处理的优秀开源库&#xff0c;它支持多种音频格式和音频设备操作。今天&a…...

[蓝桥杯]缩位求和

缩位求和 题目描述 在电子计算机普及以前&#xff0c;人们经常用一个粗略的方法来验算四则运算是否正确。 比如&#xff1a;248153720248153720 把乘数和被乘数分别逐位求和&#xff0c;如果是多位数再逐位求和&#xff0c;直到是 1 位数&#xff0c;得 24814>14524814…...

MySQ-8.42 MGR 组复制部署及详解

目录 1 MGR要求 2 操作系统信息和软件版本 3 集群架构图 4 MySQL MGR 主库部署步骤 1 MGR要求 InnoDB 存储引擎 表上必须存在主键或唯一非空索引 MGR可允许的最大节点9个 2 操作系统信息和软件版本 rootu24-mysql-mgr-42:~# cat /etc/issue Ubuntu 24.04.2 LTS \n \l mysql…...

css使用scoped之后样式失效问题

项目中的vue代码原本用的style标签来写css&#xff0c;现在想改成<style langscss scoped>&#xff0c;但是改完之后发现样式不对&#xff1a; 原来是&#xff1a; 将style改成scoped之后变成了&#xff1a;检查发现是之前定义的一些变量无法被识别&#xff0c;导致这些样…...

【NLP】将 LangChain 与模型上下文协议 (MCP) 结合使用

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…...

使用NMEA Tools生成GPS轨迹图

前言 在现代科技快速发展的时代&#xff0c;GPS定位技术已经广泛应用于各种领域&#xff0c;如导航、物流、运动追踪等。为了获取和分析GPS数据&#xff0c;我们常常需要使用一些专业的工具。本文将详细介绍如何使用一款名为“NMEA Tools”的APK应用&#xff0c;结合GPSVisual…...

1. pytorch手写数字预测

1. pytorch手写数字预测 1.背景2.准备数据集2.定义模型3.dataloader和训练4.训练模型5.测试模型6.保存模型 1.背景 因为自身的研究方向是多模态目标跟踪&#xff0c;突然对其他的视觉方向产生了兴趣&#xff0c;所以心血来潮的回到最经典的视觉任务手写数字预测上来&#xff0…...

vs中添加三方库的流程

在Visual Studio&#xff08;VS&#xff09;中添加第三方库&#xff08;如OpenCV、PCL等&#xff09;的流程可以分为以下几个步骤&#xff1a;安装库、配置项目、编写代码。以下是详细的步骤说明&#xff1a; 1. 安装第三方库 首先&#xff0c;需要下载并安装所需的第三方库。…...

JAVASE面相对象进阶之static

JavaSE 面向对象进阶之 static 一、static 的核心作用 static 是 Java 中用于修饰成员&#xff08;属性/方法&#xff09;的关键字&#xff0c;作用是让成员与类直接关联&#xff0c;而非依赖对象存在。 二、static 修饰属性&#xff08;静态变量&#xff09; 特点&#xf…...

深入解析 Redis Cluster 架构与实现(一)

#作者&#xff1a;stackofumbrella 文章目录 Redis Cluster特点Redis Cluster与其它集群模式的区别集群目标性能hash tagsMutli-key操作Cluster Bus安全写入&#xff08;write safety&#xff09;集群节点的属性集群拓扑节点间handshake重定向与reshardingMOVED重定向ASK重定向…...

(12)java+ selenium->元素定位大法之By_link_text

1.简介 本章节介绍元素定位中的link_text,顾名思义是通过链接定位的(官方说法:超链接文本定位)。什么是link_text呢,就是我们在任何一个网页上都可以看到有一个或者多个链接,上面有一个文字描述,点击这个文字,就可以跳转到其他页面。这个就是link_Text。 注意:link_t…...

数据库MySQL集群MGR

一、MGR原理 一、基本定义 MGR&#xff08;MySQL Group Replication&#xff09; 是 MySQL 官方推出的一种高可用、高可靠的数据库集群解决方案&#xff0c;基于分布式系统理论&#xff08;如 Paxos 协议变种&#xff09;实现&#xff0c;主要用于构建强一致性的主从复制集群…...

Ubuntu22.04 安装 ROS2 Humble

ROS2 Documentation: Humble Ubuntu 22.04 对应的 ROS 2 版本是 ROS 2 Humble Hawksbill (LTS)。 1.设置系统区域 确保区域设置支持UTF-8 sudo apt update && sudo apt install locales sudo locale-gen en_US en_US.UTF-8 sudo update-locale LC_ALLen_US.UTF-8 L…...

Spring Boot,注解,@RestController

RestController 是 Spring MVC 中用于创建 RESTful Web 服务的核心注解。 RestController 核心知识点 REST 作用: RestController 是一个方便的组合注解&#xff0c;它结合了 Controller 和 ResponseBody 两个注解。 Controller: 将类标记为一个控制器&#xff0c;使其能够处理…...

C++中新式类型转换static_cast、const_cast、dynamic_cast、reinterpret_cast

C中新式类型转换static_cast、const_cast、dynamic_cast、reinterpret_cast 在C中&#xff0c;新式类型转换&#xff08;也称为强制类型转换&#xff09;是C标准引入的一种更安全、更明确的类型转换方式&#xff0c;用以替代C语言风格的类型转换。C提供了四种新式类型转换操作…...

AXI 协议补充(二)

axi协议存在slave 和master 之间的数据交互,在ahb ,axi-stream 高速接口 ,叠加大位宽代码逻辑中,往往有时序问题,valid 和ready 的组合电路中的问题引发的时序问题较多。 本文根据axi 协议和现有解决反压造成的时序问题的方法做一个详细的科普。 1. 解决时序问题的方法:…...

Linux 基础指令入门指南:解锁命令行的实用密码

文章目录 引言&#xff1a;Linux 下基本指令常用选项ls 指令pwd 命令cd 指令touch 指令mkdir 指令rmdir 指令 && rm 指令man 指令cp 指令mv 指令cat 指令more 指令less 指令head 指令tail 指令date 指令cal 指令find 指令按文件名搜索按文件大小搜索按修改时间搜索按文…...

标准精读:2025 《可信数据空间 技术架构》【附全文阅读】

《可信数据空间 技术架构》规范了可信数据空间的技术架构,明确其作为国家数据基础设施的定位,以数字合约和使用控制技术为核心,涵盖功能架构(含服务平台与接入连接器的身份管理、目录管理、数字合约管理等功能)、业务流程(登记、发现、创建空间及数据流通利用)及安全要求…...

山东大学软件学院项目实训-基于大模型的模拟面试系统-面试官和面试记录的分享功能(2)

本文记录在发布文章时&#xff0c;可以添加自己创建的面试官和面试记录到文章中这一功能的实现。 前端 首先是在原本的界面的底部添加了两个多选框&#xff08;后期需要美化调整&#xff09; 实现的代码&#xff1a; <el-col style"margin-top: 1rem;"><e…...

Webug4.0靶场通关笔记05- 第5关SQL注入之过滤关键字

目录 一、代码审计 1、源码分析 2、SQL注入分析 &#xff08;1&#xff09;大小写绕过 &#xff08;2&#xff09;双写绕过 二、第05关 过滤型注入 1、进入靶场 2、sqlmap渗透 &#xff08;1&#xff09;bp抓包保存报文 &#xff08;2&#xff09;sqlmap渗透 &…...

ONLYOFFICE文档API:更强的安全功能

在数字化办公时代&#xff0c;文档的安全性与隐私保护已成为企业和个人用户的核心关切。如何确保信息在存储、传输及协作过程中的安全&#xff0c;是开发者与IT管理者亟需解决的问题。ONLYOFFICE作为一款功能强大的开源办公套件&#xff0c;不仅提供了高效的文档编辑与协作体验…...

深入浅出MQTT协议:从物联网基础到实战应用全解析

深入浅出MQTT协议&#xff1a;从物联网基础到实战应用全解析 作为一名在物联网领域摸爬滚打多年的老程序员&#xff0c;今天来和大家聊聊物联网通信中最核心的技术之一——MQTT协议。无论是Java后端开发还是嵌入式硬件开发&#xff0c;掌握MQTT都能让你在物联网项目中如鱼得水…...

解析楼宇自控系统:分布式结构的核心特点与优势展现

在建筑智能化发展的进程中&#xff0c;楼宇自控系统作为实现建筑高效运行与管理的关键&#xff0c;其系统结构的选择至关重要。传统的集中式楼宇自控系统在面对日益复杂的建筑环境和多样化的管理需求时&#xff0c;逐渐暴露出诸多弊端&#xff0c;如可靠性低、扩展性差、响应速…...

C#数字图像处理(三)

文章目录 前言1.图像平移1.1 图像平移定义1.2 图像平移编程实例 2.图像镜像2.1 图像镜像定义2.2 图像镜像编程实例 3.图像缩放3.1 图像缩放定义3.2 灰度插值法3.3 图像缩放编程实例 4.图像旋转4.1 图像旋转定义4.2 图像旋转编程实例 前言 在某种意义上来说&#xff0c;图像的几…...

STM32 智能小车项目 L298N 电机驱动模块

今天开始着手做智能小车的项目了 在智能小车或机器人项目中&#xff0c;我们经常会听到一个词叫 “H 桥电机驱动”&#xff0c;尤其是常见的 L298N 模块&#xff0c;就是基于“双 H 桥”原理设计的。那么&#xff0c;“H 桥”到底是什么&#xff1f;为什么要用“双 H 桥”来驱动…...

SQL Transactions(事务)、隔离机制

目录 Why Transactions? Example: Bad Interaction Transactions ACID Transactions COMMIT ROLLBACK How the Transaction Log Works How Data Is Stored Example: Interacting Processes Interleaving of Statements Example: Strange Interleaving Fixing the…...

【动画】unity中实现骨骼蒙皮动画

我是一名资深的游戏客户端&#xff0c;没事的时候我就想手搓轮子 本文目标 搓一个骨骼动画的核心实现&#xff0c;促进理解骨骼动画本质 骨骼动画简介 官方解释上网搜或者问豆包 快速理解 想知道骨骼动画怎么个事要先知道模型是怎么个事 简单来说&#xff1a;模型 顶点数…...

VSCODE的终端无法执行npm命令

问题原因&#xff1a;PowerShell 默认可能限制脚本执行。 解决方法&#xff1a; 在 PowerShell 中运行以下命令&#xff0c;查看当前策略&#xff1a; Get-ExecutionPolicy 如果结果是 Restricted&#xff0c;改为 RemoteSigned&#xff1a; Set-ExecutionPolicy RemoteSigne…...

Langchian - 自定义提示词模板 提取结构化的数据

场景:从自然语言中提取固定结构信息返回 例如:根据一段文字,提取文字中人的具体特征 马路上走来一个1米7的女生,她一头乌黑的长发披在肩上随风飘动,在她旁边的是她的男朋友,叫:刘山;比她高10厘米 如果想要提取上面这句话中人的身高及头发的颜色,并以固定的格式返回,…...

【机器学习基础】机器学习入门核心:Jaccard相似度 (Jaccard Index) 和 Pearson相似度 (Pearson Correlation)

机器学习入门核心&#xff1a;Jaccard相似度 &#xff08;Jaccard Index&#xff09; 和 Pearson相似度 &#xff08;Pearson Correlation&#xff09; 一、算法逻辑Jaccard相似度 (Jaccard Index)**Pearson相似度 (Pearson Correlation)** 二、算法原理与数学推导1. Jaccard相…...