Я хочу использовать 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;
}