c# - 如果扬声器远离麦克风,Google Speech/NAudio 会有很大的延迟
问题描述
我正在使用谷歌语音 api 和 NAudio(使用 NAudio WaveInEvent 类)对文本进行语音。像这样:https ://cloud.google.com/speech-to-text/docs/streaming-recognize?hl=en (“在音频流上执行流式语音识别”的 C# 示例)
如果说话的人靠近麦克风,一切都会很好而且很快。但是如果说话的人离麦克风很远,他的前 3-5 个单词就无法识别。之后,其他单词被很好地识别。(所以它不可能是距离的一般问题)更像是距离的适应问题,或者可能 NAudio 没有以 100% 的音量输入进行录制。
对这个问题有什么想法吗?
编辑:这是要求的代码:
static async Task<object> StreamingMicRecognizeAsync(int seconds)
{
if (NAudio.Wave.WaveIn.DeviceCount < 1)
{
Console.WriteLine("No microphone!");
return -1;
}
var speech = SpeechClient.Create();
var streamingCall = speech.StreamingRecognize();
// Write the initial request with the config.
await streamingCall.WriteAsync(
new StreamingRecognizeRequest()
{
StreamingConfig = new StreamingRecognitionConfig()
{
Config = new RecognitionConfig()
{
Encoding =
RecognitionConfig.Types.AudioEncoding.Linear16,
SampleRateHertz = 16000,
LanguageCode = "en",
},
InterimResults = true,
}
});
// Print responses as they arrive.
Task printResponses = Task.Run(async () =>
{
while (await streamingCall.ResponseStream.MoveNext(
default(CancellationToken)))
{
foreach (var result in streamingCall.ResponseStream
.Current.Results)
{
foreach (var alternative in result.Alternatives)
{
Console.WriteLine(alternative.Transcript);
}
}
}
});
// 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;
streamingCall.WriteAsync(
new StreamingRecognizeRequest()
{
AudioContent = Google.Protobuf.ByteString
.CopyFrom(args.Buffer, 0, args.BytesRecorded)
}).Wait();
}
};
waveIn.StartRecording();
Console.WriteLine("Speak now.");
await Task.Delay(TimeSpan.FromSeconds(seconds));
// Stop recording and shut down.
waveIn.StopRecording();
lock (writeLock) writeMore = false;
await streamingCall.WriteCompleteAsync();
await printResponses;
return 0;
}
来源:https ://cloud.google.com/speech-to-text/docs/streaming-recognize?hl=en
解决方案
是的,事情就是这样运作的。引擎使用对声级的适应,如果水平太低,他们会简单地错过第一个单词,并且只有在适应后才会开始识别。准确率会低于预期。
为了解决这个问题 - 使用更先进的麦克风阵列,它将跟踪像 Respeaker 或 Matrix 这样的音频源,并且可能使用自定义语音识别系统,该系统对快速音频电平变化更加稳健。它也会比 Google API 便宜。
推荐阅读
- wso2-am - 在 wso2 api 管理器中配置负载平衡后 devportal api url 中的问题
- c++ - vscode 调试器太复杂
- algorithm - 如何处理保存和加载文件的不同版本?
- influxdb - InfluxDB 为数据可视化添加额外的列
- r - 无法将日期从因子更改为日期格式,我不知道为什么
- logstash - Logstash 输出文件 json 未格式化
- c# - 序列化具有依赖关系的类
- php - Symfony 5 对象未在除主页外的所有页面上找到
- maven - 如何从源代码构建 rabbitmq-java-client?
- python - 如何避免为每个脚本创建 Spark Session