Как преобразовать формат float32Array нативного звука, записанного в формате html5, в надлежащие байты для службы Google Speech-to-Text? - PullRequest
0 голосов
/ 25 мая 2019

Если вы будете следовать этому руководству: https://medium.com/ideas-at-igenius/delivering-a-smooth-cross-browser-speech-to-text-experience-b1e1f1f194a2 вам удастся создать процессор сценариев, к которому вы добавите прослушиватель

scriptProcessor = inputPoint.context.createScriptProcessor(bufferSize, in_channels, out_channels)
//...
scriptProcessor.addEventListener('audioprocess', streamAudioData)

Внутри обратного вызова, позвонив по этой строке: callback_param.inputBuffer.getChannelData(0) каждый получает javascript Float32Array, который при просмотре данных, кажется, содержит числа с плавающей запятой от -1,0 до + 1,0

Поэтому, передавая это на сервер, который, в свою очередь, передает его в службу Google Speech-To-Text, вы ничего не получаете (как и ожидалось)

Служба Google Speech-To-Text, по крайней мере в Python, для потокового ввода ожидает строку байтов в формате wav, которая содержит звук с указанной частотой (т. Е. 16000 Гц). Обратите внимание, что если в бэкэнде вы транслируете файл, это работает нормально.

Это преобразование не удалось: Float32Array -> Int16Array -> byte-string

Кто-нибудь находил, какие преобразования подходят для работы вышеупомянутого?

В качестве альтернативы вам известен более простой и надежный путь для: микрофона в браузере -> потоковой передачи данных через веб-сокет на внутренний сервер -> потоковой передачи данных в службу речевого ввода Google -> получения ответов, как и ожидалось?


Редактировать: добавление кода Python для распознавания конфигурации Google speech api

config = types.RecognitionConfig(
        encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16,
        sample_rate_hertz=16000,
        language_code=self.language_code)

1 Ответ

1 голос
/ 26 мая 2019

Хорошо, немного покопался, нашел актуальную документацию , в которой есть правильная информация.

LINEAR16 - несжатые 16-разрядные знаковые семплы с прямым порядком байтов (Linear PCM).

Ключевые части:

  • 16 бит на выборку
  • Подпись
  • Little-младшему

Итак, вам нужно масштабировать значения с плавающей запятой (-1.0 ... 1.0) до целых чисел от -32786 до 32767.

Нет встроенного метода JavaScript, который бы сделал это для вас. Ваши преобразования между Float32Array и Int16Array не работают, потому что вы просто получите значения, приблизительно равные -1, 0 и 1. Другая причина, по которой вы не можете использовать Int16Array, заключается в том, что его порядковый номер зависит от платформы !

Что вам нужно сделать, так это освоиться с ArrayBuffers и манипулировать ими с помощью DataView . Возьмите каждый образец, сделайте немного математики, запишите байты, перейдите к следующему примеру. Когда вы закончите, и XHR, и Fetch API поддерживают отправку ArrayBuffer в качестве тела HTTP-запроса. Или вы можете создать новый Blob с этим ArrayBuffer и делать с ним другие вещи.

...