Я пишу бот 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.