Я пытаюсь добиться прямой транскрипции телефонного разговора, используя сервисы 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
с помощью метода static
AudioSystem.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 поступает из телефонного разговора, поэтому, даже если вы используете 16Khz, вы хотите установить его для узкополосной модели, например en-US_NarrowbandModel
Да, я использую
en-US_NarrowbandModel
. Есть ли еще что-нибудь, на что мне следует обратить внимание?