Java - как преобразовать InputStream в соответствующий формат для использования службы преобразования речи в текст IBM Watson?

Я пытаюсь добиться прямой транскрипции телефонного разговора, используя сервисы Nexmo и IBM Watson. Я установил веб-сокет для получения InputStream двоичного звука от Nexmo. Я также установил соединение через веб-сокет со службой преобразования речи в текст IBM Watson. Аудиопоток, который я получаю от Nexmo, имеет кодировку PCM с частотой 8 кГц или 16 кГц. Размер кадра каждого сообщения, полученного от Nexmo, составляет 20 мс.

Интерфейс Websocket IBM Watson Java SDK ожидает InputStream с правильной информацией о кодировке для успешной транскрипции. Ниже приведены способы кондиционирования данных, которые я пробовал:

  • Передайте необработанный InputStream, полученный от Nexmo, в Watson с помощью тип содержимого как "audio/l16; rate=16000; endianness=little-endian"
  • Получите объект AudioInputStream с помощью метода staticAudioSystem.getAudioInputStream(InputStream inputStream). Этот метод предположительно определяет формат входного потока и возвращает объект AudioStream.
  • Получите объект AudioStream, используя статический метод AudioSystem.getAudioInputStream(AudioFormat targetFormat, AudioInputStream sourceStream), передав следующий аргумент AudioFormat
    • audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 16, 1, AudioSystem.NOT_SPECIFIED, 16, 16000, true);

Но во всех вышеупомянутых попытках мне не удалось получить какую-либо транскрипцию от служб IBM. Я получаю ответ от IBM, что веб-сокет был подключен и находится в listening state, когда я впервые подключаюсь к службе. В облаке IBM нет доступных журналов, чтобы узнать, что происходит. Я читал форумы разработчиков SO и IBM, но не нашел подходящих примеров. Я совершенно убежден, что способ обработки данных, которые я получаю от Nexmo, не идеален для сервисов Watson. Как я могу должным образом обработать свои данные, чтобы транскрибировать речь с помощью IBM Watson?

Это мой очень упрощенный (для улучшения читабельности) образец кода (разные методы с различной функциональностью добавлены вместе)

// method to return Nexmo's NCCO, when the call is answered
public static String connectToWebSocket()
{
    JsonArray ncco = new JsonArray();

    JsonObject enclosingObject = new JsonObject();
    enclosingObject.addProperty("action", "connect");

    JsonObject webSocketEndpoint = new JsonObject();
    webSocketEndpoint.addProperty("type", "websocket");
    webSocketEndpoint.addProperty("uri", "ws://websocket-uri/call-stream");
    webSocketEndpoint.addProperty("content-type", "audio/l16;rate=16000");

    JsonObject header = new JsonObject();
    header.addProperty("app", "demo");

    webSocketEndpoint.add("header", header);

    JsonArray endpointArray = new JsonArray();
    endpointArray.add(webSocketEndpoint);

    enclosingObject.add("endpoint", endpointArray);

    ncco.add(enclosingObject);
    return ncco.toString();
}

// WebSocketController' onMessage method (receiving Nexmo's binary audio) 
@OnMessage
public void onMessage(InputStream inputStream, Session session)
{
    //transcriptionService.recognizeVoice(inputStream);
}

// IBMTransriptionService's recognizeVoice method
public void recognizeVoice(InputStream stream)
{
    if (stream == null) return;

    try
    {
        audioFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 16, 1, AudioSystem.NOT_SPECIFIED, 16, 16000, true);
        RecognizeOptions recognizeOptions = new RecognizeOptions.Builder().audio(new AudioInputStream(stream, audioFormat, 16))
            .contentType("audio/l16; rate=16000; endianness=little-endian")
            .interimResults(true)
            .build();

        this.speechToText.setEndPoint("https://gateway-syd.watsonplatform.net/speech-to-text/api");
        this.speechToText.recognizeUsingWebSocket(recognizeOptions, this.transcriptionReceiver);
    }
    catch (Exception e)
    {
        logger.error("Failed when creating audio stream" + e.getMessage());
    }
}

Дополнительные ссылки:

  • Это документация Nexmo, в которой подробно описаны форматы двоичного звука. передается через веб-сокет

    API преобразования речи в текст Watson Справка

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
191
1

Ответы 1

Какую модель вы используете для запроса к Ватсону? речь Nexmo поступает из телефонного разговора, поэтому, даже если вы используете 16Khz, вы хотите установить его для узкополосной модели, например en-US_NarrowbandModel

Да, я использую en-US_NarrowbandModel. Есть ли еще что-нибудь, на что мне следует обратить внимание?

Vino 28.08.2018 13:54

Другие вопросы по теме