Как подключить конечную точку аудиопотока в реальном времени к конечной точке прямой линии речи? - PullRequest
1 голос
/ 09 октября 2019

Я пытаюсь подключить свою конечную точку аудио в реальном времени, которая создает непрерывный аудиопоток с конечной точкой Direct Line Speech (DLS), которая в конечном итоге взаимодействует с моим ботом API Azure.

У меня есть API веб-сокета, который постояннополучает аудиопоток в двоичном формате, и это то, что я намереваюсь направить в конечную точку DLS для непрерывного Speech2Text с моим ботом.

На основе обратной связи и ответа здесь , я смогчтобы соединить мою речевую конечную точку 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 в приведенном выше коде - это «кусок» двоичных данных, которые я получил на своем веб-сайте. cket.

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. Я считаю, что я не правильно распределяю данные по прямой линии речи, чтобы гарантировать, что они получают полный звук для правильного преобразования S2T.
  2. Я знаю, что DLS API поддерживает ListenOnceAsync () , но не уверен, поддерживает ли это ASR (он знает, когда говорящий на другой стороне перестал говорить)
  3. Могу ли я просто получить URL веб-сокета дляконечная точка Direct Line Speech и предполагается, что DLS правильно использует прямой поток веб-сокетов?

1 Ответ

1 голос
/ 23 октября 2019

Я полагаю, что неправильно распределяю данные в Direct Line Speech, чтобы гарантировать получение полного звука для правильного преобразования S2T.

DialogServiceConnector.ListenOnceAsync будет прослушивать, пока поток не будет закрыт (или обнаружена достаточная тишина) . Вы не закрываете свой поток, за исключением случаев, когда вы утилизируете его в конце своего блока использования. Вы можете подождать ListenOnceAsync, но сначала убедитесь, что закрыли поток. Если вы не ожидаете ListenOnceAsync, вы можете закрыть поток, когда захотите, но, вероятно, вам следует сделать это, как только вы закончите запись в поток, и вы должны быть уверены, что не избавляетесь от потока (илиКонфигурация) до того, как ListenOnceAsync успел завершиться.

Вы также хотите убедиться, что ListenOnceAsync получает полное высказывание. Если вы получаете только 4 байта за раз, тогда это определенно не полное высказывание. Если вы хотите, чтобы ваши чанки составляли 4 байта, то может быть хорошей идеей продолжать работу ListenOnceAsync в течение нескольких итераций этого цикла, а не вызывать его снова и снова для каждых 4 байтов, которые вы получаете.

Я знаю, что DLS API поддерживает ListenOnceAsync (), но не уверен, поддерживает ли он ASR (он знает, когда говорящий на другой стороне перестал говорить)

Я думаю, вам придется определить, когдаДинамик перестает говорить на стороне клиента, а затем получает сообщение от вашего WebSocket, указывающее, что вы должны закрыть аудиопоток на ListenOnceAsync.

Похоже, ListenOnceAsync поддерживает ASR.

Могу ли я просто получить URL веб-сокета для конечной точки прямой линии речи и предположить, что DLS правильно использует прямой поток веб-сокета?

Вы можете попробовать, ноЯ бы не предположил, что сам. Direct Line Speech все еще находится в предварительном просмотре, и я не ожидаю, что совместимость будет легкой.

...