Unity - 麦克风检查是否静音

时间:2016-12-01 14:24:03

标签: c# audio unity3d unity5 recording

我们使用在Unity中录制音频的标准方法:

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

其中_sendingClip是AudioClip,_device是设备名称。

我想知道用户何时停止说话,这可能发生在2秒后,甚至是10秒。

我查看了不同的来源以找到答案,但找不到答案:

这个想法是,当用户停止说话时,音频会毫无延迟地发送到语音识别服务器,并且当用户还在讲话时没有音频被切断。

解决方案不需要采用代码格式。看哪里的方向很好。

2 个答案:

答案 0 :(得分:2)

您可以将录音音频片段发送到AudioSource并使用以下方式播放:

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

播放时,您可以从音频中获取SpectrumData。当用户说话时,频谱数据将显示更多峰值。您可以检查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方法,spectrumdata将是最后一帧的spectrumdata。所以它将接近实时。

最低级别可以通过录制无声录音来确定,您可以在用户需要讲话之前或以设置方式录制。

使用此解决方案,用户将听到自己说话,您可以将音频源的输出设置为audiomixer,并将该音量设置为-80。因此它仍然会识别数据,但不会将声音输出给用户。在audioSource上将音量设置为0将给出0 spectrumdata,因此在这种情况下使用audiomixer。

答案 1 :(得分:0)

使用音频时总会有延迟。

您是否要求每次用户停止讲话时都将剪辑录制并发送到SRS?或者在没有收到语音输入的'x'时间后? (要考虑的事情)

以下是关于这个主题的正确读物:https://support.unity3d.com/hc/en-us/articles/206485253-How-do-I-get-Unity-to-playback-a-Microphone-input-in-real-time-

抱歉,我无法提供更多帮助 - 希望您找到解决方案!