2016-12-01 47 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。