c# - 我在 websocket 上获得响应时遇到问题
问题描述
我使用 websocket API 进行语音识别。我向服务器发送音频并收到响应。使用此 websocket API,可以在流式传输语音数据的同时获得语音识别结果。我可以得到最终的识别结果,但是我不能在途中得到识别结果。
下面显示了引用的代码。 https://gist.github.com/arjun-g/75961830d363cc9265e4ac2ca095168b
经过各种试验,我发现 line:85 是一个问题。这部分似乎在等待最终结果。
我可能在途中根本没有收到结果。
请告诉我为什么我不能在途中得到结果。
private async Task Connect(ClientWebSocket clientWebSocket)
{
CancellationTokenSource cts = new CancellationTokenSource();
clientWebSocket.Options.SetRequestHeader("Authorization", $"Bearer {this.accessToken}");
Uri connection = new Uri($"wss://hogehoge");
await clientWebSocket.ConnectAsync(connection, cts.Token);
}
以上是connect方法的一部分。
这是我的整个代码。
private async Task Connect(ClientWebSocket clientWebSocket)
{
CancellationTokenSource cts = new CancellationTokenSource();
clientWebSocket.Options.SetRequestHeader("Authorization", $"Bearer {this.accessToken}");
Uri connection = new Uri($"wss://hogehoge");
await clientWebSocket.ConnectAsync(connection, cts.Token);
}
static async Task SendAudio(ClientWebSocket ws)
{
ArraySegment<byte> closingMessage = new ArraySegment<byte>(Encoding.UTF8.GetBytes(
"{\"command\": \"recog-break\"}"
));
using (FileStream fs = File.OpenRead("audio.raw"))
{
byte[] b = new byte[3200];
while (fs.Read(b, 0, b.Length) > 0)
{
await ws.SendAsync(new ArraySegment<byte>(b), WebSocketMessageType.Binary, true, CancellationToken.None);
}
await ws.SendAsync(closingMessage, WebSocketMessageType.Text, true, CancellationToken.None);
}
}
// prints results until the connection closes or a delimeterMessage is recieved
private async Task HandleResults(ClientWebSocket ws)
{
var buffer = new byte[60000];
while (true)
{
var segment = new ArraySegment<byte>(buffer);
var result = await ws.ReceiveAsync(segment, CancellationToken.None);
if (result.MessageType == WebSocketMessageType.Close)
{
return;
}
int count = result.Count;
while (!result.EndOfMessage)
{
if (count >= buffer.Length)
{
await ws.CloseOutputAsync(WebSocketCloseStatus.InvalidPayloadData, "That's too long", CancellationToken.None);
return;
}
segment = new ArraySegment<byte>(buffer, count, buffer.Length - count);
result = await ws.ReceiveAsync(segment, CancellationToken.None);
count += result.Count;
}
var message = Encoding.UTF8.GetString(buffer, 0, count);
this.textBox2.AppendText(message);
}
}
private async void button1_Click_1(object sender, EventArgs e)
{
ClientWebSocket cws = new ClientWebSocket();
await this.Connect(cws);
await Task.WhenAll(SendAudio(cws), HandleResults(cws));
}
解决方案
推荐阅读
- react-native - react-native-i18n 模块与 expo 链接
- php - 检查 file_get_contents 因为超时而关闭
- c - 如何通过 fscanf 制作矩阵?
- r - 安装包不起作用:权限被拒绝
- php - 如何将 Twilio 与 Wordpress 连接以在桌面网站上发送应用程序链接
- javascript - 怎么修。[弃用] getCurrentPosition() 和 watchPosition() 不再适用于不安全的来源。
- sql - FnSplit 不适用于 SQL 存储过程以获取多个参数
- ms-access - 基于两个条件打开表单会导致类型不匹配错误
- django - django 通过选中复选框一次编辑多个 id
- java - Java打开文件过多异常