首页 > 解决方案 > 将数据从 Socket.io 写入 Google Cloud Storage

问题描述

我在我的 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()被调用。任何帮助将不胜感激。谢谢

标签: node.jsreact-nativesocket.iogoogle-cloud-storage

解决方案


推荐阅读