Я работаю над проектом, в котором пользователь может выполнить какое-либо действие с голосом, обнаруженным датчиком 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:
Я также новичок в переполнении стека, поэтому было бы неплохо, если бы вы могли дать мне подсказку о том, как задать лучший вопрос, спасибо!