在录制用户语音时,我想知道他/她何时停止通话以结束录制并将音频文件发送到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中获得正确的响应。
答案 0 :(得分:0)
如果您对卷感兴趣,那么GetSpectrumData
实际上并不是您想要的。它用于频率分析并返回-顾名思义-频谱,以便在给定频率范围内哪个频率有多好。
您想使用的是GetOutputData
,afaik返回一个从-1
到1
具有振幅的数组。因此,您必须对所有值求平方,求平均值并取结果的平方根(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,则表示有很大的噪音,除此之外,它是静音!