Unity - 麦克风检查是否静音
Unity - Microphone check if silent
我们在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
这个想法是,当用户停止说话时,音频会立即发送到语音识别服务器,并且不会在用户仍在说话时音频被切断。
解决方案不需要采用代码格式。最好有一个大概的方向。
处理音频时总会有延迟。
您是否要求在用户每次停止说话时录制并向 SRS 发送剪辑?或者在 'x' 没有收到语音输入的时间之后? (想一想)
这里有一篇关于这个主题的不错的读物:https://support.unity3d.com/hc/en-us/articles/206485253-How-do-I-get-Unity-to-playback-a-Microphone-input-in-real-time-
抱歉,我无法提供更多帮助 - 希望您能找到解决方案!
您可以将录制的音频片段发送到 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
}
}
你可以把这个检查放在更新方法中,频谱数据将是最后一帧的频谱数据。所以它会接近实时。
最低音量可以通过只录制一些无声的东西来确定,你可以在用户需要说话之前,或者以一种设置的方式来做。
使用此解决方案,用户将听到自己说话,您可以将 audiosource 的输出设置为 audiomixer,并将该音量设置为 -80。所以它仍然会识别数据,但不会向用户输出声音。在 audioSource 上将音量设置为 0 将给出 0 spectrumdata,因此在这种情况下使用 audiomixer。
我们在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
这个想法是,当用户停止说话时,音频会立即发送到语音识别服务器,并且不会在用户仍在说话时音频被切断。
解决方案不需要采用代码格式。最好有一个大概的方向。
处理音频时总会有延迟。
您是否要求在用户每次停止说话时录制并向 SRS 发送剪辑?或者在 'x' 没有收到语音输入的时间之后? (想一想)
这里有一篇关于这个主题的不错的读物:https://support.unity3d.com/hc/en-us/articles/206485253-How-do-I-get-Unity-to-playback-a-Microphone-input-in-real-time-
抱歉,我无法提供更多帮助 - 希望您能找到解决方案!
您可以将录制的音频片段发送到 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
}
}
你可以把这个检查放在更新方法中,频谱数据将是最后一帧的频谱数据。所以它会接近实时。
最低音量可以通过只录制一些无声的东西来确定,你可以在用户需要说话之前,或者以一种设置的方式来做。
使用此解决方案,用户将听到自己说话,您可以将 audiosource 的输出设置为 audiomixer,并将该音量设置为 -80。所以它仍然会识别数据,但不会向用户输出声音。在 audioSource 上将音量设置为 0 将给出 0 spectrumdata,因此在这种情况下使用 audiomixer。