繁体   English   中英

如何将实时音频 stream 端点连接到直线语音端点?

[英]How to hook real-time audio stream endpoint to Direct Line Speech Endpoint?

我正在尝试将产生连续音频 stream 的实时音频端点与最终与我的 Azure 机器人 Z8A5DA52ED126447D359E70C05721A 交互的直线语音 (DLS) 端点连接起来。

我有一个 websocket API 可以连续接收二进制格式的音频 stream,这就是我打算将其转发到 DLS 端点以使用我的机器人连续 Speech2Text 的内容。

根据此处的反馈和回答,我已经能够将我的 Direct Line 语音端点与实时 stream 连接起来。

我已经尝试了一个示例 wav 文件,该文件正确地被 DLS 转录,并且我的机器人能够正确地检索文本以对其进行操作。

我使用了ListenOnce() API并使用PushAudioInputStream方法将音频 stream 推送到 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 
    }
}

但是上面的代码不起作用。 我相信我对这种方法有几个问题/疑问 -

  1. 我相信我没有正确地将数据分块到 Direct Line Speech 以确保它接收完整的音频以进行正确的 S2T 转换。
  2. 我知道 DLS API 支持ListenOnceAsync()但不确定这是否支持 ASR(它知道另一边的扬声器何时停止说话)
  3. Can I just get the websocket url for the Direct Line Speech endpoint and assume DLS correctly consumes the direct websocket stream?

我相信我没有正确地将数据分块到 Direct Line Speech 以确保它接收完整的音频以进行正确的 S2T 转换。

DialogServiceConnector.ListenOnceAsync将一直监听到 stream 关闭(或检测到足够的静音) 您不会关闭 stream ,除非您在 using 块结束时将其丢弃。 您可以等待ListenOnceAsync ,但您必须确保先关闭 stream。 If you don't await ListenOnceAsync then you can close the stream whenever you want, but you should probably do it as soon as you finish writing to the stream and you have to make sure you don't dispose of the stream (or the config ) 在ListenOnceAsync有机会完成之前。

您还想确保ListenOnceAsync获得完整的话语。 如果您一次只接收 4 个字节,那么这肯定不是完整的话语。 如果您想将块保持在 4 个字节,那么在该循环的多次迭代期间保持ListenOnceAsync运行可能是一个好主意,而不是每获得 4 个字节就一遍又一遍地调用它。

我知道 DLS API 支持 ListenOnceAsync() 但不确定这是否支持 ASR(它知道另一边的扬声器何时停止说话)

我认为您必须确定扬声器何时停止在客户端说话,然后从您的 WebSocket 收到一条消息,指示您应该关闭音频 stream 的ListenOnceAsync

看起来ListenOnceAsync确实支持 ASR。

Can I just get the websocket url for the Direct Line Speech endpoint and assume DLS correctly consumes the direct websocket stream?

你可以试试,但我自己不会这么认为。 Direct Line Speech 仍处于预览阶段,我不希望兼容性变得容易。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM