Записать данные из Socket.io в Google Cloud Storage - PullRequest
1 голос
/ 28 мая 2020

Я получаю аудиоданные из этого пакета в моем проекте React Native, а затем отправляю фрагменты данных через socket.io на свой Node.js сервер.

AudioRecord.on('data', data => {
        // base64-encoded audio data chunks
        const binary = Buffer.from(data, 'base64').toString('utf-8')
        socketClient.io.emit('binaryData', binary)
    })

Данные, которые получает мой сервер, доступны для чтения, потому что я отправляю эти данные через это преобразование в службу распознавания речи, которая возвращает точные результаты.

const speechAudioInputStreamTransform = new Transform({
    transform: (chunk, encoding, callback) => {
        if (newStream && lastAudioInput.length !== 0) {
            // Approximate math to calculate time of chunks
            const chunkTime = streamingLimit / lastAudioInput.length
            if (chunkTime !== 0) {
                if (bridgingOffset < 0) {
                    bridgingOffset = 0
                }
                if (bridgingOffset > finalRequestEndTime) {
                    bridgingOffset = finalRequestEndTime
                }
                const chunksFromMS = Math.floor(
                    (finalRequestEndTime - bridgingOffset) / chunkTime
                )
                bridgingOffset = Math.floor(
                    (lastAudioInput.length - chunksFromMS) * chunkTime
                )

                for (let i = chunksFromMS; i < lastAudioInput.length; i++) {
                    if (recognizeStream) {
                        recognizeStream.write(lastAudioInput[i])
                    }
                }
            }
            newStream = false
        }

        audioInput.push(chunk)

        if (recognizeStream) {
            recognizeStream.write(chunk)
        }

        callback()
    },
})

Однако, когда я записываю эти данные в Google Cloud Storage, файл сохраняется и содержит данные, но кажется поврежденным, так как его невозможно воспроизвести.

const { Storage } = require('@google-cloud/storage')
const storage = new Storage(storageOptions)
const bucket = storage.bucket(bucketName)
const file = filename + '.wav'
const storageFile = bucket.file.createWriteStream()

client.on('binaryData', (data) => {
        const buffer = Buffer.from(data)
        if (recognizeStream != null) {
            storageFile.write(buffer)
            speechAudioInputStreamTransform.write(buffer)
        }
    })

Когда пользователь на стороне RN завершает сеанс, вызывается storageFile.end(). Любая помощь будет принята с благодарностью. Спасибо

...