API Nexmo Voice с веб-сокетами и azure когнитивными службами для перевода речи - PullRequest
0 голосов
/ 09 июля 2020

Я работаю над переводом речи, используя azure когнитивные сервисы для перевода речи. когда звонящий звонит на номер nexmo, я получаю его через веб-сокеты. Затем я использую azure речевой перевод, чтобы перевести текст в речь и записать его в сокет для ответа, когда вызов 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)
                    {
                    }
                }
            }

1 Ответ

1 голос
/ 09 июля 2020

похоже, что вы потенциально отправляете кусок аудио странного размера в конце вашего потока. Не уверен, где это вписывается в весь контекст вашего 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);
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...