Как реализовать VAD с помощью Naudio? - PullRequest
0 голосов
/ 12 июня 2019

Я хочу использовать Naudio для получения звука с микрофона и отправки аудиоданных в API для распознавания речи. Как показано в исходном коде ниже, голосовые данные отправляются через веб-сокет. Текущая программа предназначена для остановки записи через 4 секунды после начала записи с помощью Task.Delay. Я хочу определить конец речи, так называемый VAD (определение голосовой активности), из состояния входа микрофона и отправить команду завершения recog-stop в API. Какой метод есть? Можно ли, например, использовать Naudio для определения громкости микрофона и остановки записи, когда входное усиление микрофона падает ниже определенного значения в течение определенного периода времени?

CSharp

private async Task Stream_SendVoice(ClientWebSocket ws)
{
    ArraySegment<byte> closingMessage = new ArraySegment<byte>(Encoding.UTF8.GetBytes(
    "{\"command\": \"recog-stop\"}"
    ));

    // Read from the microphone and stream to API.
    object writeLock = new object();
    bool writeMore = true;
    var waveIn = new NAudio.Wave.WaveInEvent();
    waveIn.DeviceNumber = 0;
    waveIn.WaveFormat = new NAudio.Wave.WaveFormat(16000, 1);
    waveIn.DataAvailable +=
        (object sender, NAudio.Wave.WaveInEventArgs args) =>
        {
            lock (writeLock)
            {
                if (!writeMore) return;
                ws.SendAsync(new ArraySegment<byte>(args.Buffer), WebSocketMessageType.Binary, true, CancellationToken.None);

            }
        };
    waveIn.StartRecording();
    this.textBox2.AppendText("Speak now.");
    await Task.Delay(TimeSpan.FromSeconds(4));
    await ws.SendAsync(closingMessage, WebSocketMessageType.Text, true, CancellationToken.None);

    // Stop recording and shut down.
    waveIn.StopRecording();
    lock (writeLock) writeMore = false;
}
...