0

我需要将音频数据从麦克风流式传输到 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 中继续流式传输信息,并在音频到达时让数据输出。

有任何想法吗?

4

1 回答 1

0

事实证明,没有任何东西发送到服务器的原因与 wireshark 显示 HTTP 结果的方式有关。我的期望是,一旦请求被发送,我会立即在wireshark 中看到它。但是,wireshark 仅在请求完成后才显示请求,这意味着它在请求开始流式传输之后很长时间才显示。

在我意识到这一点之后,我可以看到正在发送到服务器的数据。

于 2018-11-20T06:11:46.140 回答