在语音识别期间检测用户语音的分贝级别? (使用Kinect SDK)

时间:2019-05-22 14:13:23

标签: c# speech-recognition kinect-sdk decibel

我正在研究一个项目,在该项目中,用户可以用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。但是我不知道它们的含义是什么,再加上我希望声音越大,我得到的值将接近零,但这种情况不会一直发生,似乎是随机的。

编辑: 我也是堆栈溢出的新手,所以如果您能给我一些有关如何提出更好的问题的提示,那就太好了,谢谢!

0 个答案:

没有答案