Определить уровень децибела голоса пользователя во время распознавания речи?(используя Kinect SDK) - PullRequest
0 голосов
/ 22 мая 2019

Я работаю над проектом, в котором пользователь может выполнить какое-либо действие с голосом, обнаруженным датчиком Kinect. Я хочу знать, возможно ли напечатать значение уровня голоса говорящего на консоли при распознавании голоса.

Например, если kinect распознает слово «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 мсек, частота дискретизации составляет 16 кГц, что означает 256 выборок на субкадр .// С 4 байтами на выборку, что дает нам 1024 байта. audioBuffer = новый байт [audioSource.SubFrameLengthInBytes];

BytesPerSample равно 4.

С помощью этого кода я получаю значения, такие как -85, -90, -75 ecc. но я не знаю, каково их значение, плюс я ожидал, что более громким голосом я получу значение ближе к нулю, но это не происходит постоянно, это кажется случайным.

EDIT: Я также новичок в переполнении стека, поэтому было бы неплохо, если бы вы могли дать мне подсказку о том, как задать лучший вопрос, спасибо!

...