Unity - 麦克风检查是不是静音

Posted

技术标签:

【中文标题】Unity - 麦克风检查是不是静音【英文标题】:Unity - Microphone check if silentUnity - 麦克风检查是否静音 【发布时间】:2016-12-01 14:24:02 【问题描述】:

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

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

其中_sendingClip 是音频剪辑,_device 是设备名称。

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

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

https://forum.unity3d.com/threads/check-current-microphone-input-volume.133501/ http://answers.unity3d.com/questions/137170/how-to-check-if-the-user-speak-to-microphone.html(但这个已经5岁多了) http://answers.unity3d.com/questions/1113690/microphone-input-in-unity-5x.html

这个想法是,当用户停止说话时,音频会立即发送到语音识别服务器,并且不会在用户仍在说话时中断音频。

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

【问题讨论】:

我们如何知道用户是否停止说话?可能是当波的幅度低于某个阈值时。 【参考方案1】:

您可以将录制的音频剪辑发送到 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方法中,spectrumdata将是最后一帧的spectrumdata。所以它将接近实时。

可以通过只录制一些无声的内容来确定最低级别,您可以在用户需要说话之前这样做,或者以某种设置的方式。

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

【讨论】:

什么是 minimumLevel 值? 这取决于环境声音。假设你在没有对着麦克风说话的情况下运行了 1 分钟。您可以在 1 分钟内获得平均 currentAverageVolume,该值可以是您的 minimumLevel 我得到了大约 0.0002 的值,所以当你保持沉默时它接近于 0,如果你说话的话,值会像 5 或 7 一样高 这意味着您处于一个非常安静的房间/环境中。如果说 5 或 7,我会把它放高一点。也许是 3?这也为您提供了一些空间,以防环境变得更加嘈杂。 (尽管您也可以在您的程序中添加某种步骤,允许您在游戏的某种启动步骤中重新设置最低级别) 是的,我进入了安静的房间是的,需要保留一些设置,以便我可以在开始时分析房间噪音并确认最小级别并继续【参考方案2】:

处理音频时总会有延迟。

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

这是一个不错的阅读主题:https://support.unity3d.com/hc/en-us/articles/206485253-How-do-I-get-Unity-to-playback-a-Microphone-input-in-real-time-

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

【讨论】:

以上是关于Unity - 麦克风检查是不是静音的主要内容,如果未能解决你的问题,请参考以下文章

如何在 webrtc 中将麦克风静音/取消静音

Swift 3:如何在使用 AVFoundation 录制视频期间将麦克风静音/取消静音

Swift AVAudioEngine - 如何使本地麦克风静音

在 Windows 7 上静音麦克风

OSX CoreAudio 麦克风输入静音与将音量设置为 0.0f

如何使用 Auriotouch 将麦克风的音频输入静音并仅识别设备的内部音频