API-интерфейс Nexmo Voice с веб-сокетами и когнитивными службами Azure для перевода речи

Я работаю над речевым переводом, используя когнитивные службы Azure для речевого перевода. когда вызывающий абонент звонит на номер nexmo, я получаю его через веб-сокеты. Затем я использую лазурный речевой перевод для перевода текста в речь и записываю его в сокет для ответа на вызов nexmo, который просто отключается. Вот код, который я использую в веб-сокете:

      var configWait = SpeechConfig.FromSubscription(_appSettings.azurecognitiveservicespeech_subscriptionkey, "centralus");
            using (var audioOutputStream = AudioOutputStream.CreatePullStream())
            using (var output = AudioConfig.FromStreamOutput(audioOutputStream))
            using (var synthesizer1 = new SpeechSynthesizer(configWait, output))
            using (var resultWait = await synthesizer1.SpeakTextAsync("Please Wait while next representative is available."))
            {
                if (resultWait.Reason == ResultReason.SynthesizingAudioCompleted)
                {
                    var ttsAudio = resultWait.AudioData;
                    const int chunkSize = 320;
                    var chunkCount = 1;
                    var offset = 0;

                    var lastFullChunck = ttsAudio.Length < (offset + chunkSize);
                    try
                    {
                        while (!lastFullChunck)
                        {
                            await socket.SendAsync(new ArraySegment<byte>(ttsAudio, offset, chunkSize), result.MessageType, false, CancellationToken.None);
                            offset = chunkSize * chunkCount;
                            lastFullChunck = ttsAudio.Length < (offset + chunkSize);
                            chunkCount++;
                        }

                        var lastMessageSize = ttsAudio.Length - offset;
                        await socket.SendAsync(new ArraySegment<byte>(ttsAudio, offset, lastMessageSize), result.MessageType, true, CancellationToken.None);
                    }
                    catch (Exception ex)
                    {
                    }
                }
            }

person LiveSK    schedule 09.07.2020    source источник
comment
Добро пожаловать в Stack Overflow. Пожалуйста, уточните вопрос, который вы хотели бы задать.   -  person Alex Baban    schedule 09.07.2020


Ответы (1)


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

while (!result.CloseStatus.HasValue)
{
    byte[] audio;
    while(_audioToWrite.TryDequeue(out audio))
    {
        const int bufferSize = 640;
        for(var i = 0; i + bufferSize < audio.Length; i += bufferSize)
        {
            var audioToSend = audio[i..(i + bufferSize)];
            var endOfMessage = audio.Length > (bufferSize + i);
            await webSocket.SendAsync(new ArraySegment<byte>(audioToSend, 0, bufferSize), WebSocketMessageType.Binary, endOfMessage, CancellationToken.None);
        }                        
    }

    result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);

    _inputStream.Write(buffer);
}

Это из слегка измененной версии сообщения в блоге, которое я написал на эту тему. Исходный код можно найти в Гитхаб. Это не использует службы перевода, как вы, просто переводит прямую речь в текст, но это должно работать примерно так же. Вы также можете ознакомиться с запись в блоге.

person slorello    schedule 09.07.2020