检查麦克风是否静音

时间:2019-09-19 10:34:24

标签: unity3d

在录制用户语音时,我想知道他/她何时停止通话以结束录制并将音频文件发送到Google语音识别API。

我在这里找到了该线程,并尝试使用它的解决方案,但是我总是从5.004574E-08的频谱数据平均值中得到相同的值: Unity - Microphone check if silent

这是我用来获取GetSpectrumData值的代码:

public void StartRecordingSpeech()
    {
        //If there is a microphone
        if (micConnected)
        {
            if (!Microphone.IsRecording(null))
            {
                goAudioSource.clip = Microphone.Start(null, true, 10, 44100); //Currently set for a 10 second clip max
                goAudioSource.Play();
                StartCoroutine(StartRecordingSpeechCo());
            }
        }
        else
        {
            Debug.LogError("No microphone is available");
        }
    }

IEnumerator StartRecordingSpeechCo()
    {
        while (Microphone.IsRecording(null))
        {
            float[] clipSampleData = new float[128];
            goAudioSource.GetSpectrumData(clipSampleData, 0, FFTWindow.Rectangular);
            Debug.Log(clipSampleData.Average());
            yield return null;
        }
    }

PS:我能够记录用户的语音,将其保存并从语音识别api中获得正确的响应。

2 个答案:

答案 0 :(得分:0)

如果您对感兴趣,那么GetSpectrumData实际上并不是您想要的。它用于频率分析并返回-顾名思义-频谱,以便在给定频率范围内哪个频率有多好。


您想使用的是GetOutputData,afaik返回一个从-11具有振幅的数组。因此,您必须对所有值求平方,求平均值并取结果的平方根(source

float[] clipSampleData = new float[128];
goAudioSource.GetOutputData(clipSampleData, 0);

Debug.Log(Mathf.Sqrt(clipSampleData.Select(f => f*f).Average()));

答案 1 :(得分:0)

以下方法对我有用。它检测麦克风的音量,将其变为分贝。它不需要播放录制的音频或其他任何内容。 (贷记到统一答案中的这个旧主题:https://forum.unity.com/threads/check-current-microphone-input-volume.133501/)。

    public float LevelMax()
        {
            float levelMax = 0;
            float[] waveData = new float[_sampleWindow];
            int micPosition = Microphone.GetPosition(null) - (_sampleWindow + 1); // null means the first microphone
            if (micPosition < 0) return 0;
            goAudioSource.clip.GetData(waveData, micPosition);
            // Getting a peak on the last 128 samples
            for (int i = 0; i < _sampleWindow; i++)
            {
                float wavePeak = waveData[i] * waveData[i];
                if (levelMax < wavePeak)
                {
                    levelMax = wavePeak;
                }
            }
float db = 20 * Mathf.Log10(Mathf.Abs(levelMax));
            return db;
        }

在我的情况下,如果该值大于-40,则表示用户正在讲话!如果其值为0或大于0,则表示有很大的噪音,除此之外,它是静音!