Полезные данные Twilio Base64 Media для Google Speech To Text API не отвечают - PullRequest
0 голосов
/ 14 апреля 2020

Мне нужно сделать некоторые транскрипции в реальном времени из телефонных звонков twilio с помощью API речи в текст Google, и я следил за несколькими демонстрационными приложениями, показывающими, как это настроить. Мое приложение в. net core 3.1, и я использую webhooks с определенным методом обратного вызова Twilio. После извлечения мультимедиа из Twilio с помощью обратного вызова, он передается как необработанный звук в кодировке base64, как вы можете видеть здесь.

https://www.twilio.com/docs/voice/twiml/stream

Я ссылался на это демо на Live транскрипции , а также пытаюсь имитировать c оператор case в c#. Все подключается правильно, а медиа и полезные данные передаются в мое приложение из Twilio.

Строка аудио затем преобразуется в байт [] для передачи Задаче, которая должна транскрибировать звук

 byte[] audioBytes = Convert.FromBase64String(info);

Я следую примерам, основанным на документах Google, которые либо транслируются из файла или аудиовхода (например, микрофона). Если мой вариант использования отличается, у меня уже есть байты для каждой порции аудио. Примеры, на которые я ссылался, можно увидеть здесь. Транскрибирование аудио с потокового ввода

Ниже приведена моя реализация последнего, хотя и используются необработанные аудио байты. Эта задача ниже выполняется, когда соединение веб-сокета Twilio достигает события мультимедиа. Я передаю полезную нагрузку прямо в нее. Из журнала консоли я попадаю в журнал "Ответы на печать", нажав ... журнал консоли, но он НЕ попадет в блок while (await responseStream.MoveNextAsync()) и не запишет запись в консоль. Я не получаю никаких ошибок назад (которые ломают приложение.) Это возможно даже сделать? Я также попытался загрузить байты в объект потока памяти и передать их, как это делают примеры из Google c.

    static async Task<object> StreamingRecognizeAsync(byte[] audioBytes)
    {

        var speech = SpeechClient.Create();
        var streamingCall = speech.StreamingRecognize();
        // Write the initial request with the config.
        await streamingCall.WriteAsync(
            new StreamingRecognizeRequest()
            {
                StreamingConfig = new StreamingRecognitionConfig()
                {
                    Config = new RecognitionConfig()
                    {
                        Encoding =
                        RecognitionConfig.Types.AudioEncoding.Mulaw,
                        SampleRateHertz = 8000,
                        LanguageCode = "en",

                    },
                    InterimResults = true,
                    SingleUtterance = true
                }
            }); ;
        // Print responses as they arrive.
        Task printResponses = Task.Run(async () =>
        {
            Console.WriteLine("Print Responses hit...");
            var responseStream = streamingCall.GetResponseStream();

            while (await responseStream.MoveNextAsync())
            {
                StreamingRecognizeResponse response = responseStream.Current;
                Console.WriteLine("Response stream moveNextAsync Hit...");
                foreach (StreamingRecognitionResult result in response.Results)
                {
                    foreach (SpeechRecognitionAlternative alternative in result.Alternatives)
                    {
                        Console.WriteLine("Google transcript " + alternative.Transcript);
                    }
                }
            }
        });
        //using (MemoryStream memStream = new MemoryStream(audioBytes))
        //{
        //    var buffer = new byte[32 * 1024];
        //    int bytesRead;
        //    while ((bytesRead = await memStream.ReadAsync(audioBytes, 0, audioBytes.Length)) > 0)
        //    {
        //        await streamingCall.WriteAsync(
        //            new StreamingRecognizeRequest()
        //            {
        //                AudioContent = Google.Protobuf.ByteString
        //                .CopyFrom(buffer, 0, bytesRead),
        //            });
        //    }
        //}

        await streamingCall.WriteAsync(
                   new StreamingRecognizeRequest()
                   {
                       AudioContent = Google.Protobuf.ByteString
                       .CopyFrom(audioBytes),
                   });
        await streamingCall.WriteCompleteAsync();
        await printResponses;
        return 0;
    }

1 Ответ

0 голосов
/ 25 апреля 2020

После всего этого я обнаружил, что этот код работает нормально, его просто нужно разбить и вызывать в различных событиях в жизненном цикле потока Twilio. Раздел конфигурации должен быть размещен во время подключенного события. Задача печати сообщений должна быть помещена в медиа-событие. Затем WriteCompleteAsyn c необходимо поместить в событие остановки, когда веб-сокет закрыт из Twilio.

Еще одним важным моментом, который следует учитывать, является количество запросов, отправляемых в Google STT, чтобы убедиться, что слишком большое количество запросов не перегружает квоту, которая, по-видимому, составляет (на данный момент) 300 запросов в минуту.

...