Преобразование байтов из AudioOutput из Big Endian в Little Endian не транскрибируется Google Speech-to-Text - PullRequest
0 голосов
/ 12 апреля 2020

Я пишу бот Discord и пытаюсь реализовать какие-то команды распознавания голоса, используя API Google Cloud для преобразования речи в текст. Однако формат ввода звука для бота выглядит примерно так:

new AudioFormat(48000.0f, 16, 2, true, true); //Sample rate, SampleSizeInBits, Channels, Signed, BigEndian

У меня есть ByteArrayOutPutStream, где я объединяю все байтовые массивы из AudioInput

@Override
public void handleCombinedAudio(CombinedAudio combinedAudio) {
    try {
        audioChunk.write(combinedAudio.getAudioData(1.0)); //where 
        audioChunk = ByteArrayOutputStream
    } 
    catch (IOException e) {
        e.printStackTrace();
    }
}

После того, как была дана голосовая команда, и я закрываю ByteArrayOutputStream вручную, я конвертирую байты массив от Big Endian до Little endian с использованием байтового буфера и инициализации нового экземпляра речи Google. Клиент

audioReceiver.getAudioChunk().close();
ByteBuffer endianConvert = ByteBuffer.wrap(audioReceiver.audioChunk.toByteArray());
endianConvert.order(ByteOrder.LITTLE_ENDIAN);
SpeechManager sm = new SpeechManager(endianConvert.array());

Моя реализация API находится внутри класса SpeechManager, который я загрузил прямо здесь: https://pastebin.com/zSNU3pzs Проблема в том, что метод распознавания речи из API ничего не возвращает, а также не печатает никаких ошибок, он просто пропускает код (я предполагаю, что это потому, что байты из моего массива не получают прочитайте правильно после завершения, которое является Linear16, это является причиной преобразования Endian) Массив байтов не является нулевым, я отладил его arlead у. Мой вывод после того, как я пытаюсь запустить речевой клиент:

DEBUGGING: 1
DEBUGGING: 2
(here's there's a pause of about 5-10 seconds)
DEBUGGING: 3
DEBBUGING: 4

Не проблема с учетными данными API и прочим, потому что я попробовал его, используя файл .wav со своего компьютера, и это сработало. Я наверняка что-то напутал, пытаясь объединить bytes[] или преобразовать их в little-endian.

...