欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于C#實(shí)現(xiàn)語(yǔ)音預(yù)處理

 更新時(shí)間:2025年06月20日 08:38:41   作者:zhuweisky  
無(wú)論是在音視頻錄制系統(tǒng),還是音視頻通話系統(tǒng)或視頻會(huì)議系統(tǒng)中,對(duì)從麥克風(fēng)采集到的說(shuō)話的聲音數(shù)據(jù)進(jìn)行預(yù)處理,都是是非常必要的,下面就跟隨小編一起來(lái)學(xué)習(xí)一下如何使用C#實(shí)現(xiàn)語(yǔ)音預(yù)處理吧

 無(wú)論是在音視頻錄制系統(tǒng),還是音視頻通話系統(tǒng)、或視頻會(huì)議系統(tǒng)中,對(duì)從麥克風(fēng)采集到的說(shuō)話的聲音數(shù)據(jù)進(jìn)行預(yù)處理,都是是非常必要的。

語(yǔ)音數(shù)據(jù)預(yù)處理主要包括:??降噪(Noise Reduction)、靜音檢測(cè)(Silence Detection/VAD)、自動(dòng)增益(Automatic Gain Control, AGC)?? 。

一. 語(yǔ)音預(yù)處理的作用

我們先解釋一下,降噪、靜音檢測(cè)、自動(dòng)增益,這些語(yǔ)音預(yù)處理分別起什么作用。

(1)降噪

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

更高級(jí)的,結(jié)合AI模型訓(xùn)練,還可以消除電腦的風(fēng)扇聲、鍵盤敲擊聲等等。

(2)靜音檢測(cè)

靜音檢測(cè),又稱為語(yǔ)音活動(dòng)檢測(cè),用于識(shí)別音頻流中的靜音片段(沒(méi)有講話人聲),這樣可以簡(jiǎn)化后續(xù)的編碼等環(huán)節(jié),并可以節(jié)省傳遞所需要的帶寬。

(3)自動(dòng)增益

自動(dòng)增益,用于動(dòng)態(tài)調(diào)整說(shuō)話聲音的音量,使輸出電平保持穩(wěn)定,以避免講話的聲音忽大忽小。

二. 實(shí)現(xiàn)語(yǔ)音預(yù)處理

接下來(lái),我們使用C#實(shí)現(xiàn)一個(gè)Demo,這個(gè)Demo將從麥克風(fēng)采集聲音數(shù)據(jù),然后進(jìn)行語(yǔ)音預(yù)處理,并且將處理后的聲音數(shù)據(jù)實(shí)時(shí)播放出來(lái)。Demo的運(yùn)行效果如下圖所示:

Demo 功能很簡(jiǎn)單,那我們來(lái)具體看看代碼是如何實(shí)現(xiàn)的。

1. 創(chuàng)建采集器、預(yù)處理器、播放器

麥克風(fēng)聲音數(shù)據(jù)采樣率我們選擇16K、單聲道。 

WaveSampleRate sr = WaveSampleRate.S16k;
int channelCount = 1;

//創(chuàng)建語(yǔ)音預(yù)處理器,開(kāi)啟降噪、自動(dòng)增益、靜音檢測(cè)
this.voicePreprocessor = CapturerFactory.CreateVoicePreprocessor(sr, channelCount, true ,true);
//創(chuàng)建麥克風(fēng)采集器
this.microphoneCapturer = CapturerFactory.CreateMicrophoneCapturer(int.Parse(this.textBox_mic.Text), sr);
this.microphoneCapturer.AudioCaptured += new ESBasic.CbGeneric<byte[]>(microphoneCapturer_AudioCaptured);
//創(chuàng)建聲音播放器
this.audioPlayer = PlayerFactory.CreateAudioPlayer(int.Parse(this.textBox_speaker.Text), (int)sr, channelCount, 16, 2);                

this.microphoneCapturer.Start();

CreateVoicePreprocessor 方法的最后兩個(gè)參數(shù)可以指定在降噪的同時(shí),是否開(kāi)啟靜音檢測(cè)和自動(dòng)增益功能。

2. 預(yù)處理語(yǔ)音數(shù)據(jù)

語(yǔ)音預(yù)處理器每次處理10ms的聲音數(shù)據(jù),而現(xiàn)在的麥克風(fēng)采集器每次采集的是20ms的PCM數(shù)據(jù),所以,我們將其拆成兩個(gè)10ms數(shù)據(jù),再提交給預(yù)處理器處理。

void microphoneCapturer_AudioCaptured(byte[] audioData)
{
    if (this.checkBox_enabled.Checked)
    {
        //麥克風(fēng)每次采集20ms數(shù)據(jù),降噪器每次處理10ms數(shù)據(jù)。
        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)通過(guò)一個(gè)CheckBox勾選框來(lái)實(shí)時(shí)控制是否啟用語(yǔ)音預(yù)處理,這樣在測(cè)試時(shí),就可以很方便的對(duì)比體驗(yàn)開(kāi)啟了語(yǔ)音預(yù)處理的效果。

(2)調(diào)用IVoicePreprocessor 的 Process 方法,就可以完成一幀語(yǔ)音數(shù)據(jù)(10ms)的預(yù)處理。如下所示:

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,表示檢測(cè)到該幀是靜音幀,于是,將內(nèi)置的10ms靜音幀 SlienceFrame 提交給播放器去播放。

3. 統(tǒng)計(jì)靜音幀數(shù)量

一個(gè)語(yǔ)音幀是10ms,那么1秒鐘就有100個(gè)語(yǔ)音幀,程序中,我們統(tǒng)計(jì)了上一秒出現(xiàn)了多少個(gè)靜音幀,并在UI左下方顯示出來(lái)。

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;
    //顯示上一秒靜音幀數(shù)量。
    this.label_silenceFrameCount.Text = delt.ToString();
}

實(shí)際測(cè)試時(shí)可以發(fā)現(xiàn),當(dāng)不說(shuō)話時(shí),UI實(shí)時(shí)顯示1秒鐘出現(xiàn)的靜音幀是100個(gè)。

到此這篇關(guān)于基于C#實(shí)現(xiàn)語(yǔ)音預(yù)處理的文章就介紹到這了,更多相關(guān)C#語(yǔ)音預(yù)處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#實(shí)現(xiàn)過(guò)濾sql特殊字符的方法集合

    C#實(shí)現(xiàn)過(guò)濾sql特殊字符的方法集合

    這篇文章主要介紹了C#實(shí)現(xiàn)過(guò)濾sql特殊字符的方法,以實(shí)例形式分析總結(jié)了C#針對(duì)SQL危險(xiǎn)字符的幾種常用的過(guò)濾技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-11-11
  • C#添加、獲取、刪除PDF附件實(shí)例代碼

    C#添加、獲取、刪除PDF附件實(shí)例代碼

    這篇文章主要介紹了如何在C#添加、獲取、刪除PDF附件,文中代碼非常詳細(xì),快來(lái)和小編一起學(xué)習(xí)吧
    2020-05-05
  • C# WebApi CORS跨域問(wèn)題解決方案

    C# WebApi CORS跨域問(wèn)題解決方案

    本篇文章主要介紹了C# WebApi CORS跨域問(wèn)題解決方案,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • c#反射機(jī)制學(xué)習(xí)和利用反射獲取類型信息

    c#反射機(jī)制學(xué)習(xí)和利用反射獲取類型信息

    反射(Reflection)是.NET中的重要機(jī)制,通過(guò)放射,可以在運(yùn)行時(shí)獲得.NET中每一個(gè)類型(包括類、結(jié)構(gòu)、接口和枚舉等)的成員,包括方法、屬性、事件,以及構(gòu)造函數(shù)等,還可以獲得每個(gè)成員的名稱、限定符和參數(shù)等,有了反射,即可對(duì)每一個(gè)類型了如指掌
    2014-01-01
  • 詳解MongoDB for C#基礎(chǔ)入門

    詳解MongoDB for C#基礎(chǔ)入門

    本篇文章主要介紹了MongoDB for C#基礎(chǔ)入門,具體介紹了c#中關(guān)于對(duì)MongoDB的連接,插入,查詢等,有需要的可以了解一下。
    2016-12-12
  • C#中用管理員身份運(yùn)行程序代碼實(shí)例

    C#中用管理員身份運(yùn)行程序代碼實(shí)例

    這篇文章主要介紹了C#中用管理員身份運(yùn)行程序代碼實(shí)例,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2015-02-02
  • C#實(shí)現(xiàn)的基于二進(jìn)制讀寫文件操作示例

    C#實(shí)現(xiàn)的基于二進(jìn)制讀寫文件操作示例

    這篇文章主要介紹了C#實(shí)現(xiàn)的基于二進(jìn)制讀寫文件操作,結(jié)合具體實(shí)例形式分析了C#以二進(jìn)制文件流形式針對(duì)文件進(jìn)行讀寫操作的相關(guān)技巧,需要的朋友可以參考下
    2017-07-07
  • C#影院售票系統(tǒng)畢業(yè)設(shè)計(jì)(4)

    C#影院售票系統(tǒng)畢業(yè)設(shè)計(jì)(4)

    這篇文章主要介紹了C#影院售票系統(tǒng)畢業(yè)設(shè)計(jì),學(xué)習(xí)內(nèi)容是總結(jié)銷售信息的保存以及加載銷售信息,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2015-11-11
  • c#動(dòng)態(tài)改變webservice的url訪問(wèn)地址

    c#動(dòng)態(tài)改變webservice的url訪問(wèn)地址

    這篇文章主要介紹了c#動(dòng)態(tài)改變webservice的url訪問(wèn)地址,需要的朋友可以參考下
    2014-03-03
  • C#使用RestSharp實(shí)現(xiàn)封裝常用的http請(qǐng)求方法

    C#使用RestSharp實(shí)現(xiàn)封裝常用的http請(qǐng)求方法

    這篇文章主要為大家詳細(xì)介紹了C#如何使用RestSharp實(shí)現(xiàn)封裝常用的http請(qǐng)求方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2024-02-02

最新評(píng)論