C#實現語音預處理:降噪/靜音檢測/自動增益

?無論是在音視頻錄制系統,還是音視頻通話系統、或視頻會議系統中,對從麥克風采集到的說話的聲音數據進行預處理,都是是非常必要的。

? ? ? 語音數據預處理主要包括:??降噪(Noise Reduction)、靜音檢測(Silence Detection/VAD)、自動增益(Automatic Gain Control, AGC)?? 。

一. 語音預處理的作用

 ? 我們先解釋一下,降噪、靜音檢測、自動增益,這些語音預處理分別起什么作用。

(1)降噪

? ? ? 降噪,用于消除背景噪聲,比如馬路車流聲、環境雜音等,以保留清晰的說話人聲。

? ? ? 更高級的,結合AI模型訓練,還可以消除電腦的風扇聲、鍵盤敲擊聲等等。

(2)靜音檢測

? ? ? 靜音檢測,又稱為語音活動檢測,用于識別音頻流中的靜音片段(沒有講話人聲),這樣可以簡化后續的編碼等環節,并可以節省傳遞所需要的帶寬。

(3)自動增益

? ? ? 自動增益,用于動態調整說話聲音的音量,使輸出電平保持穩定,以避免講話的聲音忽大忽小。

二. 實現語音預處理

? ? ? 接下來,我們使用C#實現一個Demo,這個Demo將從麥克風采集聲音數據,然后進行語音預處理,并且將處理后的聲音數據實時播放出來。Demo的運行效果如下圖所示:

? ? ??

? ? ? Demo 功能很簡單,那我們來具體看看代碼是如何實現的。

1. 創建采集器、預處理器、播放器

? ? ?麥克風聲音數據采樣率我們選擇16K、單聲道。?

WaveSampleRate sr = WaveSampleRate.S16k;
int channelCount = 1;//創建語音預處理器,開啟降噪、自動增益、靜音檢測
this.voicePreprocessor = CapturerFactory.CreateVoicePreprocessor(sr, channelCount, true ,true);
//創建麥克風采集器
this.microphoneCapturer = CapturerFactory.CreateMicrophoneCapturer(int.Parse(this.textBox_mic.Text), sr);
this.microphoneCapturer.AudioCaptured += new ESBasic.CbGeneric<byte[]>(microphoneCapturer_AudioCaptured);
//創建聲音播放器
this.audioPlayer = PlayerFactory.CreateAudioPlayer(int.Parse(this.textBox_speaker.Text), (int)sr, channelCount, 16, 2);                this.microphoneCapturer.Start();

 CreateVoicePreprocessor 方法的最后兩個參數可以指定在降噪的同時,是否開啟靜音檢測和自動增益功能。

2. 預處理語音數據

? ? ? 語音預處理器每次處理10ms的聲音數據,而現在的麥克風采集器每次采集的是20ms的PCM數據,所以,我們將其拆成兩個10ms數據,再提交給預處理器處理。

void microphoneCapturer_AudioCaptured(byte[] audioData)
{if (this.checkBox_enabled.Checked){//麥克風每次采集20ms數據,降噪器每次處理10ms數據。byte[] frame10ms1 = new byte[audioData.Length / 2];byte[] frame10ms2 = new byte[audioData.Length / 2];Buffer.BlockCopy(audioData, 0, frame10ms1, 0, frame10ms1.Length);Buffer.BlockCopy(audioData, frame10ms1.Length, frame10ms2, 0, frame10ms2.Length);this.HandleData(frame10ms1);this.HandleData(frame10ms2);return;}this.audioPlayer.Play(audioData);
}

(1)通過一個CheckBox勾選框來實時控制是否啟用語音預處理,這樣在測試時,就可以很方便的對比體驗開啟了語音預處理的效果。

(2)調用IVoicePreprocessor 的?Process 方法,就可以完成一幀語音數據(10ms)的預處理。如下所示:

private void HandleData(byte[] frame10ms)
{byte[] res = this.voicePreprocessor.Process(frame10ms);            if (res == null) //靜音幀{++this.silenceFrameCountTotal;this.audioPlayer.Play(this.voicePreprocessor.SlienceFrame);}else{this.audioPlayer.Play(res);}
}

  如果Process 方法返回的是null,表示檢測到該幀是靜音幀,于是,將內置的10ms靜音幀 SlienceFrame 提交給播放器去播放。

3. 統計靜音幀數量

  一個語音幀是10ms,那么1秒鐘就有100個語音幀,程序中,我們統計了上一秒出現了多少個靜音幀,并在UI左下方顯示出來。

private volatile int silenceFrameCountTotal = 0;
private volatile int silenceFrameCountPre = 0;
private void timer1_Tick(object sender, EventArgs e)
{int delt = this.silenceFrameCountTotal - this.silenceFrameCountPre;this.silenceFrameCountPre = this.silenceFrameCountTotal;//顯示上一秒靜音幀數量。this.label_silenceFrameCount.Text = delt.ToString();
}

 實際測試時可以發現,當不說話時,UI實時顯示1秒鐘出現的靜音幀是100個。

三. Demo源碼下載

? ? ? ? 源碼下載:VoicePreprocessDemo.rar

 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/84294.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/84294.shtml
英文地址,請注明出處:http://en.pswp.cn/web/84294.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

組合模式Composite Pattern

模式定義 又稱整體-部分模式 組合多個對象形成 樹形結構 以表示“整體-部分”的結構層次 組合模式對單個對象&#xff08;即葉子對象&#xff09;和組合對象&#xff08;即容器對象&#xff09;的使用具有一致性對象結構型模式 模式結構 Component&#xff1a;抽象構件Leaf&a…

商代大模型:智能重構下的文明曙光與青銅密碼

引言&#xff1a;技術奇點的歷史想象 在人類文明的長河中&#xff0c;技術的進步始終是推動社會變革的核心動力。從青銅冶煉到文字發明&#xff0c;從農業革命到工業革命&#xff0c;每一次技術飛躍都重塑了人類對世界的認知與生存方式。而如今&#xff0c;人工智能的崛起正以…

【Python】python系列之函數作用域

Python 系列文章學習記錄&#xff1a; Python系列之Windows環境安裝配置_開著拖拉機回家的博客-CSDN博客 Python系列之變量和運算符_開著拖拉機回家的博客-CSDN博客 Python系列之判斷和循環_開著拖拉機回家的博客-CSDN博客 Python系列之字符串和列表_開著拖拉機回家的博客…

Unity UI 核心類解析之Graphic

&#x1f9f1; Unity UI 核心類解析&#xff1a;Graphic 類詳解 一、什么是 Graphic&#xff1f; 在 Unity 的 UI 系統中&#xff0c;Graphic 是一個抽象基類&#xff0c;繼承自 UIBehaviour 并實現了 ICanvasElement 接口。它是所有可以被繪制到屏幕上的 UI 元素的基礎類。 …

【Elasticsearch】文檔遷移(Reindex)

文檔遷移 1.為什么要進行 reindex 操作2.Reindex 操作的本質3.實際案例3.1 同集群索引之間的全量數據遷移3.2 同集群索引之間基于特定條件的數據遷移3.2.1 源索引設置檢索條件3.2.2 基于 script 腳本的索引遷移3.2.3 基于預處理管道的數據遷移 3.3 不同集群之間的索引遷移3.4 查…

WordPress 區塊版面配置指南

WordPress 的區塊編輯器(Gutenberg)提供了靈活的版面配置選項&#xff0c;以下是主要配置方法&#xff1a; 基本區塊布局 添加區塊&#xff1a;點擊””按鈕或按”/”鍵快速插入區塊 常用內容區塊&#xff1a; 段落(Paragraph) 標題(Heading) 圖像(Image) 畫廊(Gallery)…

TensorFlow基礎之理解張量

2.理解張量 張量&#xff08;Tensors&#xff09;介紹 張量是物理和工程領域的基礎數學結構。但是過去張量很少在計算機科學里使用。它與離散數學和邏輯學有更多的聯系。隨著機器學習的出現&#xff0c;這種狀態開始顯著的改變&#xff0c;成為連續向量的計算基礎。現代機器學…

Flume 安裝與配置步驟

1.解壓 tar -zxvf apache-flume-1.9.0-bin.tar.gz 2.配置環境變量 vim /etc/profile export FLUME_HOME/home/wang/soft/flume/apache-flume-1.9.0-bin export PATH$PATH:$FLUME_HOME/bin source /etc/profile 3.創建必要的目錄 mkdir -p $FLUME_HOME/conf 4.創建 Flume 配置文…

還原線上 WebView 異常:手機端APP遠程調試

前端調試總被理解為開發階段的事&#xff0c;但在實際項目中&#xff0c;真正困難的調試往往發生在產品上線之后。用戶反饋“看不到內容”、“一直轉圈”、“點了沒反應”&#xff0c;而開發環境無法復現&#xff0c;測試機也正常運行&#xff0c;這時怎么定位、驗證和解決問題…

102頁滿分PPT | 汽車設備制造業企業信息化業務解決方案智能制造汽車黑燈工廠解決方案

這份文檔是一份汽車設備制造業企業信息化業務解決方案&#xff0c;詳細闡述了企業從生產到銷售的全流程信息化建設。針對企業目前手工管理為主、信息化程度低、數據追溯困難等問題&#xff0c;提出了建立統一信息化平臺的目標&#xff0c;涵蓋財務、業務、流程和數據的整合。方…

SQLite 表達式詳解

SQLite 表達式詳解 引言 SQLite 是一個輕量級的數據庫,廣泛用于移動設備和桌面應用程序。SQLite 的表達式是 SQL 語句的核心,它們用于查詢、更新和刪除數據庫中的數據。本文將詳細解釋 SQLite 的各種表達式,并探討它們在數據庫操作中的重要性。 表達式概述 在 SQLite 中…

沉浸式AI交互數字人技術解析

360智匯云沉浸式AI交互數字人支持開發者靈活接入和私有化部署大模型服務&#xff0c;構建面向業務場景的實時音視頻交互能力。系統集成了360智匯云自研的沉浸式AI交互數字人引擎與高性能 RTC 模塊&#xff0c;保障音視頻傳輸過程中的低延遲、高穩定性和高并發承載能力&#xff…

HarmonyOS 評論回復彈窗最佳實踐

HarmonyOS 評論回復彈窗最佳實踐 前言 在移動應用開發中&#xff0c;評論回復功能是一個常見且重要的交互場景。本文將詳細介紹如何在 HarmonyOS 中實現一個功能完善的評論回復彈窗&#xff0c;包括彈窗選型、富文本編輯、軟鍵盤適配等關鍵技術點。 功能概述 我們要實現的評…

Git 回退操作詳解:帶示例的“小白”指南

前言 在日常開發中&#xff0c;我們難免會遇到&#xff1a; 改錯代碼&#xff1a;推送之前才發現某些行根本就不該動提交錯誤&#xff1a;commit 信息打錯、提交到錯誤分支想回到之前版本&#xff1a;測試時發現之前版本是好的&#xff0c;需要回去查看 這就需要用到 Git 的…

redux以及react-redux

1.redux案例完整版 上一篇文章我們是沒有action文件&#xff0c;直接在countre組件與store以及reducer直接進行狀態的改變以及展示。 下面我們加上action文件&#xff0c;我們就不能直接通過dispatch傳&#xff0c;而是通過調用action里面的函數講我們傳入的參數變成action這種…

idea中配置svn及提交提示“未檢測到更改”提示

首先要安裝TortoiseSVN&#xff0c;選command line client tools&#xff1b; 在idea中&#xff0c;文件->設置->Subversion->如下圖 文件->設置->目錄映射->如下圖 初次導入到svn&#xff0c; 輸入服務器上的svn地址&#xff0c;等待成功即可&#xff1b;…

vue 實現dot-dropdown

<template><div class"app-container"><div class"mt30"></div><el-row :gutter"20"><!-- title --><!-- <div class"modt-box">導航管理</div> --><el-col :span"2&q…

使用 mysql2/promise 模塊返回以后,使用 await 返回數據總結

SELECT 返回結構 const [rows, fields] await db.query(SELECT * FROM folders);返回&#xff1a; rows: 是一個數組&#xff0c;包含所有查到的記錄。fields: 是字段的結構定義&#xff08;列信息&#xff09;&#xff0c;一般不用。 rows 是一個數組&#xff0c;包含所有…

Manus Metagloves pro高精度+無漂移+低延遲 ,重構VR/XR手部交互方式

manus metagloves pro是一款專為動畫制作、虛擬現實及游戲開發打造的高精度無線動作捕捉手套。采用先進的Quantum追蹤技術&#xff0c;實現毫米級動作捕捉&#xff0c;精準還原手指細節&#xff0c;顯著提升創作效率與交互真實感。 MANUS Metagloves Pro解鎖動捕 / 機器人 / XR…

Uniapp插件改造指南:如何讓vue-plugin支持HarmonyOS5原生能力?

一、分層架構設計 采用通用邏輯與平臺實現分離的三層結構&#xff1a; uni-plugin-harmony ├── common # 跨平臺通用層 │ ├── interfaces # 能力接口抽象&#xff08;如Scanner.ets&#xff09; │ └── utils # 工具類 ├── harmony …