【发布时间】:2019-10-09 01:10:00
【问题描述】:
我正在尝试将生成连续音频流的实时音频端点与最终与我的 Azure bot api 交互的 Direct Line Speech (DLS) 端点连接起来。
我有一个 websocket API,可以连续接收二进制格式的音频流,这就是我打算将它转发到 DLS 端点,以便与我的机器人连续使用 Speech2Text。
根据反馈和answer here,我已经能够将我的 Direct Line 语音端点与实时流连接起来。
我尝试了一个示例 wav 文件,该文件被 DLS 正确转录,并且我的机器人能够正确检索文本以对其进行操作。
我使用了ListenOnce() API 并且正在使用PushAudioInputStream 方法将音频流推送到DLS 语音端点。
下面的代码是 ListenOnce() 方法的内部代码
// Create a push stream
using (var pushStream = AudioInputStream.CreatePushStream())
{
using (var audioInput = AudioConfig.FromStreamInput(pushStream))
{
// Create a new Dialog Service Connector
this.connector = new DialogServiceConnector(dialogServiceConfig, audioInput);
// ... also subscribe to events for this.connector
// Open a connection to Direct Line Speech channel
this.connector.ConnectAsync();
Debug.WriteLine("Connecting to DLS");
pushStream.Write(dataBuffer, dataBuffer.Length);
try
{
this.connector.ListenOnceAsync();
System.Diagnostics.Debug.WriteLine("Started ListenOnceAsync");
}
}
}
上面代码中的dataBuffer是我在websocket上收到的二进制数据的“块”。
const int maxMessageSize = 1024 * 4; // 4 bytes
var dataBuffer = new byte[maxMessageSize];
while (webSocket.State == WebSocketState.Open)
{
var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(dataBuffer), CancellationToken.None);
if (result.MessageType == WebSocketMessageType.Close)
{
Trace.WriteLine($"Received websocket close message: {result.CloseStatus.Value}, {result.CloseStatusDescription}");
await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
}
else if (result.MessageType == WebSocketMessageType.Text)
{
var message = Encoding.UTF8.GetString(dataBuffer);
Trace.WriteLine($"Received websocket text message: {message}");
}
else // binary
{
Trace.WriteLine("Received websocket binary message");
ListenOnce(dataBuffer); //calls the above
}
}
但是上面的代码不起作用。我相信我对这种方法有几个问题/疑问 -
- 我认为我没有正确地将数据分块到 Direct Line Speech 以确保它接收完整的音频以进行正确的 S2T 转换。
- 我知道 DLS API 支持ListenOnceAsync(),但不确定它是否支持 ASR(它知道对方的发言者何时停止讲话)
- 我能否只获取 Direct Line Speech 端点的 websocket url 并假设 DLS 正确使用了直接 websocket 流?
【问题讨论】:
-
我有点困惑,因为您说您正在使用“PullAudioInputStreamCallback”方法来“推送”音频流,然后在代码中我看到您创建了一个推送流。你能说明你在哪里使用这个拉流吗?
-
我的错,我正在使用 PushAudioInputStream。前段时间我在尝试 Pull,但效果不佳。
-
我注意到这里有一些潜在的问题。您在没有等待的情况下调用
ConnectAsync,因此在您调用ListenOnceAsync时该任务可能无法完成(也无需等待)。然后,在给这些异步方法中的任何一个完成时间之前,您将同时处理输入流和音频配置。那会是你的问题吗?你只是说代码不起作用,所以我不知道你是看到错误消息还是什么。
标签: c# botframework microsoft-cognitive