我们使用在Unity中录制音频的标准方法:
_sendingClip = Microphone.Start(_device, true, 10, 16000);
其中_sendingClip是AudioClip,而_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

  • 这个想法是,当用户停止讲话时,音频将被无延迟地发送到语音识别服务器,并且当用户仍在讲话时不会中断音频。

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

    最佳答案

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

    最低音量可以通过只录制无声的内容来确定,您可以在用户需要讲话之前以某种方式录制,也可以以一种设置的方式来确定。

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

    10-08 00:38