我们使用在Unity中录制音频的标准方法:
_sendingClip = Microphone.Start(_device, true, 10, 16000);
其中_sendingClip
是AudioClip,_device
是设备名称。
我想知道用户何时停止说话,这可能发生在2秒后,甚至是10秒。
我查看了不同的来源以找到答案,但找不到答案:
这个想法是,当用户停止说话时,音频会毫无延迟地发送到语音识别服务器,并且当用户还在讲话时没有音频被切断。
解决方案不需要采用代码格式。看哪里的方向很好。
答案 0 :(得分:2)
您可以将录音音频片段发送到AudioSource并使用以下方式播放:
audioSource.clip = Microphone.Start(_device, true, 60, 16000);
while (!(Microphone.GetPosition(null) > 0)) { }
audioSource.Play();
播放时,您可以从音频中获取SpectrumData。当用户说话时,频谱数据将显示更多峰值。您可以检查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方法,spectrumdata将是最后一帧的spectrumdata。所以它将接近实时。
最低级别可以通过录制无声录音来确定,您可以在用户需要讲话之前或以设置方式录制。
使用此解决方案,用户将听到自己说话,您可以将音频源的输出设置为audiomixer,并将该音量设置为-80。因此它仍然会识别数据,但不会将声音输出给用户。在audioSource上将音量设置为0将给出0 spectrumdata,因此在这种情况下使用audiomixer。
答案 1 :(得分:0)
使用音频时总会有延迟。
您是否要求每次用户停止讲话时都将剪辑录制并发送到SRS?或者在没有收到语音输入的'x'时间后? (要考虑的事情)
以下是关于这个主题的正确读物:https://support.unity3d.com/hc/en-us/articles/206485253-How-do-I-get-Unity-to-playback-a-Microphone-input-in-real-time-
抱歉,我无法提供更多帮助 - 希望您找到解决方案!