我需要将音频数据从麦克风流式传输到 REST 服务器。
我正在使用专有的 ASR 引擎,需要收集数据,然后通过对 PostAsync 的一次调用实时流式传输它 在线查看,我发现有关 PushStreamContent 的文章,但要么我没有正确使用它 我不明白我的意思我在做(或两者兼而有之)。
我有一个名为 stream_memory 的 MemoryStream,我不断地从主线程向其中写入数据,并且我想在数据流式传输时读取它,并在单个帖子中实时发布。在下面的示例中,我还使用了事件 stream_data_event 和对象锁来防止多个线程同时写入 MemoryStream。每次读取时我都会清除内存流,因为之后我不需要数据。
这是我在自己的线程中运行的代码片段:
http_client = new HttpClient();
http_client.http_client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*"));
http_client.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Language", "en-us");
http_client.DefaultRequestHeaders.TransferEncodingChunked = true;
HttpContent content = new System.Net.Http.PushStreamContent(async (stream, httpContent, transportContext) =>
{
while (stream_data_event.WaitOne())
{
lock (main_window.stream_memory_lock)
{
stream_data_event.Reset();
long write_position = main_window.stream_memory.Position;
main_window.stream_memory.Seek(0, SeekOrigin.Begin);
main_window.stream_memory.CopyTo(stream, (int)write_position);
main_window.stream_memory.Position = 0;
}
}
});
content.Headers.TryAddWithoutValidation("Content-Type", "audio/L16;rate=8000");
string request_uri = String.Format("/v1/speech:recognize");
HttpResponseMessage response = await http_client.PostAsync(request_uri, content);
string http_result = await response.Content.ReadAsStringAsync();
对 PostAsync 的调用按预期调用 PushStreamContent 的代码。但是,只要我在 while 循环中,就不会向服务器发送任何内容(在 wireshark 上检查)。如果我在调试器中手动退出循环并在流上调用 close,则 PostAsync 存在,但没有任何内容发送到服务器。
我需要有一种方法可以在 PostAsync 中继续流式传输信息,并在音频到达时让数据输出。
有任何想法吗?