我正在研究一个项目,在该项目中,用户可以用Kinect传感器检测到的声音进行一些操作。我想知道识别语音后是否可以在控制台上打印扬声器的语音电平值。
例如,如果Kinect识别出“ try”一词:
-----识别的单词:“ try” ---
声音级别= 60分贝
我是C#和语音识别的初学者,我进行了一些研究,发现这项任务非常困难。我将向您展示到目前为止我编写的部分代码,该部分位于SpeechRecognized事件中。告诉我是否需要有关代码的其他信息。
AudioBeamFrameList audioBeamFrames = reader.AcquireLatestBeamFrames();
using (audioBeamFrames)
{
AudioBeamFrame Frame = audioBeamFrames[0];
AudioBeamSubFrame subFrame = Frame.SubFrames[0];
subFrame.CopyFrameDataToArray(audioBuffer);
float energy = 0;
accumulatedSquareSum = 0;
for (int i = 0; i<audioBuffer.Length; i += BytesPerSample)
{
// Extract the 32-bit IEEE float sample from the byte array
float audioSample = BitConverter.ToSingle(audioBuffer, i);
accumulatedSquareSum += audioSample* audioSample;
}
float meanSquare = accumulatedSquareSum / (audioBuffer.Length / 4);
if (meanSquare > 0)
{
energy = (float) (10.0 * Math.Log10(meanSquare));
Console.WriteLine("voice level: {0} dB\n", energy);
}
}
audioBuffer在上面定义为: //分配1024个字节以容纳单个音频子帧。持续时间子帧 //为16毫秒,采样率为16khz,这意味着每个子帧256个采样。//每个采样有4个字节,即为1024个字节。 audioBuffer =新字节[audioSource.SubFrameLengthInBytes];
BytesPerSample为4。
使用此代码,我得到的值是-85,-90,-75 ecc。但是我不知道它们的含义是什么,再加上我希望声音越大,我得到的值将接近零,但这种情况不会一直发生,似乎是随机的。
编辑: 我也是堆栈溢出的新手,所以如果您能给我一些有关如何提出更好的问题的提示,那就太好了,谢谢!