2016-12-01 31 views
2

我們使用記錄音頻的標準方法,在Unity麥克風檢查:團結 - 如果沉默

_sendingClip = Microphone.Start(_device, true, 10, 16000);

其中_sendingClip是音頻剪輯和_device是設備名稱。

我想知道,當用戶停止說話,它可以發生2秒,甚至10

我看了不同的來源來尋找答案,但無法找到一個後:

這個想法是,當用戶停止說話時,音頻被髮送到語音識別服務器而沒有延遲,並且當用戶仍在講話時沒有音頻被切斷。

解決方案不需要採用代碼格式。在哪裏尋找的一般方向會很好。

+0

那麼我們如何知道用戶是否停止說話?可能當波的振幅下降到某個閾值以下時。 – bpgeck

回答

2

您可以錄製音頻剪輯發送到的AudioSource和使用播放:

audioSource.clip = Microphone.Start(_device, true, 60, 16000); 
while (!(Microphone.GetPosition(null) > 0)) { } 
audioSource.Play(); 

當它播放時,可以從聲音得到SpectrumData。當用戶說話時,頻譜數據將顯示更多峯值。您可以檢查SpectrumData音頻的平均值以確定是否有人在說話。你應該設置某種最低級別,因爲你可能會在錄音中產生一些噪音。如果頻譜數據的平均值高於確定的水平,則有人在說話,如果低於該水平,則用戶停止說話。

float[] clipSampleData = new float[1024]; 
bool isSpeaking=false; 

void Update(){ 
    audioSource.GetSpectrumData(clipSampleData, 0, FFTWindow.Rectangular); 
    float currentAverageVolume = clipSampleData.Average(); 

    if(currentAverageVolume>minimumLevel){ 
     isSpeaking=true 
    } 
    else if(isSpeaking){ 
     isSpeaking=false; 
     //volume below level, but user was speaking before. So user stopped speaking 
    } 
} 

您可以在Update方法中放入該檢查,頻譜數據將是最後一幀的頻譜數據。所以它將接近實時。

最低等級可以通過只記錄沉默的東西來確定,您可以在用戶需要說話之前或者以一種設置方式來確定。

使用此解決方案,用戶會聽到自己說話,您可以將audiosource的輸出設置爲audiomixer,並將該音量設置爲-80。所以它仍然會識別數據,但不會將聲音輸出給用戶。在audioSource上將音量設置爲0將會給出0個頻譜數據,因此在這種情況下使用audiomixer。