我们使用在Unity中录制音频的标准方法:_sendingClip = Microphone.Start(_device, true, 10, 16000);
其中_sendingClip
是AudioClip,而_device
是设备名称。
我想知道用户何时停止说话,这种情况可能会在2秒甚至10秒后发生。
我查看了不同的来源以找到答案,但找不到答案:
这个想法是,当用户停止讲话时,音频将被无延迟地发送到语音识别服务器,并且当用户仍在讲话时不会中断音频。
解决方案不需要采用代码格式。一般看哪里的方向会很好。
最佳答案
您可以将录制的音频剪辑发送到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。