Установить порог молчания при использовании SpeechRecognitionEngine - PullRequest
0 голосов
/ 23 апреля 2019

При использовании класса SpeechRecognitionEngine в пространстве имен System.Speech.Recognition платформы .NET, ввод, который я бы рассматривал как тишину (пиковая амплитуда примерно -30 дБFS или менее в аудио от SpeechRecognizedEventArgs.Result.Audio) часто распознается как фраза из загруженной грамматики с высокой достоверностью (90% или выше).

Можно ли установить порог амплитуды / громкости, ниже которого входные данные будут игнорироваться и / или считаться бесшумными? Молчание во время текущего распознавания, например, паузы между словами, в порядке, но события распознавания не должны вызываться в течение периодов, когда все входные данные ниже порога амплитуды.

Есть несколько свойств, связанных с таймаутами молчания (InitialSilenceTimeout, EndSilenceTimeout и EndSilenceTimeoutAmbiguous), но я не смог найти ничего, связанного с определением характеристик самой тишины.

1 Ответ

0 голосов
/ 07 мая 2019

В итоге я использовал RecognizedAudio.WriteToAudioStream(), чтобы получить аудиоданные, связанные с каждым распознаванием, и выполнить проверку порога самостоятельно.

// Given a variable "args" of type System.Speech.Recognition.SpeechRecognizedEventArgs:
var stream = new MemoryStream();
args.Result.Audio.WriteToAudioStream(stream); // args.Result.Audio is of type RecognizedAudio.

// The RecognizedAudio documentation doesn't specify the format used by WriteToAudioStream.
// Inspection of the wave files produced by RecognizedAudio.WriteToWaveStream indicates they're 16-bit mono (at least on my machine).
// WriteToAudioStream writes the same data as WriteToWaveStream, just without the wave header.

byte[] bytes = stream.ToArray();
short[] samples = new short[bytes.Length / 2]; // Half the length because two bytes store one int16.
Buffer.BlockCopy(bytes, 0, samples, 0, bytes.Length);

// Check if peak amplitude exceeds a silence threshold. In my case:
// - Find the maximum absolute value in "samples".
// - Convert it to dBFS (20.0*Math.Log10(peak)).
// - Only react to recognition events with a peak in excess of -24 dBFS.
...